Carpe Diem

備忘録

SSHのCA認証で Certificate lacks principal list

背景

christina04.hatenablog.com

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

  1. サーバ側のOpenSSHのバージョンを7.1以下にする or 7.5以上にする
  2. Roleにdefault_userを付ける
  3. 公開鍵の署名時に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することができました。