ラズパイのSSHは、初期状態でパスワード認証になっており、パスワードが分かればどのパソコンからでも接続できてしまいます。不正アクセスの可能性が高くなるので、セキュリティ上のリスクが高くなります。それに対して、公開鍵暗号方式の場合は、秘密鍵を持ったパソコンからのみ接続を許可することができます。アクセスできるパソコンを限定することができ、鍵の管理を正しく行うことで、セキュリティ上のリスクを抑えることができます。今回は、SSHをパスワード認証から公開鍵方式に変更したのでその手順を紹介します。
まず、ローカル側のWindowsPCで、PuTTygenを使って秘密鍵と公開鍵を作成します。サーバーに接続するPCで鍵を生成して、生成した秘密鍵はPC側のみに保存します。ネットワーク上に秘密鍵が流れることがないので、PC側の管理を正しく行うことで、鍵を生成したPCからのみサーバーに接続することが可能になります。(アクセスする側で鍵を生成して、公開鍵をサーバー側に転送するのが良いと思います。)
- ローカル側:Windows(鍵の生成)
- リモート側:ラズパイ(公開鍵の設定)
SSH接続用の鍵の生成と設定手順は以下です。
- 公開鍵と秘密鍵の生成
- ラズパイ(リモート側)の設定
- 公開鍵暗号化方式での接続確認
では、さっそく設定してみましょう。
1.公開鍵と秘密鍵の生成
ローカル側のWindowsPCで、PuTTygenをつかって公開鍵と秘密鍵を生成します。
PuTTygenを起動後、以下の選択を確認して「生成」ボタンを押します。
- 生成する鍵の種類:RSA
- 生成する鍵のビット数:2048
を選択して、「生成」ボタンを押して、マウスを動かすと鍵が生成されます。
マウスを動かすと鍵がバー表示が進んでいきます。
パスフレーズの入力欄が表示されるので入力して、「公開鍵の保存」ボタンと「秘密鍵の保存」ボタンを押して鍵を保存します。
・公開鍵:id_rsa.pub
・秘密鍵:RPi3B_rsa.ppk(任意のにつけた名前)
2.ラズパイ(リモート側)の設定
ローカル側で生成した公開鍵をラズパイ(リモート側)に転送して設定します。
まずは、転送先に「.ssh」ディレクトを作成して、パーミッションを700に設定します。
$cd ~/ $mkdir .ssh $chmod 700 .ssh
ssh-keygenコマンドで、転送した公開鍵「id_rsa.pub」を「authorized_keys」に追加します。
$ssh-keygen -i -f id_rsa.pub >> authorized_keys $rm id_rsa.pub
-i | 鍵ファイルを読み出しOpenSSH互換形式に変換してから標準出力に出力する |
-f | -fはファイル指定 ・読み出し元の公開鍵「id_rsa.pub」を指定 ・書込み先の公開鍵ファイル「authorized_keys」を指定 |
公開鍵のパーミッションを設定します。
$chmod 600 authorized_keys ※所有者のみ読み書き可能
最後に、sshd_configを編集します。
sudo vi /etc/ssh/sshd_config
ちなみに、sshd_configは他の端末からsshで接続される時の設定ファイルです。ssh_configは他の端末へ接続する時の設定ファイルで、ファイル名が似ているので間違いないように注意してください。
セキュリティを考慮して、以下の設定を変更しました。
- SSH接続のデフォルト22番ポートは不正アクセスや攻撃の対象になりやすにので任意の番号に変更
- 公開鍵認証を行うので、パスワード認証は禁止する。※公開認証の設定前にパスワード認証を禁止するとログインできなくなるので注意
- rootユーザの直接ログインはセキュリティ上禁止する。
- 空のパスワードはセキュリティ上禁止する。
- チャレンジレスポンス認証も使わないので禁止する。
sshd_configファイルの変更内容は以下です。
<sshd_configの中身> #Port番号をデフォルト値(22)から変更 Port xxxx(任意のポート番号) #パスワード認証の無効化(公開鍵認証のみに限定) PasswordAuthentication no #rootでの認証は禁止 PermitRootLogin no #公開鍵のパスを指定 AuthorizedKeysFIle .ssh/authorized keys #空のパスワードを禁止 PermitEmptyPasswords no #チャレンジレスポンス認証は禁止 ChallengeResponseAuthentication no
ファイルを編集したら、sshを再起動します。
sudo /etc/init.d/ssh restart
3.公開暗号化方式での接続確認
TeraTermを起動して、公開鍵認証方式で接続します。
接続先ホストとポート番号を指定して、SSHを選択します
ユーザー名と設定したパスフレーズを入力して、作成した秘密鍵を選択します。※パスフレーズは秘密鍵にアクセスするためのものです。(認証に使われるパスワードではありません)
最後にOKボタンを押して、ログインできれば完了です。
sshd_config で、
UsePAM yes の設定を no に変更すると
PCから接続するターミナル(Teraterm or Putty)の日本語表示が文字化けした・・・
現状は、UsePAM yes のままで使用する。