目次
SSH 認証においても HTTP サーバ等で利用するオレオレ (サーバ/クライアント) 証明書と同様に CA を利用できます。本ページでは CA は独自に構築します。
authorized_keys を用いないクライアント認証
SSH サーバ側の authorized_keys
ファイルを更新する必要がないため管理も簡易化されます。共通の秘密鍵を複数人で使い回す必要もなくなります。
CA の構築 (サーバ側)
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
CA で署名された公開鍵を持つクライアントからの接続を許可するように設定 (サーバ側)
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
ユーザにのみログインできることに注意します。
known_hosts を用いないサーバ認証
初回接続であってもなりすましを防ぐことができます。
CA の構築 (サーバ側)
HTTP サーバの場合と同様に CA はクライアント認証の際に利用したものと同一である必要はありません。以下のように新規に CA を構築しても問題ありません。
ssh-keygen -f ca2
ca2
ca2.pub
秘密鍵と公開鍵の生成 (サーバ側)
HTTP サーバの場合と同様にインストール時に秘密鍵と公開鍵は生成されています。これを流用してみます。
$ ls /etc/ssh/*.pub
/etc/ssh/ssh_host_ecdsa_key.pub /etc/ssh/ssh_host_ed25519_key.pub /etc/ssh/ssh_host_rsa_key.pub
公開鍵の署名 (サーバ側)
$ sudo ssh-keygen -s ca2 -I vagrant-rsa -n `hostname`,127.0.0.1 -h /etc/ssh/ssh_host_rsa_key.pub
$ ssh-keygen -Lf /etc/ssh/ssh_host_rsa_key-cert.pub
/etc/ssh/ssh_host_rsa_key-cert.pub:
Type: ssh-rsa-cert-v01@openssh.com host certificate
Public key: RSA-CERT SHA256:U465PTIllSzt4rUVr37wtGuEWWKTp0l94RHzuVkFB1E
Signing CA: RSA SHA256:ymP0AS7hPKJ9raz3tS14e5YQeb52pMgLjInZFK2KBxg
Key ID: "vagrant-rsa"
Serial: 0
Valid: forever
Principals:
stretch
127.0.0.1
Critical Options: (none)
Extensions: (none)
署名した証明書と秘密鍵の設定 (サーバ側)
sudo su -l
echo 'HostCertificate /etc/ssh/ssh_host_rsa_key-cert.pub' >> /etc/ssh/sshd_config
echo 'HostKey /etc/ssh/ssh_host_rsa_key' >> /etc/ssh/sshd_config
systemctl restart sshd.service
tailf /var/log/auth.log
CA を信頼させる (クライアント側)
echo "@cert-authority * `cat 'ca2.pub'`" >> ~/.ssh/known_hosts
接続確認 (クライアント側)
ssh -v -o "UserKnownHostsFile ~/.ssh/known_hosts" -o "StrictHostKeyChecking ask" vagrant
初回接続であっても yes/no
を尋ねられることなく、以下のような出力が確認できれば成功です。
debug1: Found CA key in /Users/username/.ssh/known_hosts:12
debug1: ssh_rsa_verify: signature correct
関連記事
- 使い所が難しいマイナーな運用コマンドコマンドのエイリアスを登録する (update-alternatives) mybin という名前のコマンドを登録 sudo update-alternatives --install /usr/local/bin/mybin mybin /usr/bin/echo 10 sudo update-alternatives --install /usr/local/bin/mybin mybin /...
- ipコマンドの基本的な使い方ネットワーク関連のコマンドはたくさんあります。しかしながら、その一部は ip コマンドに集約できます。 基本形 ("man ip" より抜粋) $ ip OBJECT COMMAND OBJECT: link, neigh, addr, route (等) COMMAND: show, add, delete (等) データリンク層のネットワークデバイス情報 (ifconfigコマンドの代用) M...
- プロセス関連のコマンドプロセスID関連 (ps, pgrep, pkill) 全プロセスを表示するためには $ ps ax とすればよく、その表示を見やすくするためには "u" と "w" を追加して $ ps auxw とすればよいです。表示件数自体は同じです。そのうち特定のコマンドのプロセスIDだけを表示したい場合は $ ps ax | grep 'my_script' | grep -v grep | awk '...
- rpmとyumのチートシートrpm (RedHat Package Manager または RPM Package Manager) はRedHat系のパッケージ管理ツールで、yum (Yellowdog Updater Modified) は内部的にrpmを実行するメタパッケージ管理ツールです。rpmには柔軟性がありyumには利便性があります。 rpmは "rpmパッケージファイル" があれば何でもインストールできますが、...
- メモリおよびディスクリソースを調査するために便利なコマンドおよび周辺知識メモリ使用量を表示 (free) 既定ではキロバイト単位で表示されます。オプション "-b", "-k", "-m", "-g" を付与して実行するとそれぞれバイト、キロ、メガ、ギガで表示されます。 $ free total used free shared buffers cached Mem: 510824 ...