背景
を元に本番環境を用意していたところ、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することができました。