宣布 ASCP 与 Pod 身份集成:为 Amazon EKS 中的机密管理提供增强的安全性 安全博

5

ASCP 与 Pod Identity 整合:提升亚马逊 EKS 的秘密管理安全性

关键要点

本文宣布了 AWS Secrets and Configuration Provider (ASCP) 与 Pod Identity 的整合,为在 Amazon EKS 上运行的应用程序提供了增强的安全性,简化了配置,并改善了日常操作。Pod Identity 能够更细粒度地控制在 Pod 级别的权限管理,消除了对 IAM 角色注释的需求,使得在高规模环境中配置过程更简单。本文将探讨通过 Pod Identity 整合 ASCP 的单账户和跨账户秘密管理使用场景。

在 2021 年,亚马逊网络服务 (AWS) 引入了 AWS Secrets and Configuration Provider (ASCP),为 Kubernetes Secrets Store Container Storage Interface (CSI) Driver 提供了一种可靠的秘密管理方式,现在我们很高兴地宣布 ASCP 与 Pod Identity 的整合。这一新标准为 Amazon EKS 内的 AWS 身份与访问管理 (IAM) 集成提供了增强的安全性、简化的配置和改进的日常操作。本文将介绍如何通过 Pod Identity 整合 ASCP 来实现单账户和跨账户的秘密管理。

背景

当您的应用程序需要敏感信息,如访问数据库的凭证或通过 API 进行身份验证的密钥时,这种信息称为秘密。您可以在 AWS Secrets Manager 中安全地存储和管理这些秘密。ASCP 允许 Kubernetes 应用程序安全地检索存储在 Secrets Manager 和 AWS Systems Manager Parameter Store 中的秘密。以前,ASCP 依赖于 IAM 角色服务账户 (IRSA) 进行身份验证。尽管 IRSA 对于早期方法提供了改进,但 Pod Identity 目前提供了更大的安全性和简便性。

解决方案概述

通过这种整合,ASCP 使用 Pod Identity 来验证和授权对 AWS 服务的访问。当 Pod 需要访问一个秘密时,工作流程如下:

实现解决方案的前提条件

要实施此解决方案,您需要满足以下前提条件:

前提条件一个 Amazon EKS 集群 (版本 124 或更高版本)在集群上启用 Pod Identity访问两个 AWS 账户 (用于跨账户访问)安装 AWS CLI安装 kubectl安装 Helm

本指南将展示两种场景:单账户设置和跨账户设置。完成 账户 A 的单账户步骤后,再继续进行涉及 账户 B 的跨账户配置,跨账户设置建立在单账户的基础上,以展示跨 AWS 账户的安全秘密管理。

Amazon EKS 集群设置

在开始之前,您需要在单个账户 (账户 A) 中设置一个 Amazon EKS 集群,并配置所需的附加功能。

bashexport CLUSTERNAME=ascppodidentityexport SECRETNAME=secretaexport AWSREGION=(aws configure get region)export NAMESPACE=defaultexport SECRETNAMECROSS=secretb

创建 EKS 集群:

basheksctl create cluster name CLUSTERNAME version=131

更新您的 kubeconfig 文件,以启用 Pod Identity:

basheksctl create addon cluster CLUSTERNAME name ekspodidentityagent

安装 Secrets Store CSI 驱动程序:

bashhelm repo add secretsstorecsidriver https//kubernetessigsgithubio/secretsstorecsidriver/chartshelm install n kubesystem csisecretsstore secretsstorecsidriver/secretsstorecsidriver

验证 Secrets Store CSI 驱动程序的安装:

bashkubectl namespace=kubesystem get pods l app=secretsstorecsidriver

啊哈加速器安卓版

创建 ASCP 插件:

bashkubectl apply f https//rawgithubusercontentcom/aws/secretsstorecsidriverprovideraws/main/deployment/awsproviderinstalleryaml

在单账户中使用秘密

现在您已经设置好了 Amazon EKS 集群,在此用例中,您将在与集群和应用程序相同的账户中创建一个 AWS Secrets Manager 秘密 (账户 A)。

在 AWS Secrets Manager 中创建一个秘密并使用标签 kubernetesnamespace 和 eksclustername:

bashaws secretsmanager createsecret region AWSREGION name SECRETNAME tags Key=kubernetesnamespaceValue=NAMESPACE Key=eksclusternameValue=CLUSTERNAME secretstring {useruser1passwordpasswd1}

请记下新秘密的 Amazon 资源名称 (ARN),您将在下一步中使用。

创建一个 IAM 角色和信任策略,授予检索新创建的秘密所需的权限:

