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"
也无法帮助我解决此错误,我们将不胜感激任何帮助或建议。
看来我遗漏了 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 配置时使用 CLI 和 UI 然后它在为我工作时,它以一种单一的方式给出了 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
上进行测试
我正在尝试探索 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"
也无法帮助我解决此错误,我们将不胜感激任何帮助或建议。
看来我遗漏了 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 配置时使用 CLI 和 UI 然后它在为我工作时,它以一种单一的方式给出了 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
上进行测试