使用 OIDC 的 Vault SSH PKI - 用户作为 SSH 主体
Vault SSH PKI with OIDC - user as SSH principal
到目前为止,我的配置运行良好。用户可以使用 OIDC(链接到 Azure AD)登录到 Vault Web 界面。 AD 组也会传输到 Vault。所以我可以将 AD 组分配给 Vault 策略。登录到 Vault 的用户能够签署 SSH Public 密钥。到目前为止一切顺利...
唯一缺少的部分是身份传播。我希望能够跟踪我的 SSH 主机上的用户。因此,我需要将用户名添加到 SSH 证书中。
因此,当用户签署她的 SSH public 密钥时,我想将她的用户名(电子邮件、全名、与她的真实身份相关的任何内容)添加为 SSH 证书的主体。
如果我没理解错的话,我的问题类似于this one,但我使用的不是userpass secret engine,而是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。
对于遇到同样问题的任何人,我找到了解决问题的方法。
在配置OIDC角色时,我用sub
代替了bound_subject
,所有对应的教程都是这么建议的,我没有质疑这个值。 sub
是某种在 AD 中标识用户的 uuid。
所以我尝试了 email
并查看了 server.log 文件并找到了以下条目:
[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"...
因此 bound_subject
的值被写为 name
的值,位于 identity.entity.aliases.$(vault auth list -format=json | jq -r '.["oidc/"].accessor')
后面的任何位置(参见初始问题)。
所以现在使用电子邮件地址作为 Web 表单中的委托人是可行的:
查看证书属性也表明它有效:
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:
...
到目前为止,我的配置运行良好。用户可以使用 OIDC(链接到 Azure AD)登录到 Vault Web 界面。 AD 组也会传输到 Vault。所以我可以将 AD 组分配给 Vault 策略。登录到 Vault 的用户能够签署 SSH Public 密钥。到目前为止一切顺利...
唯一缺少的部分是身份传播。我希望能够跟踪我的 SSH 主机上的用户。因此,我需要将用户名添加到 SSH 证书中。
因此,当用户签署她的 SSH public 密钥时,我想将她的用户名(电子邮件、全名、与她的真实身份相关的任何内容)添加为 SSH 证书的主体。
如果我没理解错的话,我的问题类似于this one,但我使用的不是userpass secret engine,而是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。
对于遇到同样问题的任何人,我找到了解决问题的方法。
在配置OIDC角色时,我用sub
代替了bound_subject
,所有对应的教程都是这么建议的,我没有质疑这个值。 sub
是某种在 AD 中标识用户的 uuid。
所以我尝试了 email
并查看了 server.log 文件并找到了以下条目:
[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"...
因此 bound_subject
的值被写为 name
的值,位于 identity.entity.aliases.$(vault auth list -format=json | jq -r '.["oidc/"].accessor')
后面的任何位置(参见初始问题)。
所以现在使用电子邮件地址作为 Web 表单中的委托人是可行的:
查看证书属性也表明它有效:
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:
...