【问题标题】:Vault sidecar injector permission denied only for vault enterpriseVault Sidecar 注入器权限仅针对 Vault 企业被拒绝
【发布时间】:2021-11-05 12:10:15
【问题描述】:

我正在尝试探索 Vault 企业,但是当我使用 Vault 企业时,Sidecar 的权限被拒绝,但当我尝试使用本地 Vault 服务器时似乎工作正常。

这里是包含本地保管库vault-sidecar-injector-app的工作示例的存储库

保险柜配置

export VAULT_ADDR="https://vault-cluster.vault.c1c633fa-91ef-4e86-b025-4f31b3f14730.aws.hashicorp.cloud:8200"
export VAULT_NAMESPACE="admin"

#install agent
helm upgrade --install vault hashicorp/vault --set "injector.externalVaultAddr=$VAULT_ADDR"
vault auth enable kubernetes
# get certs & host
VAULT_HELM_SECRET_NAME=$(kubectl get secrets --output=json | jq -r '.items[].metadata | select(.name|startswith("vault-token-")).name')
TOKEN_REVIEW_JWT=$(kubectl get secret $VAULT_HELM_SECRET_NAME --output='go-template={{ .data.token }}' | base64 --decode)
KUBE_CA_CERT=$(kubectl config view --raw --minify --flatten --output='jsonpath={.clusters[].cluster.certificate-authority-data}' | base64 --decode)
KUBE_HOST=$(kubectl config view --raw --minify --flatten --output='jsonpath={.clusters[].cluster.server}')

# set Kubernetes config
vault write auth/kubernetes/config \
        token_reviewer_jwt="$TOKEN_REVIEW_JWT" \
        kubernetes_host="$KUBE_HOST" \
        kubernetes_ca_cert="$KUBE_CA_CERT" \
        issuer="https://kubernetes.default.svc.cluster.local" \
        disable_iss_validation="true" \
        disable_local_ca_jwt="true"


vault auth enable approle
# create admin policy
vault policy write admin admin-policy.hcl
vault write auth/approle/role/admin policies="admin"
vault read auth/approle/role/admin/role-id
# generate secret
vault write -f  auth/approle/role/admin/secret-id
#Enable KV
vault secrets enable -version=2 kv

我可以看到角色和政策

管理政策

这是企业的管理政策

path "*" {
capabilities = ["create", "read", "update", "delete", "list", "sudo"]
}

为 helm 部署脚本

这是部署脚本,尝试了hcp-root root 策略,但没有成功

RELEASE_NAME=demo-managed
NAMESPACE=default
ENVIRONMENT=develop
export role_id="f9782a53-823e-2c08-81ae-abc"
export secret_id="1de3b8c5-18c7-60e3-24ca-abc"
export VAULT_ADDR="https://vault-cluster.vault.c1c633fa-91ef-4e86-b025-4f31b3f14730.aws.hashicorp.cloud:8200"
export VAULT_TOKEN=$(vault write -field="token"  auth/approle/login role_id="${role_id}" secret_id="${secret_id}")
vault write auth/kubernetes/role/${NAMESPACE}-${RELEASE_NAME} bound_service_account_names=${RELEASE_NAME} bound_service_account_namespaces=${NAMESPACE} policies=hcp-root ttl=1h
helm upgrade --install $RELEASE_NAME ../helm-chart --set environment=$ENVIRONMENT --set nameOverride=$RELEASE_NAME

也尝试使用根令牌

RELEASE_NAME=demo-managed
NAMESPACE=default
ENVIRONMENT=develop
vault write auth/kubernetes/role/${NAMESPACE}-${RELEASE_NAME} bound_service_account_names=${RELEASE_NAME} bound_service_account_namespaces=${NAMESPACE} policies=hcp-root ttl=1h
helm upgrade --install $RELEASE_NAME ../helm-chart --set environment=$ENVIRONMENT --set nameOverride=$RELEASE_NAME

边车配置

使用命名空间注释,因为我理解命名空间是必需的

vault.hashicorp.com/namespace - 配置从 Vault 请求机密时要使用的 Vault Enterprise 命名空间。

https://www.vaultproject.io/docs/platform/k8s/injector/annotations

vault.hashicorp.com/namespace : "admin"

错误

  | Error making API request.
  |
  | URL: PUT https://vault-cluster.vault.c1c633fa-91ef-4e86-b025-4f31b3f14730.aws.hashicorp.cloud:8200/v1/admin/auth/kubernetes/login
  | Code: 403. Errors:
  |
  | * permission denied

没有命名空间注释得到以下错误

  | URL: PUT https://vault-cluster.vault.c1c633fa-91ef-4e86-b025-4f31b3f14730.aws.hashicorp.cloud:8200/v1/auth/kubernetes/login
  | Code: 400. Errors:
  |
  | * missing client token

即使启用调试日志vault.hashicorp.com/log-level : "debug" 也无法帮助我解决此错误,我们将不胜感激任何帮助或建议。

