2.3. 使用 Kubernetes 身份验证方法通过 KMS 启用集群范围的加密

您可以使用密钥管理系统(KMS)为集群范围的加密启用 Kubernetes 验证方法。

先决条件

  • 管理员对 Vault 的访问权限。
  • 有效的 Red Hat OpenShift Data Foundation 高级订阅。如需更多信息,请参阅 OpenShift Data Foundation 订阅中的知识库文章
  • OpenShift Data Foundation 操作器必须从 Operator Hub 安装。
  • 选择唯一路径名称作为后端 路径,该路径 遵循命名约定,因为以后无法更改它。

    注意

    OpenShift Data Foundation 4.10 中的 Kubernetes 验证方法不支持 Vault 命名空间

流程

  1. 创建服务帐户:

    $ oc -n openshift-storage create serviceaccount <serviceaccount_name>

    其中, <serviceaccount_name> 指定服务帐户的名称。

    例如:

    $ oc -n openshift-storage create serviceaccount odf-vault-auth
  2. 创建 clusterrolebindingsclusterroles:

    $ oc -n openshift-storage create clusterrolebinding vault-tokenreview-binding --clusterrole=system:auth-delegator --serviceaccount=openshift-storage:_<serviceaccount_name>_

    例如:

    $ oc -n openshift-storage create clusterrolebinding vault-tokenreview-binding --clusterrole=system:auth-delegator --serviceaccount=openshift-storage:odf-vault-auth
  3. 根据 OpenShift Container Platform 版本,执行以下任一操作:

    • 对于 OpenShift Container Platform 4.10:

      • 识别与上面创建的 serviceaccount(SA)关联的 secret 名称。

        $ VAULT_SA_SECRET_NAME=$(oc -n openshift-storage get sa <SA_NAME> -o jsonpath="{.secrets[*]['name']}") | grep -o "[^[:space:]]*-token-[^[:space:]]*"

        例如:

        $ VAULT_SA_SECRET_NAME=$(oc -n openshift-storage get sa odf-vault-auth -o jsonpath="{.secrets[*]['name']}" | grep -o "[^[:space:]]*-token-[^[:space:]]*")
    • 对于 OpenShift Container Platform 4.11:

      • serviceaccount 令牌和 CA 证书创建 secret。

        $ cat <<EOF | oc create -f -
        apiVersion: v1
        kind: Secret
        metadata:
          name: odf-vault-auth-token
          namespace: openshift-storage
          annotations:
            kubernetes.io/service-account.name: <serviceaccount_name>
        type: kubernetes.io/service-account-token
        data: {}
        EOF

        其中,<serviceaccount_name> 是上一步中创建的服务帐户。

        $ VAULT_SA_SECRET_NAME=odf-vault-auth-token
  4. 从 secret 获取令牌和 CA 证书。

    $ SA_JWT_TOKEN=$(oc -n openshift-storage get secret "$VAULT_SA_SECRET_NAME" -o jsonpath="{.data.token}" | base64 --decode; echo)
    $ SA_CA_CRT=$(oc -n openshift-storage get secret "$VAULT_SA_SECRET_NAME" -o jsonpath="{.data['ca\.crt']}" | base64 --decode; echo)
  5. 检索 OCP 集群端点。

    $ OCP_HOST=$(oc config view --minify --flatten -o jsonpath="{.clusters[0].cluster.server}")
  6. 获取服务帐户签发者。

    $ oc proxy &
    $ proxy_pid=$!
    $ issuer="$( curl --silent http://127.0.0.1:8001/.well-known/openid-configuration | jq -r .issuer)"
    $ kill $proxy_pid
  7. 使用以上步骤中收集的信息,在 Vault 中设置 Kubernetes 验证方法,如下所示。

    $ vault auth enable kubernetes
    $ vault write auth/kubernetes/config \
              token_reviewer_jwt="$SA_JWT_TOKEN" \
              kubernetes_host="$OCP_HOST" \
              kubernetes_ca_cert="$SA_CA_CRT" \
              issuer="$issuer"
    重要

    当签发者为空时,在 Vault 中配置 Kubernetes 身份验证方法。

    $ vault write auth/kubernetes/config \
              token_reviewer_jwt="$SA_JWT_TOKEN" \
              kubernetes_host="$OCP_HOST" \
              kubernetes_ca_cert="$SA_CA_CRT"
  8. 在 Vault 中启用 Key/Value(KV)后端路径。

    对于 Vault KV secret engine API,版本 1。

    $ vault secrets enable -path=odf kv

    对于 Vault KV secret engine API,版本 2。

    $ vault secrets enable -path=odf kv-v2
  9. 创建策略来限制用户在 secret 上执行写入或删除操作:

    echo '
    path "odf/*" {
      capabilities = ["create", "read", "update", "delete", "list"]
    }
    path "sys/mounts" {
    capabilities = ["read"]
    }'| vault policy write odf -
  10. 生成角色:

    $ vault write auth/kubernetes/role/odf-rook-ceph-op \
            bound_service_account_names=rook-ceph-system,rook-ceph-osd,noobaa \
            bound_service_account_namespaces=openshift-storage \
            policies=odf \
            ttl=1440h

    在创建存储系统期间配置 KMS 连接详情时,会稍后使用角色 odf-rook-ceph-op

    $ vault write auth/kubernetes/role/odf-rook-ceph-osd \
            bound_service_account_names=rook-ceph-osd \
            bound_service_account_namespaces=openshift-storage \
            policies=odf \
            ttl=1440h