在 Amazon Elastic Kubernetes Service 中使用 AWS Secrets Manager 密钥 - AWS Secrets Manager

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

在 Amazon Elastic Kubernetes Service 中使用 AWS Secrets Manager 密钥

如果要将 Secrets Manager 中的密钥显示为挂载在 Amazon EKS 容器中的文件,您可以在 Kubernetes Secrets Store CSI Driver 中使用 AWS 密钥和配置提供程序(ASCP)。ASCP 与运行 Amazon EC2 节点组的 Amazon Elastic Kubernetes Service(Amazon EKS)1.17+ 配合使用。不支持 AWS Fargate 节点组。使用 ASCP,您可以在 Secrets Manager 中存储并管理密钥,然后通过 Amazon EKS 上运行的工作负载检索。如果密钥包含多个 JSON 格式的键/值对,您可以选择要在 Amazon EKS 中挂载的密钥/值对。ASCP 使用 JMESTath 语法来查询密钥中的键/值对。ASCP 还适用于 Parameter Store 参数

如果您使用私有 Amazon EKS 集群,请确保该集群所在的 VPC 具有Secrets Manager 端点。Secrets Store CSI Driver 使用端点调用 Secrets Manager。有关在 VPC 中创建端点的信息,请参阅 VPC 端点

如果对密钥使用 Secrets Manager 自动轮换,还可以使用 Secrets Store CSI Driver 轮换协调程序功能,确保从 Secrets Manager 中检索最新的密码。有关更多信息,请参阅已安装的内容和同步的 Kubernetes Secrets 的自动轮换

步骤 1:设置访问控制

ASCP 检索 Amazon EKS 容器组身份并将其交换为 IAM 角色。您可以在 IAM 策略中为该 IAM 角色设置权限。当 ASCP 代入 IAM 角色时,它可以访问您授权的密钥。除非将其与 IAM 角色关联,否则其他容器无法访问密钥。

如果来自 ASCP 的查找与容器组(pod)关联的区域和 IAM 角色的调用受到 Kubernetes 限制,则您可以使用 helm install 更改限制配额,如步骤 2 所示。

授予 Amazon EKS 容器组(pod)对 Secrets Manager 中密钥的访问权限
  1. 创建一个权限策略,授予对容器组(pod)需要访问的密钥的 secretsmanager:GetSecretValuesecretsmanager:DescribeSecret 权限。有关策略示例,请参阅示例:读取和描述个人密钥的权限

  2. 为集群创建 IAM OpenID Connect (OIDC) 提供商(如果还没有)。有关更多信息,请参阅《Amazon EKS 用户指南》中的为集群创建 IAM OIDC 提供商

  3. 为服务账户创建一个 IAM 角色并将策略附加到该角色。有关更多信息,请参阅《Amazon EKS 用户指南》中的为服务账户创建 IAM 角色

  4. 如果您使用私有 Amazon EKS 集群,请确保该集群所在的 VPC 具有 AWS STS 端点。有关创建端点的信息,请参阅《AWS Identity and Access Management 用户指南》中的接口 VPC 端点

步骤 2:安装和配置 ASCP

ASCP 在 secrets-store-csi-provider-aws 存储库中的 GitHub 可用。回购还包含用于创建和装载密钥的 YAML 文件示例。

安装过程中,您可以将 ASCP 配置为使用 FIPS 端点。有关 终端节点的列表,请参阅AWS Secrets Manager 端点

使用 Helm 安装 ASCP
  1. 为确保存储库指向最新图表,请使用 helm repo update.

  2. 添加 Secrets Store CSI Driver 图表。

    helm repo add secrets-store-csi-driver https://kubernetes-sigs.github.io/secrets-store-csi-driver/charts
  3. 安装图表。要配置节流,请添加以下标志:--set-json 'k8sThrottlingParams={"qps": "<number of queries per second>", "burst": "<number of queries per second>"}'

    helm install -n kube-system csi-secrets-store secrets-store-csi-driver/secrets-store-csi-driver
  4. 添加 ASCP 图表。

    helm repo add aws-secrets-manager https://aws.github.io/secrets-store-csi-driver-provider-aws
  5. 安装图表。要使用 FIPS 端点,请添加以下标志:--set useFipsEndpoint=true

    helm install -n kube-system secrets-provider-aws aws-secrets-manager/secrets-store-csi-driver-provider-aws
在存储库中使用 YAML 进行安装
  • 使用以下命令。

    helm repo add secrets-store-csi-driver https://kubernetes-sigs.github.io/secrets-store-csi-driver/charts helm install -n kube-system csi-secrets-store secrets-store-csi-driver/secrets-store-csi-driver kubectl apply -f https://raw.githubusercontent.com/aws/secrets-store-csi-driver-provider-aws/main/deployment/aws-provider-installer.yaml

步骤 3:确定要挂载的密钥

要确定 ASCP 将哪些密钥作为文件系统上的文件挂载在 Amazon EKS 中,您需要创建一个 SecretProviderClass YAML 文件。SecretProviderClass 列出了要挂载的密钥以及要挂载这些密钥的文件名。SecretProviderClass 必须与该文件引用的 Amazon EKS 容器位于同一名称空间。

