OpenSSH には個々の公開鍵をサーバに登録するのではなく、CA の公開鍵を登録して、証明書で認証する方法があります。
証明書の発行
CA 公開鍵/秘密鍵ペアの作成
$ ssh-keygen -f ca.key -t ed25519
$ ls
ca.key ca.key.pub
ユーザの公開鍵への署名
公開鍵に署名して証明書を発行します。
シリアルナンバーで失効させるため -z を付けておきます。
$ # -V で期限も付けられる
$ # ssh-keygen -s ca_key -I certificate_identity -n principals -z serial_number id_ed25519.pub
$ ssh-keygen -s ca.key -I hexa -n ubuntu -z 1 id_ed25519.pub
発行された証明書(id_ed25519-cert.pub)はユーザの秘密鍵と同じディレクトリに入れておきます。
署名した公開鍵の証明書の確認
$ ssh-keygen -Lf id_ed25519-cert.pub
id_ed25519-cert.pub:
Type: ssh-ed25519-cert-v01@openssh.com user certificate
Public key: ED25519-CERT SHA256:A7RX7U5KH8Fi8kvh1k2Rk7j1MGilnOzjLIU5iiZm4aQ
Signing CA: ED25519 SHA256:So6T7aqA5gQ8BC+D2cS8CBHm3hmZu7RPa+qWObPJRWQ
Key ID: "hexa"
Serial: 1
Valid: forever
Principals:
ubuntu
Critical Options: (none)
Extensions:
permit-X11-forwarding
permit-agent-forwarding
permit-port-forwarding
permit-pty
permit-user-rc
設定
sshd_config の設定
PasswordAuthentication 等の使用しない設定は切っておきます。
公開鍵(ca.key.pub)をサーバ上に置いて、/etc/ssh/sshd_config に TrustedUserCAKeys を追加します。
TrustedUserCAKeys /etc/ssh/ca.key.pub
ssh を再起動します。
$ systemctl restart sshd.service
ログイン
$ ssh -i id_ed25519 ubuntu@192.168.1.2
証明書の失効
公開鍵認証と異なり、証明書の認証の場合は CA の公開鍵のみをサーバに設置しているため、各ユーザの公開鍵を削除して、ログインできなくするということができません。
代わりに、発行した証明書を失効することができます。
KRL の作成
KRL(Key Revocation List) を作成して、証明書を失効させます。
ファイルに失効させる証明書の serial をファイルに記載しておき、KRL を作成します。
$ cat list.txt
serial:1
$ # KRL を更新する場合は -u を付ける
$ ssh-keygen -k -f krl -s ca.key.pub list.txt
sshd_config の設定
作成した krl をサーバ上に置いて、/etc/ssh/sshd_config に RevokedKeys を追加します。
RevokedKeys /etc/ssh/krl
ssh を再起動します。
$ systemctl restart sshd.service