Vault sidecar 注入器权限仅针对 Vault 企业被拒绝

Vault sidecar injector permission denied only for vault enterprise

我正在尝试探索 Vault Enterprise,但是当我使用 Vault Enterprise 时,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 - configures the Vault Enterprise namespace to be used when requesting secrets from Vault.

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

看来我遗漏了 Vault 企业特有的东西

当您将 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 服务器,不确定保险库是否能够访问此端点。

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

您的保管库能够通过本地集群的互联网进行连接和验证吗?

我也遇到了这个奇怪的问题,我使用 Vault 配置时使用 CLIUI 然后它在为我工作时,它以一种单一的方式给出了 permission denied.

的错误

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

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

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

Use the /config endpoint to configure Vault to talk to Kubernetes. Use kubectl cluster-info to validate the Kubernetes host address and TCP port.

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 应该可以访问 Vault Enterprise 以进行令牌审查过程。

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

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

上进行测试