サーバとして使っているMac miniにSSH接続する際の公開鍵認証を設定し、パスワード認証は無効にしました。サーバもクライアントもMacですが、一方のみがMacの場合も参考になると思います。
用語の定義
- サーバ(リモート)
- クライアント(ローカル)
- 公開鍵:暗号化に使う
- 秘密鍵:復号に使う
- パスワード:ログインに使う
- パスフレーズ:秘密鍵の暗号化に使う
そもそもどっちで鍵を作るのか
暗号理論的には受信者がキーペアを作成し、公開鍵を渡すようだが、SSHの場合は双方向通信なイメージなのでどっち(サーバかクライアントか)が用意するのかわからなくなる。調べてみたらどっちでもいいらしい。
midori-kasugano.hatenadiary.org
今回はクライアント側で作成する。
公開鍵認証の設定(クライアント側でする)
1. 以下のコマンドでサーバhoge
に渡す用のキーペアを作成する。(すべてのサーバで同じ鍵を使うことも可能だが非推奨。)
$ ssh-keygen -t ed25519 -C "comment" -f ~/.ssh/id_hoge
パスフレーズを2回聞かれるので入力する。
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
あとでパスフレーズを変更したくなった場合は、以下のコマンドが使える。
$ ssh-keygen -p -f ~/.ssh/id_hoge
2. 一般的にはssh-agent
をバックグラウンドで起動する必要があるが、当環境ではすでに起動していた。確かめると、オンデマンドで起動するため自動起動の設定は必要ないようだ。
参考
3. ~/.ssh/config
に以下の記述を追加する。
Host *
AddKeysToAgent yes
UseKeychain yes
Host hoge
HostName 192.168.1.2
User user
IdentityFile ~/.ssh/id_hoge
4. 以下のコマンドで秘密鍵をssh-agent
に追加する。
$ ssh-add -K ~/.ssh/id_hoge
パスフレーズはキーチェーンに保存される。
5. 以下のコマンドで公開鍵をサーバに転送する。
$ ssh-copy-id -i ~/.ssh/id_hoge 192.168.1.2
サーバの~/.ssh/authorized_keys
に保存される。
6. 以下のコマンドでサーバにログインする。
$ ssh hoge
以下、サーバ側で行うことになる。
パスワード無効に設定(サーバ側の操作)
7. /etc/ssh/sshd_config
の内容を以下に従い変更する。
-#PasswordAuthentication yes +PasswordAuthentication no
UsePAM yes
の場合は次も行う。
-#ChallengeResponseAuthentication yes +ChallengeResponseAuthentication no
8. sshd
を再起動する。今回はシステムを再起動した。
9. パスワードでログインしてみて無効なことを確認する。
% ssh -o PubkeyAuthentication=no 192.168.1.2
以下のように表示されれば成功。
user@192.168.1.2: Permission denied (publickey).