在 Amazon EKS 中使用 Secrets Store CSI Driver 插件集成 AWS Secrets Manager

本文详细介绍了如何使用亚马逊 EKS 新推出的 Secrets Store CSI Driver Provider 插件,将存储在 AWS Secrets Manager 中的密钥安全地挂载为文件到 Kubernetes Pod 中,包括集群创建、插件安装、IAM 角色配置和具体部署步骤。

引言

在本文中,我们将介绍 AWS Secrets Store CSI Driver Provider,这是一个新的 Amazon Elastic Kubernetes Service (Amazon EKS) 插件,可用于从 AWS Secrets Manager 获取密钥,并从 AWS Systems Manager Parameter Store 获取参数,然后将它们作为文件挂载到 Kubernetes Pod 中。该插件安装配置简单,支持 Amazon Elastic Compute Cloud (Amazon EC2) 实例和混合节点,并包含最新的安全更新和错误修复。它提供了一种安全可靠的方式来在 Kubernetes 工作负载中检索密钥。

AWS Secrets Store CSI Driver Provider 是一个开源的 Kubernetes DaemonSet。 Amazon EKS 插件为 EKS 集群提供了一套精选插件的安装和管理。您可以使用这些插件来帮助确保您的 EKS 集群安全稳定,并减少安装、配置和更新插件所需的步骤。

AWS Secrets Manager 可帮助您管理、检索和轮换数据库凭证、应用程序凭证、OAuth 令牌、API 密钥和其他密钥的整个生命周期。通过使用 Secrets Manager 存储凭证,您可以避免在应用程序源代码中使用硬编码凭证,有助于防止意外或不当访问。

新的 EKS 插件:AWS Secrets Store CSI Driver Provider

我们建议将该 Provider 作为 Amazon EKS 插件安装,而不是使用传统的安装方法(Helm, kubectl),以减少安装和配置 Provider 所需的时间。该插件可以通过多种方式安装:使用 eksctl(本文中将使用此方法)、AWS 管理控制台、Amazon EKS API、AWS CloudFormation 或 AWS 命令行界面 (AWS CLI)。

安全考量

由 Kubernetes 社区维护的开源 Secrets Store CSI Driver 支持将密钥作为文件挂载到 Kubernetes 集群中。AWS Provider 依赖于 CSI 驱动程序,并将密钥作为文件挂载到您的 EKS 集群中。安全最佳实践建议尽可能将密钥缓存在内存中。如果您倾向于采用原生 Kubernetes 体验,请按照此博文中的步骤操作。如果您倾向于将密钥缓存在内存中,我们建议使用 AWS Secrets Manager Agent。

IAM 主体需要 Secrets Manager 权限来获取和描述密钥。如果使用 Systems Manager Parameter Store,主体还需要 Parameter Store 权限来获取参数。密钥上的资源策略是另一种访问控制机制,如果从不同的 AWS 账户访问密钥,则必须明确授予 AWS 主体访问单个密钥的权限(请参阅从不同账户访问 AWS Secrets Manager 密钥)。Amazon EKS 插件提供了安全功能,包括支持使用 FIPS 端点。AWS 提供了一个托管 IAM 策略 AWSSecretsManagerClientReadOnlyAccess,我们建议将其与 EKS 插件一起使用。

解决方案演练

在以下部分中,您将创建一个 EKS 集群,在 Secrets Manager 中创建一个测试密钥,安装 Amazon EKS 插件,并使用它来检索测试密钥并将其作为文件挂载到您的集群中。

前提条件

  • AWS 凭证,必须在您的环境中配置以允许进行 AWS API 调用,并且是允许访问 Secrets Manager 所必需的。
  • AWS CLI v2 或更高版本。
  • 您偏好的 AWS 区域必须在您的环境中可用。使用以下命令设置您偏好的区域:
    1
    
    aws configure set default.region <preferred_region>
    
  • kubectleksctl 命令行工具。
  • 托管在 Provider 的 GitHub 仓库中的 Kubernetes 部署文件。

准备好前提条件后,您就可以在终端中运行以下步骤中的命令。

1. 创建 EKS 集群

在终端中创建一个包含集群名称的 shell 变量:

1
CLUSTER_NAME="my-test-cluster"

创建 EKS 集群:

1
eksctl create cluster $CLUSTER_NAME

eksctl 将自动使用最新的 Kubernetes 版本并创建集群运行所需的资源。此命令通常需要大约 15 分钟来完成集群设置。

2. 创建测试密钥

在 Secrets Manager 中创建一个名为 addon_secret 的密钥:

1
2
3
aws secretsmanager create-secret \
  --name addon_secret \
  --secret-string "super secret!"

3. 设置 Secrets Store CSI Driver Provider EKS 插件

安装 Amazon EKS 插件:

