具有OIDC的Vault SSH PKI-用户作为SSH主体

时间:2020-07-07 10:29:58

标签: openid-connect hashicorp-vault

到目前为止,我的配置工作正常。用户可以使用OIDC(链接到Azure AD)登录Vault Web界面。广告组也会传输到保险柜。因此,我可以将AD组分配到保管箱策略。登录到保险柜的用户可以签名SSH公钥。到目前为止一切顺利...

唯一缺少的部分是身份传播。我希望能够跟踪我的SSH主机上的用户。因此,我需要将用户名添加到SSH证书中。

因此,当用户签署她的SSH公钥时,我想将其用户名(电子邮件,全名,任何与她的真实身份相关的信息)添加为SSH证书的主体。

如果我理解正确,我的问题类似于this one,但我使用OIDC代替了用户密码引擎。

我尝试采用git-issue中建议的代码:

cat <<EOF > signer-clientrole.hcl
{
    "allow_user_certificates": true,
    "allowed_users": "root,{{identity.entity.aliases.$(vault auth list -format=json | jq -r '.["oidc/"].accessor').name}}",
    "default_user": "",
    "allow_user_key_ids": "false",
    "default_extensions": [
        {
          "permit-pty": ""
        }
    ],
    "key_type": "ca",
    "ttl": "60m0s"
}
EOF
vault write ssh/roles/clientrole @signer-clientrole.hcl

但是,当我想用​​在“主要” Web表单中输入的用户名签名证书时,会收到错误消息,提示不存在委托人。参见下图:

Sign Error

我希望我的问题变得清楚。我在Debian 10上使用Vault 1.4.2。

1 个答案:

答案 0 :(得分:1)

对于那些遇到相同问题的人,我找到了解决问题的方法。

在配置OIDC角色时,我在sub中使用bound_subject来表示sub,因为在所有相应的教程中都建议这样做,并且我对此值并不怀疑。 email是在广告中标识用户的一种uuid。

所以我改用[DEBUG] identity: creating a new entity: alias="id:"..." canonical_id:"..." mount_type:"oidc" mount_accessor:"auth_oidc_..." mount_path:"auth/oidc/" name:"example_user@example.com"... 并查看server.log文件并找到以下条目:

bound_subject

因此,name的值将作为identity.entity.aliases.$(vault auth list -format=json | jq -r '.["oidc/"].accessor')后面的任何值写入ssh-keygen -Lf ssh-cert.pub ssh-cert-v11.pub: Type: ssh-rsa-cert-v01@openssh.com user certificate Public key: RSA-CERT SHA256:... Signing CA: RSA SHA256:... Key ID: "vault-oidc-example-user@example.com-..." Serial: ... Valid: from ... Principals: example-user@example.com Critical Options: (none) Extensions: ... (请参阅初始问题)。

因此,现在使用将电子邮件地址作为Web表单的主体使用即可:

Sign Success

查看证书属性也显示它有效:

TimeZone.current