也试过了 https://support.hashicorp.com/hc/en-us/articles/4404389946387-Kubernetes-auth-method-Permission-Denied-error

所以我好像遗漏了一些非常特定于保险库企业的东西

【问题讨论】:

    标签: kubernetes hashicorp-vault vault sidecar


    【解决方案1】:

    终于能够解决保险库的奇怪问题,作为答案发布可能对其他人有所帮助。

    我唯一错过的是了解 Vault 服务器、Sidecar 和 Kubernetes 之间的流程。

    Vault 企业应该可以访问 Kubernetes 以进行令牌审查 API 调用。如您所见,当 sidecar 向 vault 发出请求时,vault 企业服务器执行令牌审查 API 调用。

    使用 /config 端点配置 Vault 以与 Kubernetes 对话。使用 kubectl cluster-info 验证 Kubernetes 主机地址 和 TCP 端口。

    https://www.vaultproject.io/docs/auth/kubernetes

    
      | Error making API request.
      |
      | URL: PUT https://vault-cluster.vault.c1c633fa-91ef-4e86-b025-4f31b3f14730.aws.hashicorp.cloud:8200/v1/admin/auth/kubernetes/login
      | Code: 403. Errors:
      |
      | * permission denied
       backoff=2.99s
    

    此错误并不表示它存在连接问题,但当保管库无法与 Kubernetes 集群通信时也会发生这种情况。

    Kube 主机

    vault write auth/kubernetes/config \
            token_reviewer_jwt="$TOKEN_REVIEW_JWT" \
            kubernetes_host="$KUBE_HOST" \
            kubernetes_ca_cert="$KUBE_CA_CERT" \
            issuer="https://kubernetes.default.svc.cluster.local"
    

    KUBE_HOST 应该可以被金库企业访问以进行令牌审核过程。

    因此,要让保管库与我们的集群通信,我们需要进行一些更改。

    minikube start --apiserver-ips=14.55.145.30 --vm-driver=none
    

    现在更新vaul-config.sh 文件

    KUBE_HOST=$(kubectl config view --raw --minify --flatten --output='jsonpath={.clusters[].cluster.server}')
    

    改成

    KUBE_HOST=""https://14.55.145.30:8443/"
    

    无需手动步骤,首次配置运行

    ./vault-config.sh
    

    对于 CI/CD 中的其余部署,您可以使用

    ./vault.sh
    

    每个版本只能访问自己的秘密。

    更多详情请见start-minikube-in-ec2

    TLDR,

    注意:Kubernetes 集群应该可以访问 Vault Enterprise 进行身份验证,因此 Vault Enterprise 将无法与您的本地 minikube 集群通信。最好在 EC2 上进行测试

    【讨论】:

      【解决方案2】:

      当您将 Kubernetes 身份验证设置到您使用的保管库中时

      vault write auth/kubernetes/config \
              token_reviewer_jwt="$TOKEN_REVIEW_JWT" \
              kubernetes_host="$KUBE_HOST" \
              kubernetes_ca_cert="$KUBE_CA_CERT" \
              issuer="https://kubernetes.default.svc.cluster.local" \
              disable_iss_validation="true" \
              disable_local_ca_jwt="true"
      

      你提到了

      issuer="https://kubernetes.default.svc.cluster.local" \
      

      它是 HTTP,看起来像是在运行本地 K8s 服务器,不确定 vault 是否能够访问此端点。

      您是否尝试绕过令牌和 CA 证书在此端点发送身份验证?

      您的保管库是否能够通过本地集群的 Internet 进行连接和身份验证?

      我也遇到过这个奇怪的问题,我使用了 CLI 和 UI 两种方式配置的保险库,然后它以单一方式为我工作permission denied 的错误。

      【讨论】:

      • 我不认为 vault server 与 Kubernetes 集群通信,它是在 Kubernetes 内部管理的 sidecar,sidecar 与 vault server 通信。其次它应该返回超时而不是权限被拒绝?
      • Vault 代理:Auto-Auth - 自动对 Vault 进行身份验证并管理本地检索的动态机密的令牌更新过程。 learn.hashicorp.com/tutorials/vault/agent-kubernetes?in=vault/…
      • 谢谢大佬,终于搞清楚了,是kube_host扮演的角色。
      • 是的,这真的很奇怪,我必须通过在 docker 中运行 vault 然后 minikube 来重现该问题,然后我找出 vault 服务器日志,它无法与 Kubernetes API 通信。顺便说一句,我在 repo 中添加了所有内容,配置为零
      • 太棒了……!感谢您分享可能对其他人有帮助的详细信息,并使用方便的 shell 脚本检查了 2-3 小时前更新的 repo。我也在本地记录,但我认为不能在答案中附加文档,它也与极简配置相同。
      猜你喜欢
      • 1970-01-01
      • 2023-03-26
      • 1970-01-01
      • 2012-03-30
      • 2021-12-08
      • 2019-05-24
      • 2021-12-02
      • 2022-12-16
      • 2020-12-10
      相关资源
      最近更新 更多