OpenSshサーバでは、特定のCA証明書が署名した証明書(+秘密鍵)で認証ができるように設定することができるらしい。 (自前のsshクライアントに機能を追加する際のテストサーバ用途ではあったのだけど)実際にやってみたので、備忘で残しておくことにする。
1. CA(秘密鍵、公開鍵)とユーザ(秘密鍵、公開鍵)の用意
まず当たり前の話ではあるのだが、CAの鍵とユーザの鍵の2種類が必要になるのでそれをまず作成する。(CA側・ユーザ側ともにすでに作成済の場合は飛ばしてしまってOK) CA側は管理者が署名をするための鍵なので1個だけ、ユーザ側は各ユーザが利用するためのものなのでユーザの数だけ必要になる。
1.1. CA側の鍵作成
ssh-keygen -f ca.key
1.2. ユーザ側の鍵作成
ssh-keygen -f user.key
この時点で、以下のファイルが作られている。
- ca.key ... CA側の秘密鍵
- ca.key.pub ... CA側の公開鍵
- user.key ... ユーザ側(利用者が使う側)の秘密鍵
- user.key.pub ... ユーザ側(利用者が使う側)の公開鍵
2. 証明書の作成(CAからユーザの公開鍵へ署名)
次に、CAの鍵ファイルを使ってユーザの公開鍵へ署名し、証明書を発行させる。
ssh-keygen -s <CA鍵> -I <証明書の説明> -n <sshログインを許可するユーザ名(カンマ区切り)> -V <証明書の期限(+XXXdでXXX日 まで)> ユーザの公開鍵
上記コマンドを実行すると、証明書ファイル(今回の場合だと「user.key-cert.pub
」)が作成される。
以下のコマンドでこの証明書ファイルの情報が取得できる()。
ssh-keygen -L -f 証明書ファイル
[blacknon@BlacknonMacBook-Pro2018][~/.ssh]
(`・ω・´) < ssh-keygen -s ca.key -I test-certificate -n blacknon -V +365d user.key.pub
Signed user key user.key-cert.pub: id "test-certificate" serial 0 for blacknon valid from 2019-05-23T05:52:00 to 2020-05-22T05:53:27
[blacknon@BlacknonMacBook-Pro2018][~/.ssh]
(`・ω・´) < ssh-keygen -L -f user.key-cert.pub
user.key-cert.pub:
Type: ssh-rsa-cert-v01@openssh.com user certificate
Public key: RSA-CERT SHA256:/MnbFxs0r8eh5Gy3muj6IbkSwlvEaeepSNw9jTBnxnA
Signing CA: ED25519 SHA256:25XwjQWcQprKPRtNxIOz5bosI/JPyZ3hU4MualJnVSY
Key ID: "test-certificate"
Serial: 0
Valid: from 2019-05-23T05:52:00 to 2020-05-22T05:53:27
Principals:
blacknon
Critical Options: (none)
Extensions:
permit-X11-forwarding
permit-agent-forwarding
permit-port-forwarding
permit-pty
permit-user-rc
実際に複数人がアクセスするサーバで利用する場合は、この作業を行ってユーザ用証明書を発行してあげる作業をユーザの数だけ行うことになる。
3. CA公開鍵をssh接続先サーバへ配置してsshd_configの編集
証明書認証でssh接続するにあたり、CAの公開鍵をssh接続先サーバに配置する必要がある。
どこに配置しても問題ないだろうと思うが、とりあえずまずは「/etc/ssh」にCAの公開鍵を配置しておく(/etc/ssh/ca.key.pub
)。
公開鍵を配置後、/etc/ssh/sshd_configに以下の記述を追記する。
TrustedUserCAKeys /etc/ssh/ca.key.pub
記述後、sshdを再起動する。
4. 接続
準備ができたら、実際に証明書を使ってssh接続をする。 証明書認証をする場合、ユーザの秘密鍵と先程発行した証明書が手元にある必要がある。
証明書と秘密鍵を同じディレクトリに置いておけば、sshコマンド実行時に秘密鍵を指定してやることで自動的に証明書も読み込んでくれる。 とりあえず「~/.ssh/」配下に配置しておくとよいだろう。 ssh接続をするマシン(クライアント)で証明書と秘密鍵を「~/.ssh/」配下に移動したら、後は以下のようにsshコマンドを実行して接続をすれば良い。
ssh -v -i ./user.key user@target
これで、証明書でのssh接続ができるようになった。