SSH 認証においても HTTP サーバ等で利用するオレオレ (サーバ/クライアント) 証明書と同様に CA を利用できます。本ページでは CA は独自に構築します。
SSH サーバ側の authorized_keys
ファイルを更新する必要がないため管理も簡易化されます。共通の秘密鍵を複数人で使い回す必要もなくなります。
ssh-keygen -f ca
ca
ca.pub
ssh-keygen -f id_rsa.20180808
id_rsa.20180808
id_rsa.20180808.pub
クライアントから渡された公開鍵を authorized_keys
に書き込むのではなく CA の秘密鍵で署名します。
ssh-keygen -s ca -I my-key-id -n myuser,myuser2 -z 1 id_rsa.20180808.pub
id_rsa.20180808-cert.pub
-s
で CA の秘密鍵を指定します。-I
で署名対象の ID を決めて指定します。-z
で後に失効できるように連番を付与します。-n
でログイン可能なユーザを指定します。
$ ssh-keygen -Lf id_rsa.20180808-cert.pub
id_rsa.20180808-cert.pub:
Type: ssh-rsa-cert-v01@openssh.com user certificate
Public key: RSA-CERT SHA256:lQEUisUKgQ5O4MeGfT5qukh65/jXQppfwOEOX8p3ze0
Signing CA: RSA SHA256:BRt1XBvnoBQuSBPltoZ+idQAVj4CDT5MlfTcc2Xf4YE
Key ID: "my-key-id"
Serial: 1
Valid: forever
Principals:
myuser
myuser2
Critical Options: (none)
Extensions:
permit-X11-forwarding
permit-agent-forwarding
permit-port-forwarding
permit-pty
permit-user-rc
AuthorizedKeysFile
での認証ができないように /dev/null
に向けています。
sudo su -l
echo 'TrustedUserCAKeys /etc/ssh/ca.pub' >> /etc/ssh/sshd_config
echo 'AuthorizedKeysFile /dev/null' >> /etc/ssh/sshd_config
systemctl restart sshd.service
tailf /var/log/auth.log
どの鍵で認証できたかは以下のようなコマンドで確認できます。
ssh -v -i id_rsa.20180808 myuser@vagrant "echo" 2>&1 | egrep '(Trying private key|Authentication succeeded)'
id_rsa.20180808
id_rsa.20180808-cert.pub
Principals
ユーザにのみログインできることに注意します。