背景
を元に本番環境を用意していたところ、ubuntuで作ったインスタンスはsshできるもののAmazon Linuxで作られたec2-user
のインスタンスはsshできない現象に遭遇しました。
sshのログを調べるために
# /etc/ssh/sshd_config # ... LogLevel VERBOSE
と設定して再起動し、
$ tail -f /var/log/auth.log | grep --line-buffered "sshd"
でtailしながら再度アクセスを試みると
error: key_cert_check_authority: invalid certificate error: Certificate lacks principal list
というエラーが発生していました。
原因はなにか
Signed SSH Certificates - SSH - Secrets Engines | Vault by HashiCorp
でも書かれているのですが、OpenSSHの7.2~7.4の間のバグです。
こちらでは
key_cert_check_authority: invalid certificate Certificate invalid: name is not a listed principal
というエラーになってますね。
対応方法
主な対応方法は以下の3つです。
- サーバ側のOpenSSHのバージョンを7.1以下にする or 7.5以上にする
- Roleに
default_user
を付ける - 公開鍵の署名時に
valid_principals
を付ける
a. OpenSSHのバージョンを7.1以下にする or 7.5以上にする
一番わかり易いですね。
ただUbuntu16.04のデフォルトは7.2
なのでアップデートするにはaptのリストをいじったりする必要がありそうです。
もし全台のサーバを対応しないと〜となるとちょっとコストが高そうです。
b. Roleにdefault_user
を付ける
このCA認証のroleを作成する時に HashiCorp VaultでSSHをCA認証に - Carpe Diem では
$ vault write ssh-client-signer/roles/my-role -<<"EOH" { "allow_user_certificates": true, "allowed_users": "*", "default_extensions": [ { "permit-pty": "" } ], "key_type": "ca", "default_user": "ubuntu", "ttl": "30m0s" } EOH
とdefault_user
をつけていました。偶然にもこれのおかげでUbuntuの方はsshできていたようです。
ただこれは1ユーザしか指定できないので、そうなるとAmazon Linuxの方のec2-user
は対応できません。
c. 公開鍵の署名時にvalid_principals
を付ける
公開鍵の署名時のパラメータに
$ vault write -field=signed_key ssh-client-signer/sign/my-role \ public_key=@$HOME/.ssh/id_rsa.pub \ valid_principals=ubuntu,ec2-user > ~/.ssh/id_rsa-cert.pub
とvalid_principals
をつけます。すると署名された公開鍵は
$ ssh-keygen -Lf ~/.ssh/id_rsa-cert.pub /Users/jun06t/.ssh/id_rsa-cert.pub: Type: ssh-rsa-cert-v01@openssh.com user certificate Public key: RSA-CERT SHA256:cx2J6jOv6YKT0Wu3rJkyRiKjqZcBng3t7bLT9bNhczc Signing CA: RSA SHA256:XyNPPf1vkgJQV6BA+LbxdvbLuLy6LmmrGu0aQF/gQC0 Key ID: "vault-aws-tsuji_jumpei-731d89ea33afe98293d16bb7ac99324622a3a997019e0dededb2d3f5b3617337" Serial: 6563780155649447749 Valid: from 2018-07-31T20:46:37 to 2018-08-30T20:47:07 Principals: ec2-user ubuntu Critical Options: (none) Extensions: permit-pty
のようにPrincipalsが付きます。
この公開鍵を使用すると、ubuntu
ユーザでもec2-user
でもsshすることができました。