无法在HCL模板中限制Vault策略名称:Kubernetes角色权限拒绝报错
Vault策略限制K8s认证角色关联指定策略时的权限拒绝问题修复
问题场景
要创建一条Vault策略,允许指定实体创建Kubernetes认证角色,且角色仅能关联kubernetes/default策略。使用的HCL策略如下:
path "auth/kubernetes/role/{{identity.entity.aliases.auth_jwt_lll.metadata.project_id}}" { capabilities = ["read","delete", "list", "patch", "update","create"] allowed_parameters = { policies = ["kubernetes/default"] bound_service_account_names = [] bound_service_account_namespaces = [] ttl = [] } }
该策略语法无问题,但保留policies = ["kubernetes/default"]配置时,调用创建K8s角色接口会触发权限拒绝错误:
File "/usr/local/lib/python3.11/site-packages/hvac/adapters.py", line 294, in _raise_for_error utils.raise_for_error( File "/usr/local/lib/python3.11/site-packages/hvac/utils.py", line 41, in raise_for_error raise exceptions.VaultError.from_status( hvac.exceptions.Forbidden: 1 error occurred: * permission denied , on post https://my.local:443/v1/auth/kubernetes/role/2751
移除"kubernetes/default"配置后策略可正常工作,认证方式为GitLab CI生成的JWT令牌,已完成Vault OIDC/JWT集成。
原因分析
当在Kubernetes认证角色中指定关联策略(如kubernetes/default)时,Vault会验证执行操作的令牌是否拥有对该策略的读取权限。当前策略仅授权了K8s角色路径的操作权限,未包含对目标策略的读取权限,因此触发权限拒绝。
另外需注意:allowed_parameters中policies的配置要求传入的参数格式严格匹配——如果创建角色时传入的是字符串形式的单策略(如policies="kubernetes/default"),需将策略中的配置改为policies = "kubernetes/default";如果传入的是数组形式(如policies=["kubernetes/default"]),则保持数组配置即可。
修复后的策略
添加对kubernetes/default策略路径的读取权限,并确保allowed_parameters的格式匹配实际传入参数:
# 新增:允许读取指定策略 path "sys/policies/acl/kubernetes/default" { capabilities = ["read"] } path "auth/kubernetes/role/{{identity.entity.aliases.auth_jwt_lll.metadata.project_id}}" { capabilities = ["read","delete", "list", "patch", "update","create"] allowed_parameters = { # 根据实际传入格式调整:数组或字符串 policies = ["kubernetes/default"] bound_service_account_names = [] bound_service_account_namespaces = [] ttl = [] } }
验证步骤
- 更新Vault策略并应用
- 使用对应令牌调用创建K8s角色接口,传入
policies=["kubernetes/default"](或匹配配置的格式) - 确认接口成功执行,无权限拒绝错误
内容的提问来源于stack exchange,提问作者winter
相关产品推荐
相关产品推荐

