自定义命名空间下从Enterprise Vault取密钥报403权限拒绝求助
解决Enterprise Vault自定义命名空间下密钥获取403 Permission Denied问题
问题概况
在K8s集群k8ns命名空间部署Enterprise Vault后,创建Vault自定义命名空间vaultns,配置Kubernetes认证并绑定ACL策略,应用尝试读取kv/data/a/product/system/database路径的密钥时,返回403 Forbidden错误,报错信息:{"errors":["permission denied"]}。
核心问题与修复步骤
1. KV引擎挂载路径与密钥存储路径不匹配
启用KV v2引擎时指定了path=kv,但存储密钥时错误使用了secret/路径,导致密钥实际存储位置与应用请求路径不匹配。
错误命令:
kubectl exec hashicorp-vault-0 -- vault kv put -namespace=vaultns secret/a/product/system/database username=system password=R@spb3rry123
修复命令:
kubectl exec hashicorp-vault-0 -n k8ns -- vault kv put -namespace=vaultns kv/a/product/system/database username=system password=R@spb3rry123
2. ACL策略路径未适配KV v2引擎API格式
KV v2引擎的API请求路径为/v1/<mount-path>/data/<secret-path>,对应的Vault策略路径需要包含data层级,当前策略无法匹配请求路径。
错误策略:
path "kv/*" { capabilities = ["create", "read", "update", "delete", "list", "sudo"] }
修复后策略:
# 匹配KV v2的密钥读写路径 path "kv/data/*" { capabilities = ["create", "read", "update", "delete"] } # 匹配KV v2的密钥列表查询路径(若需要列表权限) path "kv/metadata/*" { capabilities = ["list"] }
更新策略后,需确保角色关联的策略已同步:
kubectl exec hashicorp-vault-0 -n k8ns -- vault policy write -namespace=vaultns k8s_test - <<EOF path "kv/data/*" { capabilities = ["create", "read", "update", "delete"] } path "kv/metadata/*" { capabilities = ["list"] } EOF
3. Kubernetes认证配置与角色绑定优化
- 角色创建命令补全命名空间:避免在默认命名空间执行,确保指向正确的Vault Pod:
kubectl exec hashicorp-vault-0 -n k8ns -- vault write -namespace=vaultns auth/kubernetes/role/product bound_service_account_names=hashicorp-vault bound_service_account_namespaces=k8ns policies=k8s_test ttl=1h
- 修正Kubernetes认证配置的集群地址:使用K8s集群默认的API服务地址,而非命名空间级地址,避免认证失败:
kubectl exec hashicorp-vault-0 -n k8ns -- vault write -namespace=vaultns auth/kubernetes/config token_reviewer_jwt="$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)" kubernetes_host=https://kubernetes.default.svc kubernetes_ca_cert=@/var/run/secrets/kubernetes.io/serviceaccount/ca.crt issuer="https://kubernetes.default.svc.cluster.local"
4. 手动验证权限(关键排查步骤)
使用应用关联的服务账户令牌手动登录Vault,验证权限是否正常:
# 获取应用服务账户令牌(假设使用hashicorp-vault服务账户) TOKEN=$(kubectl get secret $(kubectl get sa hashicorp-vault -n k8ns -o jsonpath='{.secrets[0].name}') -n k8ns -o jsonpath='{.data.token}' | base64 -d) # 使用Kubernetes认证登录Vault kubectl exec hashicorp-vault-0 -n k8ns -- vault login -namespace=vaultns -method=kubernetes role=product jwt=$TOKEN # 尝试读取密钥 kubectl exec hashicorp-vault-0 -n k8ns -- vault kv get -namespace=vaultns kv/a/product/system/database
如果手动读取成功,说明权限配置正确,问题可能出在应用侧的请求逻辑(如令牌获取、命名空间传递异常)。
内容的提问来源于stack exchange,提问作者haridurgempudi
相关产品推荐
相关产品推荐