json{ Version 20121017 Statement [ { Effect Allow Action [secretsmanagerGetSecretValue secretsmanagerDescribeSecret] Resource [SECRETARN] Condition { StringEquals { secretsmanagerResourceTag/kubernetesnamespace {awsPrincipalTag/kubernetesnamespace} secretsmanagerResourceTag/eksclustername {awsPrincipalTag/eksclustername} } } } ]}

请注意,通过使用 kubernetesnamespace 和 eksclustername 标签,IAM 角色权限策略可以实现精细化访问控制。

json{ Version 20121017 Statement [ { Effect Allow Principal { Service podseksamazonawscom } Action [ stsAssumeRole stsTagSession ] } ]}

以上示例中的 IAM 角色信任策略允许 Amazon EKS Pod Identity 服务 (podseksamazonawscom) 假设角色并标记会话,这对 Pod Identity 的正确功能是必要的。

最后,应用角色和信任策略:

bashaws iam createrole rolename ascppodidentity assumerolepolicydocument file//trustjsonaws iam putrolepolicy rolename ascppodidentity policyname ascppodidentity policydocument file//policyjson

创建一个 Kubernetes ServiceAccount 并添加 Pod Identity 关联:

bashkubectl create serviceaccount serviceaccountaaws eks createpodidentityassociation clustername CLUSTERNAME namespace default serviceaccount serviceaccounta rolearn ROLEARN

创建一个 SecretProviderClass 来使用新创建的秘密:

yamlapiVersion secretsstorecsixk8sio/v1kind SecretProviderClassmetadata name awssecretsmanagerspec provider aws parameters objects objectName secreta objectType secretsmanager usePodIdentity true

创建一个新的部署以使用 Pod Identity 作为挂载卷来消费新创建的秘密:

yamlapiVersion apps/v1kind Deploymentmetadata labels app applicationa name applicationaspec replicas 1 selector matchLabels app applicationa template metadata labels app applicationa spec containers image publicecraws/amazonlinux/amazonlinux2023minimal name amazonlinux args infinity command sleep volumeMounts name secretsstoreinline mountPath /mnt/secret readOnly true volumes name secretsstoreinline csi driver secretsstorecsik8sio readOnly true volumeAttributes secretProviderClass awssecretsmanager serviceAccountName serviceaccounta

验证部署成功创建并确认秘密正确挂载:

bashkubectl get pods l app=applicationakubectl exec it (kubectl get pods l app=applicationa o name) cat /mnt/secret/secreta

通过资源策略处理跨账户秘密

在第二个用例中,您将继续使用 账户 A 上的 Amazon EKS 集群,并在不同账户 (账户 B) 中创建一个新的 Secrets Manager 秘密。

为了访问不同账户中的秘密,您不能使用默认的 AWS 密钥管理服务 (AWS KMS) 密钥,而是使用 aws/secretsmanager 来加密该秘密。首先,您需要创建一个允许跨账户访问的新 AWS KMS 密钥。

在账户 B 上创建一个具有跨账户权限的客户管理密钥:

