👏
証明書を使ってssh接続する with Hashicorp Vault
この記事の目的
- openSSHでのssh証明書による認証の実現方法が分かる。
- hasicorp vaultでのssh用CAの実現方法が分かる。
前提知識
証明書認証の概念図
ssh CA
SSH用証明書を発行する。
今回はHashicorp Vault ssh engineを利用する。
SSHクライアント
SSHサーバを認証する。(SSHサーバ証明書の有効性を検証する。)
SSHサーバ
SSHクライアントを認証する。(SSHクライアント証明書の有効性を検証する。)
前提環境
ssh CA
hashicorp Vault v1.16.2
OS->AlmaLinux release 9.1 (Lime Lynx)
SSHクライアント
OpenSSH_8.7p1, OpenSSL 3.2.2 4 Jun 2024
OS->AlmaLinux release 9.5 (Teal Serval)
SSHサーバ
OpenSSH_8.7p1, OpenSSL 3.2.2 4 Jun 2024
OS->AlmaLinux release 9.5 (Teal Serval)
SSHクライアントの証明書認証
1. SSH CAの準備
vaultはインストール済みとします。
sshエンジンを有効化し、ルート鍵ペアを作成します。
# sshエンジン有効化
vault$ vault secrets enable -path=ssh-client-signer ssh
Success! Enabled the ssh secrets engine at: ssh-client-signer/
# ルート鍵ペアを作成
vault$ vautl write ssh-client-signer/config/ca generate_signing_key=true
Key Value
--- -----
public_key ssh-rsa XXXXXXX
2. SSHサーバの準備
vaultから公開鍵を入手して任意のディレクトリへ保存します。(今回は/etc/sshの下)
vault$ curl -o /etc/ssh/trusted-user-ca-keys.pem https://<<FQDN>>:<<port>>/v1/ssh-client-signer/public_key
sshd_configへ信頼する公開鍵として設定します。(設定後はsshdの再起動を忘れずに。)
vault$ vi /etc/ssh/sshd_config
TrustedUserCAKeys /etc/ssh/trusted-user-ca-keys.pem
vault$ systemctl restart sshd
1,2は一度設定すれば再度設定することは基本的にない。
3. roleの作成
vaultのsshエンジンにroleを作成する。
roleには暗号アルゴリズムや認可情報を設定します。
roleはログインユーザや、ログイン先サーバ等により複数作成する可能性があります。(運用次第)
vault$ vault write ssh-client-signer/roles/test-role -<<"EOH"
{
"algorithm_signer": "rsa-sha2-256",
"allow_user_certificates": true,
"allowed_users": "*",
"allowed_extensions": "permit-pty,permit-port-forwarding",
"default_extensions": {
"permit-pty": ""
},
"key_type": "ca",
"default_user": "root",
"ttl": "30m0s"
}
EOH
4. SSHクライアント鍵ペアの作成と公開鍵の署名
# 鍵ペア作成
ssh-client$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa
Your public key has been saved in /root/.ssh/id_rsa.pub
The key fingerprint is:
~~~~~~~
The key's randomart image is:
+---[RSA 3072]----+
| .+= |
| =..= |
| o o + o |
| o o o E o|
| S + .* B |
| . +BoO.o|
| o.=O =+|
| ..+X.=|
| .++*+|
+----[SHA256]-----+
ssh-client$ ls -l
total 8
-rw------- 1 root root 2602 Dec 9 14:47 id_rsa
-rw-r--r-- 1 root root 571 Dec 9 14:47 id_rsa.pub
# 公開鍵の署名
## SSHクライアント側のサーバでvaultにログインする。
ssh-client$ vault login
Token (will be hidden):
Success! You are now authenticated. The token information displayed below
is already stored in the token helper. You do NOT need to run "vault login"
again. Future Vault requests will automatically use this token.
## 公開鍵を署名する。
ssh-client$ vault write -field=signed_key ssh-client-signer/sign/test-role \
public_key=@id_rsa.pub > id_rsa-cert.pub
ssh-client$ ls -l
total 20
-rw------- 1 root root 2602 Dec 9 14:47 id_rsa
-rw-r--r-- 1 root root 2282 Dec 9 15:09 id_rsa-cert.pub # できた
-rw-r--r-- 1 root root 571 Dec 9 14:47 id_rsa.pub
5. 証明書を使いSSHログインする
ssh-client$ ssh -i id_rsa-cert.pub -i id_rsa root@ssh-server
# 初接続時はfingerprintが出力する。SSHサーバ証明書をインストールすれば出なくなる。(別途説明)
The authenticity of host 'ssh-server' can't be established.
RSA key fingerprint is SHA256:~~~~~.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'ssh-server' (RSA) to the list of known hosts.
ssh-server$ # ログイン出来た。
参考
Hashicorp webドキュメント
Discussion