以下示例演示了如何使用 SecretProviderClass 来描述要挂载的密钥以及如何命名安装在 Amazon EKS 容器组中的文件。

示例:按名称或 ARN 挂载密钥

以下示例显示了 SecretProviderClass,它将在 Amazon EKS 中挂载三个文件:

  1. 由完整 ARN 指定的密钥。

  2. 由名称指定的密钥。

  3. 密钥的特定版本。

apiVersion: secrets-store.csi.x-k8s.io/v1 kind: SecretProviderClass metadata: name: aws-secrets spec: provider: aws parameters: objects: | - objectName: "arn:aws:secretsmanager:us-east-2:111122223333:secret:MySecret2-d4e5f6" - objectName: "MySecret3" objectType: "secretsmanager" - objectName: "MySecret4" objectType: "secretsmanager" objectVersionLabel: "AWSCURRENT"

示例:从密钥挂载键/值对

以下示例显示了 SecretProviderClass,它将在 Amazon EKS 中挂载三个文件:

  1. 由完整 ARN 指定的密钥。

  2. username 键/值对来自同一个密钥。

  3. password 键/值对来自同一个密钥。

apiVersion: secrets-store.csi.x-k8s.io/v1 kind: SecretProviderClass metadata: name: aws-secrets spec: provider: aws parameters: objects: | - objectName: "arn:aws:secretsmanager:us-east-2:111122223333:secret:MySecret-a1b2c3" jmesPath: - path: username objectAlias: dbusername - path: password objectAlias: dbpassword

示例:为多区域密钥定义失效转移区域

为了在连接中断期间提供可用性或对于灾难恢复配置,ASCP 支持自动失效转移功能,以从辅助区域检索密钥。

以下示例显示了 SecretProviderClass,其检索复制到多个区域的密钥。在此示例中,ASCP 尝试从 us-east-1us-east-2 中检索密钥。如果任一区域返回 4xx 错误(例如身份验证问题),ASCP 都不会挂载任何一个密钥。如果成功从 us-east-1 中检索到密钥,则 ASCP 会挂载该密钥值。如果未成功从 us-east-1 中检索到密钥,但已成功从 us-east-2 中检索到密钥,则 ASCP 会挂载该密钥值。

apiVersion: secrets-store.csi.x-k8s.io/v1 kind: SecretProviderClass metadata: name: aws-secrets spec: provider: aws parameters: region: us-east-1 failoverRegion: us-east-2 objects: | - objectName: "MySecret"

示例:选择要挂载的失效转移密钥

以下示例显示了 SecretProviderClass,它指定在失效转移时要挂载哪个密钥。失效转移密钥不是副本。在此示例中,ASCP 尝试检索 objectName 指定的两个密钥。如果任何一个返回 4xx 错误(例如身份验证问题),ASCP 都不会挂载任何一个密钥。如果成功从 us-east-1 中检索到密钥,则 ASCP 会挂载该密钥值。如果未成功从 us-east-1 中检索到密钥,但已成功从 us-east-2 中检索到密钥,则 ASCP 会挂载该密钥值。Amazon EKS 中挂载的文件名为 MyMountedSecret

apiVersion: secrets-store.csi.x-k8s.io/v1 kind: SecretProviderClass metadata: name: aws-secrets spec: provider: aws parameters: region: us-east-1 failoverRegion: us-east-2 objects: | - objectName: "arn:aws:secretsmanager:us-east-1:111122223333:secret:MySecret-a1b2c3" objectAlias: "MyMountedSecret" failoverObject: - objectName: "arn:aws:secretsmanager:us-east-2:111122223333:secret:MyFailoverSecret-d4e5f6"

步骤 4:将密钥作为文件挂载到 Amazon EKS 容器组(pod)

以下说明展示了如何使用示例 YAML 文件 ExampleSecretProviderClass.yamlExampleDeployment.yaml 将密钥作为文件进行挂载。

在 Amazon EKS 中挂载密钥
  1. 使用命令 kubectl apply -f ExampleSecretProviderClass.yamlSecretProviderClass 应用于容器组(pod)。

  2. 使用命令 kubectl apply -f ExampleDeployment.yaml 部署您的容器组(pod)。

  3. ASCP 会挂载文件。

故障排除

您可以通过描述容器部署来查看大多数错误。

查看容器的错误消息
  1. 用以下命令获取容器名称列表。如果您没有使用默认命名空间,请使用 -n <NAMESPACE>

    kubectl get pods
  2. 要描述容器,请在以下命令中为 <PODID> 使用在上一步中找到的容器 ID。如果没有使用默认命名空间,请使用 -n <NAMESPACE>

    kubectl describe pod/<PODID>
查看 ASCP 的错误
  • 要在提供程序日志中查找更多信息,请在以下命令中为 <PODID> 使用 csi-secrets-store-provider-aws 容器 ID。

    kubectl -n kube-system get pods kubectl -n kube-system logs pod/<PODID>