引言
本文介绍了适用于 Secrets Store CSI Driver 的 AWS 提供程序,这是一个新的 Amazon Elastic Kubernetes Service (Amazon EKS) 附加组件,可用于从 AWS Secrets Manager 获取密钥,并从 AWS Systems Manager Parameter Store 获取参数,然后将它们作为文件挂载到 Kubernetes Pod 中。该附加组件安装和配置简单,适用于 Amazon Elastic Compute Cloud (Amazon EC2) 实例和混合节点,并包含最新的安全更新和错误修复。它为在 Kubernetes 工作负载中检索密钥提供了一种安全可靠的方式。
适用于 Secrets Store CSI Driver 的 AWS 提供程序是一个开源 Kubernetes DaemonSet。
Amazon EKS 附加组件为 EKS 集群提供了一套精选附加组件的安装和管理。您可以使用这些附加组件来帮助确保 EKS 集群安全稳定,并减少安装、配置和更新附加组件所需的步骤。
Secrets Manager 可帮助您管理、检索和轮换数据库凭证、应用程序凭证、OAuth 令牌、API 密钥和其他密钥的整个生命周期。通过使用 Secrets Manager 存储凭证,您可以避免在应用程序源代码中使用硬编码凭证,有助于避免意外的访问。
新的 EKS 附加组件:适用于 Secrets Store CSI Driver 的 AWS 提供程序
我们建议将该提供程序作为 Amazon EKS 附加组件安装,而不是使用传统的安装方法(Helm、kubectl),以减少安装和配置提供程序所需的时间。该附加组件可以通过多种方式安装:使用 eksctl(本文中将使用此方法)、AWS 管理控制台、Amazon EKS API、AWS CloudFormation 或 AWS 命令行界面 (AWS CLI)。
安全注意事项
由 Kubernetes 社区维护的开源 Secrets Store CSI Driver 支持在 Kubernetes 集群中将密钥作为文件挂载。AWS 提供程序依赖于 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 区域必须在您的环境中可用。使用以下命令设置您首选的区域:
1aws configure set default.region <preferred_region> kubectl和eksctl命令行工具。- 托管在提供程序 GitHub 仓库中的 Kubernetes 部署文件。
准备好先决条件后,您就可以在终端中运行以下步骤中的命令了。
创建 EKS 集群
- 在终端中创建一个 shell 变量,用于存储您的集群名称:
1CLUSTER_NAME="my-test-cluster" - 创建 EKS 集群:
1eksctl create cluster $CLUSTER_NAMEeksctl会自动使用较新版本的 Kubernetes,并创建集群运行所需的资源。此命令通常需要大约 15 分钟来完成集群设置。
创建测试密钥
在 Secrets Manager 中创建一个名为 addon_secret 的密钥:
|
|
设置 Secrets Store CSI Driver 提供程序 EKS 附加组件
安装 Amazon EKS 附加组件:
|
|
创建 IAM 角色
创建一个 AWS Identity and Access Management (IAM) 角色,EKS Pod Identity 服务主体可以担任该角色,并将其保存在一个 shell 变量中(请将 <region> 替换为您的环境中配置的 AWS 区域):
|
|
将托管策略附加到 IAM 角色
注意:AWS 提供了一个用于通过 Secrets Manager 客户端消费密钥的托管策略:AWSSecretsManagerClientReadOnlyAccess。此策略授予获取和描述您账户中密钥的访问权限。如果您想进一步遵循最小权限原则,可以创建一个自定义策略,将其范围缩小到仅要检索的密钥。
将托管策略附加到您刚刚创建的 IAM 角色:
|
|
设置 EKS Pod Identity Agent
注意:该附加组件提供两种身份验证方法:服务账户的 IAM 角色 (IRSA) 和 EKS Pod Identity。在本解决方案中,您将使用 EKS Pod Identity。
- 在集群中安装附加组件后,安装 EKS Pod Identity Agent 附加组件以进行身份验证:
1 2 3eksctl create addon \ --cluster $CLUSTER_NAME \ --name eks-pod-identity-agent - 为集群创建 EKS Pod Identity 关联:
1 2 3 4 5 6 7eksctl 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
设置您的 SecretProviderClass
SecretProviderClass 是一个 YAML 文件,用于定义要将哪些密钥和参数作为文件挂载到您的集群中。
为测试密钥创建一个名为 spc.yaml 的最小 SecretProviderClass,内容如下:
|
|
部署您的 SecretProviderClass(确保您位于刚创建的 spc.yaml 文件所在目录):
|
|
要了解有关 SecretProviderClass 的更多信息,请参阅提供程序的 GitHub 自述文件。
将您的 Pod 部署到 EKS 集群
为简洁起见,我们省略了 Kubernetes 部署文件的内容。以下是提供程序 GitHub 仓库中用于 Pod Identity 的示例部署文件——使用此文件部署您的 Pod:
|
|
这会将 addon_secret 挂载到集群中的 /mnt/secrets-store 路径下。
检索您的密钥
打印 addon_secret 的值以确认密钥已成功挂载:
|
|
您应该看到以下输出:
|
|
您已成功使用新的 Amazon EKS 附加组件从 Secrets Manager 获取了测试密钥,并将其作为文件挂载到您的 Kubernetes 集群中。
清理
运行以下命令以清理您在本教程中创建的资源:
|
|
结论
在本文中,您学习了如何使用适用于 AWS Secrets Store CSI Driver 提供程序的新 Amazon EKS 附加组件来安全地检索密钥和参数,并将它们作为文件挂载到 Kubernetes 集群中。新的 EKS 附加组件提供了诸多优势,例如最新的安全补丁和错误修复、与 Amazon EKS 的更紧密集成,并减少了安装和配置 AWS Secrets Store CSI Driver 提供程序所需的时间。该附加组件经过 EKS 验证,可与 EC2 实例和混合节点配合使用。
延伸阅读
- 要了解如何配置 Amazon EKS 附加组件,请参阅 Amazon EKS 附加组件:高级配置。
- 要了解有关提供程序中可用安全功能的更多信息,请参阅提供程序 GitHub 自述文件的其他注意事项部分。
- 要了解有关 Secrets Manager 的更多信息,请参阅 AWS Secrets Manager 文档或 AWS 安全博客。
如果您对此文章有反馈,请在下面的评论区提交评论。如果您对此文章有疑问,请联系 AWS 支持。