Raspberry PiにSSHで公開鍵認証を使いたい!
RaspberryPi(通称ラズパイ)を家の中で常時起動して色々遊んでたのですが、遊びついでに今まで自分で設定したことがない「公開鍵認証」なるものを試してみようと思い、その備忘録。
最終的に実現すること
公開鍵認証を使って、MacからラズパイにSSHでログインする。
前知識
SSHのプロトコル
SSHにはプロトコルの違いにより、バージョン1とバージョン2の2種類あるようです。現在はバージョン2が推奨されているようです。これは、このあと設定ファイルの記述で関係してきます。
鍵認証
「秘密鍵」と「公開鍵」の2つが1セットになってます。秘密鍵はクライアント側に、公開鍵は接続するサーバー側に保存しておくようです。クライアント、サーバー側ともに複数の鍵を使い分ける事もできるようです。
暗号方式
鍵を暗号化するときの方式には、「RSA」「DSA」「ECDSA」などがあるようです。「RSA」というのがよく使われてるようで、「DSA」はやや古め。「ECDSA」はOpenSSHの5.7以降から利用可能とのこと。新しい方がより強固ってことみたい。
ssh -V
で、ラズパイのOpenSSHのバージョンが確認できます。
パスフレーズ
「秘密鍵」を開くための文字列のこと。サーバーへアクセスするときにパスワードの代わりに使用します。ナシでもOKではあります。
手順
1:公開鍵と秘密鍵のセットを作る
2:公開鍵をラズパイへ転送
3:公開鍵を書き換え
4:ラズパイの設定を変更
5:接続!
方法
どこで作業するかによってパスが違ってきますが、/Users/{ユーザー名}/でやることにします。
1:公開鍵と秘密鍵のセットを作る
ターミナルで、次のように入力。RSAならこんな感じ。
ECDSAならこんな感じ。(256の部分は鍵長で、256,384,521bitから選べます。512じゃなく521ので注意。)
ssh-keygen -t ecdsa -b 256
これを入力すると、続けて3つ入力待ちがきます。
・どこに保存するか デフォルトは/Users/{ユーザー名}/.ssh/id_{暗号方式}。
・パスフレーズの確認
保存先は特に変更する必要がなければそのままEnter。パスフレーズは任意の文字列を入力します。
これにより、.ssh以下にid_rsaとid_rsa.pub(id_ecdsaとid_ecdsa.pub)という2つのファイルが作られます。このうちの.pubの方が公開鍵です。
.sshというフォルダの下に作られるのでそのままではFinderで表示されませんが、Sierraでは「shift + command + .」で「.」付きの隠しファイルやフォルダが表示されます。
2:公開鍵をラズパイへ転送
ラズパイのユーザーは、初期状態でpi。パスワードはraspberryになってます。SSHも初期状態でこれで繋ぐことができるので、ひとまずこのユーザー情報を使ってラズパイに公開鍵を転送します。
転送にはscpというのを使います。これはsshを使ってファイルをおくるというコマンド。先ほど作った.ssh以下の公開鍵を、ラズパイの/home/pi/直下にとりあえず送ることにします。
3:公開鍵を書き換え
今転送した公開鍵id_rsa.pubをいじります。ここからはSSHでログインして作業するか、直接ラズパイにキーボードをつないで作業します。
ラズパイ側では、SSHで接続された際にそれに対応する公開鍵をauthorized_keysというファイルの中から探します。authorized_keysの中身は、公開鍵の中身がそのまま書かれています。そのため、authorized_keysというファイルがすでにあるかどうかによって作業内容がちょっと変わります。
初めて公開鍵を設置する場合
.sshというディレクトリを作り、公開鍵を移動してリネーム。ファイルの権限を変更します。
mkdir .ssh
mv ~/id_rsa.pub ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
追記の場合
既存のauthorized_keysに今回の公開鍵の中身を書き足します。
4:ラズパイの設定を変更
sshに関する設定は、ラズパイの/etc/ssh/sshd_configというファイルに記述します。同じ場所にssh_configというファイルがありますが、これはラズパイのsshクライアントとしての設定ファイルです。
今回は、次のような設定にしてみます。
パスワードによる認証は拒否
PasswordAuthentication
yes → no
公開鍵認証を許可
PubkeyAuthentication
yes (初期値もyesだと思うので、そのままでOK)
どちらもyesにした場合、鍵を持ってなければ自動的にパスワードを聞いてきます。鍵必須にする場合は、PasswordAuthenticationをnoにするのを忘れずに。
設定が終わったら、sshのデーモンを再起動します。
sudo /etc/init.d/ssh restart
関連項目
特に変更する必要はないのですが、関係する項目として次のようなものがあります。
SSHのプロトコルのバージョン / Protocol
初期値は2になっています。
公開鍵の配置場所と名前 / AuthorizedKeysFile
初期値は%h/.ssh/authorized_keysとなってて、各ユーザーのホームディレクトリ以下の.sshディレクトリに作るauthorized_keysというファイルを指しています。
先ほど公開鍵の操作をしましたが、それはここで決められたファイルなのでした。
5:接続!
ターミナルで接続します。繋ぐところはパスワードでやるときと同様です。
ssh pi@192.168.XXX.XXX
このあと、次のようなメッセージが出て、パスフレーズの入力を促されます。
Enter passphrase for key '/Users/{ユーザー名}/.ssh/id_rsa':
設定したパスフレーズを入力すると、接続完了!
ユーザー名やパスワードを保存してすぐ繋げられて楽なツールもありました。