json{ Version 20121017 Id crossaccountaccess Statement [ { Sid Enable IAM User Permissions Effect Allow Principal { AWS arnawsiam{ACCOUNTB}root } Action kms Resource arnawskms{AWSREGION}{ACCOUNTB}key/ } // 其他规则 ]}

然后创建 KMS 密钥:

bashaws kms create key region AWSREGION policy file//keypolicyjson

不久后,记下密钥的 KeyID 和 ARN。您可以为新创建的密钥创建一个别名:

bashaws kms createalias region AWSREGION aliasname alias/secretsmanagercross targetkeyid KEYID

创建一个新的秘密在 Secrets Manager 中,使用新 KMS 密钥加密它:

bashaws secretsmanager createsecret region AWSREGION name SECRETNAMECROSS tags Key=kubernetesnamespaceValue=NAMESPACE Key=eksclusternameValue=CLUSTERNAME secretstring This is a Cross Account Secret kmskeyid KEYID

请记下新秘密的 ARN,您将在下一步中使用。

添加资源策略以允许 账户 A 中的 IAM 角色访问新创建的秘密:

json{ Version 20121017 Statement [{ Effect Allow Principal { AWS arnawsiam{ACCOUNTA}root } Action [ secretsmanagerGetSecretValue secretsmanagerDescribeSecret ] Resource SECRETCROSSARN }]}

执行命令:

bashaws secretsmanager putresourcepolicy secretid SECRETNAMECROSS resourcepolicy file//resourcepolicyjson

在账户 A 上创建一个新的 IAM 角色和信任策略,授予检索新创建的秘密所需的权限:

json{ Version 20121017 Statement [ { Effect Allow Action [ secretsmanagerGetSecretValue secretsmanagerDescribeSecret ] Resource [SECRETCROSSARN] Condition { StringEquals { secretsmanagerResourceTag/kubernetesnamespace {awsPrincipalTag/kubernetesnamespace} secretsmanagerResourceTag/eksclustername {awsPrincipalTag/eksclustername} } } } { Effect Allow Action [ kmsDecrypt kmsDescribeKey ] Resource KEYARN } ]}

信任策略需要包含 podseksamazonawscom 作为受信任实体以执行 stsAssumeRole 和 stsTagSession 操作。

接下来创建角色并应用策略:

bashaws iam createrole rolename ascppodidentitycross assumerolepolicydocument file//trustjsonaws iam putrolepolicy rolename ascppodidentitycross policyname ascppodidentitycross policydocument file//crosspolicyjson

创建第二个 Kubernetes ServiceAccount 并添加跨账户 Pod Identity 关联:

bashkubectl create serviceaccount serviceaccountbaws eks createpodidentityassociation clustername CLUSTERNAME namespace default serviceaccount serviceaccountb rolearn ROLECROSSARN

创建一个 SecretProviderClass 来使用在账户 B 中创建的跨账户秘密:

yamlapiVersion secretsstorecsixk8sio/v1kind SecretProviderClassmetadata name awssecretsmanagercrossspec provider aws parameters objects objectName SECRETCROSSARN objectType secretsmanager usePodIdentity true

创建一个新的部署以使用 Pod Identity 作为挂载卷来消费新创建的秘密:

yamlapiVersion apps/v1kind Deploymentmetadata labels app applicationb name applicationbspec replicas 1 selector matchLabels app applicationb template metadata labels app applicationb spec containers image publicecraws/amazonlinux/amazonlinux2023minimal name amazonlinux args infinity command sleep volumeMounts name secretsstorecross mountPath /mnt/secret readOnly true volumes name secretsstorecross csi driver secretsstorecsik8sio readOnly true volumeAttributes secretProviderClass awssecretsmanagercross serviceAccountName serviceaccountb

验证部署创建成功并确认秘密挂载:

bashkubectl get pods l app=applicationbkubectl exec it (kubectl get pods l app=applicationb o name) cat /mnt/secret/SECRETCROSSARN

您应该看到以下输出:

NAME READY STATUS RESTARTS AGEapplicationb67b755444fngrhv 1/1 Running 0 8s

This is a Cross Account Secret

结论

ASCP 与 Pod Identity 的整合在 Amazon EKS 的秘密管理中标志着一个重要的进展。它提供了增强的安全性、简化的配置和改进的操作。我们鼓励所有 EKS 用户探索这一新整合,并充分利用其带来的好处。

ASCP 与 Pod Identity 的整合相比于 IRSA 的优势包括:

简化的设置: 使用 Pod Identity,您无需为每个应用程序创建和管理服务账户。增强的安全性: Pod Identity 提供了更细粒度的 Pod 级别权限控制。改进的可扩展性: 在大规模环境中更易于实施 Pod Identity。一致的 AWS 体验: Pod Identity 更紧密地符合 AWS 最佳实践。

更多信息请参考我们的文档: AWS Secrets Manager、AWS Secrets CSI Store Provider (ASCP) 和 Amazon EKS Pod Identity。

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

宣布 ASCP 与 Pod 身份集成:为 Amazon EKS 中的机密管理提供增强的安全性 安全博

Rodrigo BersaRodrigo 是 AWS 的高级专业解决方案架构师,专注于安全性和基础设施即代码自动化。通过利用 AWS 容器服务的最佳实践,他致力于帮助客户实现他们的业务目标。

Akshay AggarwalAkshay 是 AWS Secrets Manager 团队的高级技术产品经理。他是 AWS 加密服务团队的一部分,推动技术发展并定义最佳实践,以帮助客户在 AWS 云中构建安全可靠的工作负载。

![Stephanie Shen](https//d2908q01vomqb2cloudfrontnet/22d200f8670dbdb3e253a90eee5098477c95c23d

提升 Amazon Bedrock 代理的数据隐私透过分层授权作者:Jeremy Ware、Yuri Duchovny 和 Jason Garman,发表于2024年10月2日,文章连结:Amazon Bedrock主要要点在使用生成性 AI 的过程中,客户发现了多项优势,但这也带来了对应用程序威胁模型的新考量。特别是当使用 Amazon Bedrock 时,必须考虑数据控制挑战和安全性。本文章讨...

成功参加线上监考的 AWS 认证考试的五个小提示主要要点线上监考让考生在家或私人空间中参加 AWS 认证考试,而不必亲自到考场。参加考试前需确认设备及网络符合要求。提早预约考试并仔细阅读确认邮件是成功的重要因素。在这篇文章中,我将分享五个小提示,帮助你在参加 AWS 认证考试时更加自信和成功。随著线上监考的普及,考生可以在任何私密空间如家中或办公室参加考试,而不必亲自前往考试中心。AWS 认证考试...