我尝试设置安全保管库主机密钥签名。
为此,我在保险库中编写了以下政策:
path "ssh_host_signer/sign/*" {
capabilities = ["create", "update"]
required_parameters = ["cert_type", "public_key", "valid_principals"]
allowed_parameters = {
"cert_type" = ["host"],
"public_key" = [],
"valid_principals" = ["{{identity.entity.aliases.auth_cert_XXX.name}}"]
}
}
不幸的是,这不起作用。使用
valid_principals" = []
而不是在策略中,密钥签名有效,因此问题一定存在。
我尝试像这样签署主机密钥:
vault write ssh_host_signer/sign/host cert_type=host public_key=@/etc/ssh/ssh_host_rsa_key.pub valid_principals=hostname.internal
如果我得到
entity_id
和 $ vault token lookup
然后是实体数据,我得到:
vault read identity/entity/id/__ENTITY_ID__
Key Value
--- -----
aliases [map[canonical_id:XXX creation_time:1990-XXX custom_metadata:<nil> id:XXX last_update_time:XXX local:false merged_from_canonical_ids:<nil> metadata:<nil> mount_accessor:auth_cert_XXX mount_path:auth/cert/ mount_type:cert name:hostname.internal]]
creation_time XXX
direct_group_ids []
disabled false
group_ids []
id XXX
inherited_group_ids []
last_update_time XXX
merged_entity_ids <nil>
metadata <nil>
name entity_XXX
namespace_id root
policies []
以及别名数据:
vault read identity/entity-alias/id/__ALIAS_ID__
Key Value
--- -----
canonical_id XXX
creation_time XXX
custom_metadata <nil>
id XXX
last_update_time XXX
local false
merged_from_canonical_ids <nil>
metadata <nil>
mount_accessor auth_cert_XXX
mount_path auth/cert/
mount_type cert
name hostname.internal
namespace_id root
那么为什么这不能像上面描述的那样工作(
"valid_principals" = ["{{identity.entity.aliases.auth_cert_XXX.name}}"]
)以及如何解决主机只能签署自己的密钥的问题?
借助 HashiCorp Vault 中的 ACL 策略路径模板,您只能在策略的 path 组件中利用模板参数。这是您政策的第一行,如下所示:
path "ssh_host_signer/sign/*" {
遗憾的是,您无法像您尝试那样在 Vault ACL 策略的
allowed_parameters
组件中利用 ACL 策略路径模板。为了达到您想要的结果,您需要为每个主机制定单独的策略。
HashiCorp 网站上的 Fine Grained Control 文档很好地详细说明了
allowed_parameters
选项的可能性。