1
2
3
eksctl create addon \
  --cluster $CLUSTER_NAME \
  --name aws-secrets-store-csi-driver-provider

4. 创建 IAM 角色

创建一个 AWS Identity and Access Management (IAM) 角色,EKS Pod Identity 服务主体可以代入该角色,并将其保存在一个 shell 变量中(请将 <region> 替换为您环境中配置的 AWS 区域):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
ROLE_ARN=$(aws --region <region> --query Role.Arn --output text iam create-role --role-name nginx-deployment-role --assume-role-policy-document '{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "pods.eks.amazonaws.com"
            },
            "Action": [
                "sts:AssumeRole",
                "sts:TagSession"
            ]
        }
    ]
}')

5. 将托管策略附加到 IAM 角色

注意:AWS 提供了一个用于通过 Secrets Manager 进行客户端密钥使用的托管策略:AWSSecretsManagerClientReadOnlyAccess。此策略授予对您账户中密钥的获取和描述权限。如果您想进一步遵循最小权限原则,请创建一个仅限于您想要检索的密钥的自定义策略。

将托管策略附加到您刚刚创建的 IAM 角色:

1
2
3
aws iam attach-role-policy \
  --role-name nginx-deployment-role \
  --policy-arn arn:aws:iam::aws:policy/AWSSecretsManagerClientReadOnlyAccess

6. 设置 EKS Pod Identity Agent

注意:该插件提供两种身份验证方法:服务账户的 IAM 角色 (IRSA) 和 EKS Pod Identity。在本解决方案中,您将使用 EKS Pod Identity。

在集群中安装插件后,安装用于身份验证的 EKS Pod Identity Agent 插件:

1
2
3
eksctl create addon \
  --cluster $CLUSTER_NAME \
  --name eks-pod-identity-agent

为集群创建一个 EKS Pod Identity 关联:

1
2
3
4
5
6
7
eksctl create podidentityassociation \
    --cluster $CLUSTER_NAME \
    --namespace default \
    --region <region> \
    --service-account-name nginx-pod-identity-deployment-sa \
    --role-arn $ROLE_ARN \
    --create-service-account true

7. 设置您的 SecretProviderClass

SecretProviderClass 是一个 YAML 文件,用于定义要作为文件挂载到集群中的密钥和参数。

为测试密钥创建一个名为 spc.yaml 的最小化 SecretProviderClass,内容如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
apiVersion: secrets-store.csi.x-k8s.io/v1
kind: SecretProviderClass
metadata:
  name: nginx-pod-identity-deployment-aws-secrets
spec:
  provider: aws
  parameters:
    objects: |
      - objectName: "addon_secret"
        objectType: "secretsmanager"
    usePodIdentity: "true"

部署您的 SecretProviderClass(请确保您位于刚创建的 spc.yaml 文件所在的目录):

1
kubectl apply -f spc.yaml

要了解更多关于 SecretProviderClass 的信息,请参阅 Provider 的 GitHub 自述文件。

8. 将 Pod 部署到 EKS 集群

为简洁起见,我们省略了 Kubernetes 部署文件的内容。以下是 Provider 的 GitHub 仓库中用于 Pod Identity 的示例部署文件——使用此文件部署您的 Pod:

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

这将在您集群的 /mnt/secrets-store 路径挂载 addon_secret

9. 检索您的密钥

打印 addon_secret 的值以确认密钥已成功挂载:

1
kubectl exec -it $(kubectl get pods | awk '/nginx-pod-identity-deployment/{print $1}' | head -1) -- cat /mnt/secrets-store/addon_secret

您应该看到以下输出:

1
super secret!

您已成功使用新的 Amazon EKS 插件从 Secrets Manager 获取了测试密钥,并将其作为文件挂载到 Kubernetes 集群中。

10. 清理

运行以下命令以清理您在本教程中创建的资源:

1
2
3
4
5
6
7
aws secretsmanager delete-secret \
  --secret-id addon_secret \
  --force-delete-without-recovery

aws iam delete-role --role-name nginx-deployment-role

eksctl delete cluster $CLUSTER_NAME

结论

在本文中,您学习了如何使用新的 Amazon EKS 插件——AWS Secrets Store CSI Driver Provider,安全地检索您的密钥和参数,并将它们作为文件挂载到您的 Kubernetes 集群中。新的 EKS 插件提供了诸多优势,例如最新的安全补丁和错误修复、与 Amazon EKS 更紧密的集成,并减少了安装和配置 AWS Secrets Store CSI Driver Provider 所需的时间。该插件经过 EKS 验证,可与 EC2 实例和混合节点配合使用。

延伸阅读

如果您对本文有任何反馈,请在下面的评论部分提交评论。如果您对本文有任何疑问,请联系 AWS 支持。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计