2

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

这是包含本地保险库 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根策略但没有运气

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

所以似乎我错过了一些非常特定于保险库企业的东西

4

2 回答 2

2

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

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

在此处输入图像描述

Kubernetes 应该可以访问 Vault 企业以进行令牌审查 API 调用。如您所见,当 sidecar 向保险库发出请求时,保险库企业服务器执行令牌审查 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_HOSTVault 企业应该可以访问令牌审查过程。

因此,要使 Vault 与我们的集群通信,我们需要进行一些更改。

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 上进行测试

于 2021-11-05T04:06:14.257 回答
1

当您将 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 进行连接和身份验证?

我也遇到了这个奇怪的问题,我使用CLIUI两种方式配置的保险库然后它对我有用,而以单一方式它给出了permission denied.

于 2021-11-04T12:40:17.390 回答