在 AWS EKS 上使用 Kubernetes 身份验证方法部署 Hashicorp Vault 时出现证书错误

Posted

技术标签:

【中文标题】在 AWS EKS 上使用 Kubernetes 身份验证方法部署 Hashicorp Vault 时出现证书错误【英文标题】:Certificate error when deploying Hashicorp Vault with Kubernetes Auth Method on AWS EKS 【发布时间】:2019-05-08 20:40:28 【问题描述】:

我正在尝试在 AWS EKS 上使用 Kubernetes Auth Method 部署 Hashicorp Vault。

Hashicorp 认证方法: https://www.vaultproject.io/docs/auth/kubernetes.html

使用的程序,源自 CoreOS Vault Operator。虽然我实际上并没有使用他们的运营商: https://github.com/coreos/vault-operator/blob/master/doc/user/kubernetes-auth-backend.md

以下是程序使用的摘要以及一些附加内容。本质上,在按照所需步骤尝试实际登录保险库时,我遇到了证书错误。任何帮助表示赞赏。

为tokenreview创建服务账号和集群角色绑定:

$kubectl -n default create serviceaccount vault-tokenreview

$kubectl -n default create -f example/k8s_auth/vault-tokenreview-binding.yaml

    Contents of vault-tokenreview-binding.yaml file
    =========================================
    apiVersion: rbac.authorization.k8s.io/v1beta1
    kind: ClusterRoleBinding
    metadata:
      name: vault-tokenreview-binding
      namespace: default
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: ClusterRole
      name: system:auth-delegator
    subjects:
    - kind: ServiceAccount
      name: vault-tokenreview
      namespace: default

启用 vault auth 并将 Kubernetes 集群添加到 vault:

$SECRET_NAME=$(kubectl -n default get serviceaccount vault-tokenreview -o jsonpath='.secrets[0].name')
$TR_ACCOUNT_TOKEN=$(kubectl -n default get secret $SECRET_NAME -o jsonpath='.data.token' | base64 --decode)

$vault auth-enable kubernetes

$vault write auth/kubernetes/config kubernetes_host=XXXXXXXXXX kubernetes_ca_cert=@ca.crt token_reviewer_jwt=$TR_ACCOUNT_TOKEN

    Contents of ca.crt file
    NOTE: I retrieved the certificate from AWS EKS console. Which
          is shown in the "certificate authority" field in 
          base64 format. I base64 decoded it and placed it here
    =================
    -----BEGIN CERTIFICATE-----
    * encoded entry *
    -----END CERTIFICATE-----

创建保管库策略和角色:

$vault write sys/policy/demo-policy policy=@example/k8s_auth/policy.hcl

    Contents of policy.hcl file
    =====================
    path "secret/demo/*" 
      capabilities = ["create", "read", "update", "delete", "list"]
    

$vault write auth/kubernetes/role/demo-role \
    bound_service_account_names=default \
    bound_service_account_namespaces=default \
    policies=demo-policy \
    ttl=1h

尝试使用上一步中创建的服务帐户登录保险库:

$SECRET_NAME=$(kubectl -n default get serviceaccount default -o jsonpath='.secrets[0].name')
$DEFAULT_ACCOUNT_TOKEN=$(kubectl -n default get secret $SECRET_NAME -o jsonpath='.data.token' | base64 --decode)

$vault write auth/kubernetes/login role=demo-role jwt=$DEFAULT_ACCOUNT_TOKEN

    Error writing data to auth/kubernetes/login: Error making API request.

    URL: PUT http://localhost:8200/v1/auth/kubernetes/login
    Code: 500. Errors:

    * Post https://XXXXXXXXX.sk1.us-west-2.eks.amazonaws.com/apis/authentication.k8s.io/v1/tokenreviews: x509: certificate signed by unknown authority

【问题讨论】:

我也有同样的问题 ;( - 你找到解决方案了吗? 【参考方案1】:

你的 kubernetes url https://XXXXXXXXX.sk1.us-west-2.eks.amazonaws.com 有错误的证书尝试添加 -tls-skip-verify

vault write -t​​ls-skip-verify auth/kubernetes/login .......

【讨论】:

以上是关于在 AWS EKS 上使用 Kubernetes 身份验证方法部署 Hashicorp Vault 时出现证书错误的主要内容,如果未能解决你的问题,请参考以下文章

带有 ALB 入口控制器的 Terraform AWS Kubernetes EKS 资源不会创建负载均衡器

是否可以使用 AWS EFS 访问点在 EKS 中挂载 kubernetes 持久卷?

AWS — AWS EKS

在 AWS (EKS) 上运行 MySQL 集群支持、支持 HTTPS 的 Spring Boot 应用程序

在 AWS EKS 和 Istio Ingress 上使用 GRPC 的 SSL 提供 StatusCode.UNAVAILABLE

Terraform AWS EKS ALB Kubernetes Ingress 不会创建侦听器或目标组