在亚马逊 Elastic Kubernetes Service 中使用 AWS Secrets Manager 密钥 - AWS Secrets Manager

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

在亚马逊 Elastic Kubernetes Service 中使用 AWS Secrets Manager 密钥

要将来自 Secrets Manager 的密钥显示为挂载在 Amazon EKS 容器中的文件,你可以使用 Kubernetes AWS 密钥存储区驱动程序的密钥和配置提供程序 (ASCP)。CSIASCP它适用于运行亚马逊节点组的亚马逊 Elastic Kubernetes Servic EKS e(亚马逊)1.17+。EC2 AWS Fargate 不支持节点组。借助ASCP,您可以在 Secrets Manager 中存储和管理您的密钥,然后通过在亚马逊上运行的工作负载进行检索EKS。如果您的密钥在JSON格式上包含多个密钥/值对,则可以选择在 Amazon 中挂载哪些密钥/值对。EKSASCP使用JMESPath语法来查询密钥中的键/值对。ASCP也适用于参数存储参数

如果您使用私有 Amazon EKS 集群,请VPC确保该集群所在的具有 Secrets Manager 终端节点。密钥库CSI驱动程序使用端点调用 Secrets Manager。有关在中创建终端节点的信息VPC,请参阅VPC 端点

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

步骤 1:设置访问控制

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

如果 Kubernetes 限制了从中查找与 pod 关联的区域和IAM角色的调用,则可以使用更改限制配额,如步骤 2 所示。ASCP helm install

向你的 Amazon EKS Pod 授予访问 Secrets Manager 中密钥的权限
  1. 创建权限策略,向 Pod 需要访问的机密授予secretsmanager:GetSecretValuesecretsmanager:DescribeSecret权限。有关策略示例,请参阅示例:读取和描述个人机密的权限

  2. 如果你还没有 O IAM penID Connect (OIDC) 提供程序,请为集群创建 OpenID Connect () 提供程序。有关更多信息,请参阅 Amazon EKS 用户指南中的为您的集群创建IAMOIDC提供程序

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

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

步骤 2:安装和配置 ASCP

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

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

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

  2. 添加 Secrets Store CSI 驱动程序图表。

    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:确定要挂载哪些密钥

要确定将哪些机密EKS作为文件ASCP挂载到 Amazon 文件系统中,您需要创建一个SecretProviderClassYAML文件。列SecretProviderClass出了要装载的密钥和装载它们的文件名。SecretProviderClass必须与它引用的 Amazon EKS 容器位于同一个命名空间中。

以下示例说明如何使用描述SecretProviderClass要挂载的密钥以及如何命名挂载在 Amazon EKS 容器中的文件。

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

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

  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"

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

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

  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-1和中检索密钥us-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 容器中

以下说明说明如何使用示例文件 ExampleSecretProviderClass.yaml 和 ExampleDeployment .yaml 将密钥挂载为YAML文件。

在 Amazon 中挂载机密 EKS
  1. 使用命令SecretProviderClass将应用于 pod kubectl apply -f ExampleSecretProviderClass.yaml

  2. 使用命令部署你的 pod kubectl apply -f ExampleDeployment.yaml

  3. ASCP挂载文件。

故障排除

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

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

    kubectl get pods
  2. 要描述 pod,请在以下命令中,对于 <PODID> 使用您在上一步中找到的 pod 中的 pod 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>