将 AWS Secrets and Configuration Provider CSI 与适用于 Amazon EKS 的容器组身份结合使用 - AWS Secrets Manager

将 AWS Secrets and Configuration Provider CSI 与适用于 Amazon EKS 的容器组身份结合使用

AWS Secrets and Configuration Provider 与适用于 Amazon Elastic Kubernetes Service 的容器组身份代理集成,为在 Amazon EKS 上运行的应用程序提供了增强的安全性、简化的配置以及更高的性能。容器组身份简化了从 Secrets Manager 检索密钥或从 AWS Systems Manager Parameter Store 中检索参数时的适用于 Amazon EKS 的 IAM 身份验证流程。

Amazon EKS 容器组身份通过直接在 Amazon EKS 接口设置权限,减少了操作步骤,且无需在 Amazon EKS 和 IAM 服务之间切换,从而简化了为 Kubernetes 应用程序配置 IAM 权限的过程。容器组身份允许在多个集群中共用一个 IAM 角色而无需更新信任策略,并支持角色会话标签以实现更精细的访问控制。这种方法不仅允许跨角色重复使用权限策略,简化了策略管理,而且还允许根据匹配的标签访问 AWS 资源,增强了安全性。

工作方式

  1. 容器组身份会为容器组(pod)分配 IAM 角色。

  2. ASCP 会使用此角色通过 AWS 服务 进行身份验证。

  3. 如果获得授权,ASCP 会检索请求的密钥并将其提供给容器组(pod)。

有关更多信息,请参阅《Amazon EKS 用户指南》中的了解 Amazon EKS 容器组身份的工作原理

先决条件

重要

仅云中的 Amazon EKS 支持容器组身份。Amazon EKS AnywhereAWS 云端 Red Hat OpenShift 服务 或 Amazon EC2 实例上自行管理的 Kubernetes 集群不支持容器组身份。

  • Amazon EKS 集群(版本 1.24 或更高版本)

  • 通过 kubectl 访问 AWS CLI 和 Amazon EKS 集群

  • 访问两个 AWS 账户(以实现跨账户访问)

安装 Amazon EKS 容器组身份代理

要将容器组身份与集群结合使用,必须安装 Amazon EKS 容器组身份代理附加组件。

安装容器组身份代理
  • 在集群上安装容器组身份代理附加组件:

    eksctl create addon \ --name eks-pod-identity-agent \ --cluster clusterName \ --region region

通过容器组身份设置 ASCP

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

  2. 创建可由容器组身份的 Amazon EKS 服务主体担任的 IAM 角色:

    JSON
    { "Version":"2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "pods.eks.amazonaws.com" }, "Action": [ "sts:AssumeRole", "sts:TagSession" ] } ] }

    向角色附加 IAM 策略:

    aws iam attach-role-policy \ --role-name MY_ROLE \ --policy-arn POLICY_ARN
  3. 创建容器组身份关联。有关示例,请参阅《Amazon EKS 用户指南》中的创建容器组身份关联

  4. 创建 SecretProviderClass,用于指定要挂载到容器组(pod)中的密钥:

    kubectl apply -f https://raw.githubusercontent.com/aws/secrets-store-csi-driver-provider-aws/main/examples/ExampleSecretProviderClass-PodIdentity.yaml

    IRSA 和容器组身份在 SecretProviderClass 中的关键区别在于可选参数 usePodIdentity。这是一个可选字段,用于确定身份验证方法。如果未指定,则默认对服务账户(IRSA)使用 IAM 角色。

    • 要使用 EKS 容器组身份,请使用以下任意值:"true", "True", "TRUE", "t", "T"

    • 要明确使用 IRSA,请将其设置为以下任意值:"false", "False", "FALSE", "f", or "F"

  5. 部署挂载 /mnt/secrets-store 下的密钥的容器组(pod):

    kubectl apply -f https://raw.githubusercontent.com/aws/secrets-store-csi-driver-provider-aws/main/examples/ExampleDeployment-PodIdentity.yaml
  6. 如果使用私有 Amazon EKS 集群,请确保该集群所在的 VPC 具有 AWS STS 端点。有关创建端点的信息,请参阅《AWS Identity and Access Management 用户指南》中的接口 VPC 端点

验证密钥的挂载情况

要验证密钥是否正确挂载,请运行以下命令:

kubectl exec -it $(kubectl get pods | awk '/pod-identity-deployment/{print $1}' | head -1) -- cat /mnt/secrets-store/MySecret
设置 Amazon EKS 容器组身份以访问 Secrets Manager 中的密钥
  1. 创建一个权限策略,授予对容器组(pod)需要访问的密钥的 secretsmanager:GetSecretValuesecretsmanager:DescribeSecret 权限。有关策略示例,请参阅 示例:读取和描述个人密钥的权限

  2. 在 Secrets Manager 中创建密钥(如果您还没有一个密钥)。

故障排除

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

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

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

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

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