精品项目

  • 首页
  • 精品项目
  • 使用 IAM Roles Anywhere 来帮助您提高本地容器工作负载的安全性 安全博客

使用 IAM Roles Anywhere 来帮助您提高本地容器工作负载的安全性 安全博客

2026-01-27 13:00:43

使用 IAM Roles Anywhere 加强您本地容器工作负载的安全性

由 Ulrich Hinze 和 Alex Paramonov 发表于 2023 年 11 月 29 日,AWS 身份与访问管理 (IAM)、专家 (400)、混合云管理、安全性、身份与合规、技术操作指南

主要要点

这篇博客文章展示了如何使用 IAM Roles Anywhere 来提升运行在本地的容器化工作负载的安全性。IAM Roles Anywhere 允许您在本地环境中降低静态 AWS 身份与访问管理 (IAM) 用户凭证的风险,从而更方便地管理安全认证。此外,文章将指导您如何设置 IAM Roles Anywhere,包括使用自身的公钥基础设施 (PKI) 应用于 IAM 角色,创建必要的 AWS 资源,并使用 Docker 映像执行 AWS CLI 命令,示范使用凭证从 AWS 执行命令的方法。

引言

这篇文章的重点在于如何满足本地容器化进程安全性目标,并且管理这些系统的凭证可能尤为棘手,尤其是在工作负载需要访问云资源时。IAM Roles Anywhere 使您能够在此情境下用临时安全凭证取代静态 AWS IAM 用户凭证,这不仅降低了安全风险,也提高了开发人员的便利性。

我们将专注于以下重点帮助您在自己的环境中设置 IAM Roles Anywhere:确定现有的本地公钥基础设施 (PKI) 是否可以与 IAM Roles Anywhere 一起使用、创建所需的 AWS 资源、创建启用了 IAM Roles Anywhere 的 Docker 映像,以及使用该映像来执行 AWS Command Line Interface (AWS CLI) 命令。最终,您将能够通过 Docker 容器执行 AWS CLI 命令,并使用来自您自己 PKI 的凭证。

AWS WellArchitected Framework 和 AWS IAM 最佳实践文档 建议您尽可能使用临时安全凭证而非静态凭证。在 AWS 上运行的工作负载,比如 Amazon Elastic Compute Cloud (Amazon EC2) 实例、AWS Lambda 函数或 Amazon Elastic Kubernetes Service (Amazon EKS) Pod,使用 IAM 角色分配和假设临时凭证是一种安全的方法,这些凭证可以用于通过 AWS API 验证。在 IAM Roles Anywhere 发布之前,开发人员必须使用带有长期的静态凭证(如访问金钥 ID 和秘密金钥)的 IAM 用户,从 AWS 外部调用 AWS API。现在,通过在您的本地 PKI 或 AWS Private Certificate Authority (AWS Private CA) 与 IAM Roles Anywhere 建立信任,您也可以使用 IAM 角色处理运行在 AWS 外部的工作负载。

这篇文章还提供了针对容器环境的逐步指导,因为容器使不同环境和操作系统的设置更加统一,便于您遵循这篇文章中的解决方案并直接应用学习到的知识到您现有的容器化设置中。然而,您也可以将同样的模式应用于非容器环境。

在这个逐步过程的最后,您将执行 AWS CLI 命令以列出 AWS 帐户中的 Amazon S3 存储桶(aws s3 ls)。这是一个简化的机制,用以证明您已成功使用 IAM Roles Anywhere 进行 AWS 认证。通常,在使用 AWS 功能的应用中,您可以选择使用适合您应用的编程语言的 AWS 软件开发工具包 (SDK)。您可以将这篇文章中的相同概念应用于使 AWS SDK 使用 IAM Roles Anywhere。

先决条件

为了跟随这篇文章,您需要安装以下工具:

工具描述AWS CLI最新版本,用于创建 IAM Roles Anywhere 资源jq用来从 AWS API 回应中提取特定信息Docker用来创建和运行容器映像OpenSSL用来创建加密密钥和凭证

确保 AWS CLI 使用的主体拥有足够的权限来执行本文中的命令。为了简化起见,您可以应用以下最小权限的 IAM 政策:

json{ Version 20121017 Statement [ { Sid IAMRolesAnywhereBlog Effect Allow Action [ iamCreateRole iamDeleteRole iamPutRolePolicy iamDeleteRolePolicy iamPassRole rolesanywhereCreateTrustAnchor rolesanywhereListTrustAnchors rolesanywhereDeleteTrustAnchor rolesanywhereCreateProfile rolesanywhereListProfiles rolesanywhereDeleteProfile ] Resource [ arnawsiamrole/bucketlister arnawsrolesanywheretrustanchor/ arnawsrolesanywhereprofile/ ] } ]}

这篇文章假设您已为 AWS CLI 配置默认的 AWS 区域。如果您尚未配置,请参考 AWS CLI 配置文档 了解如何配置 AWS 区域。

生产环境考量

要使用 IAM Roles Anywhere,您必须与私有 PKI 建立信任。由该证书授权机构 (CA) 颁发的凭证将用于签名 CreateSession API 请求。API 将返回临时的 AWS 凭证:访问金钥 ID、秘密金钥和会话金钥。为了强化安全性,应指定凭证为短期有效,并让 CA 自动旋转即将过期的凭证。

为了简化演示,本文解释了如何使用 OpenSSL 手动创建 CA 和凭证。在生产环境中,这不是一种合适的方法,因为这忽略了 CA 本身的安全问题,并且缺乏自动证书旋转或撤销的能力。您需要使用现有的 PKI 来在生产环境中提供短期且自动旋转的凭证。本文将展示如何验证您的私有 CA 和凭证是否符合 IAM Roles Anywhere 要求。

如果您没有符合这些要求的现有 PKI,您可以考虑使用 AWS Private Certificate Authority (Private CA) 来帮助您简化此过程。

为了在您的容器工作负载中使用 IAM Roles Anywhere,需要访问由您的私有 CA 颁发的凭证。

解决方案概览

下图描述了在这篇博文中创建的不同资源之间的关系。

要用现有的 PKI 建立信任关系,您将使用其 CA 凭证来创建 IAM Roles Anywhere 的信任锚。然后创建一个 IAM 角色,赋予其列出该帐户所有存储桶的许可。该 IAM 角色的信任策略指出只能通过 IAM Roles Anywhere 假设该角色,从而缩小可以用来假设它的具体终端用户凭证。IAM Roles Anywhere 配置文件则定义一个会话中可以假设的 IAM 角色。

用于与 IAM Roles Anywhere 进行身份验证的容器需要出示由 PKI 颁发的有效凭证,以及信任锚、配置档和角色的 Amazon 资源名称 (ARN)。该容器最终使用凭证的私钥来签名 CreateSession API 调用,返回临时的 AWS 凭证。这些临时凭证然后用于执行 aws s3 ls 命令,列出该帐户中的所有存储桶。

创建和验证 CA 和凭证

首先,您可以使用您自己的 CA 和凭证,或者为了方便随行,使用 OpenSSL 手动创建 CA 和凭证。然后,您可以验证 CA 和凭证是否符合 IAM Roles Anywhere 的要求。

创建 CA 和凭证的步骤

注意: 手动创建并签署 RSA 密钥为 X509 凭证并不适合生产环境。 本节仅供演示用途。

创建一个名为 v3ext 的 OpenSSL 配置文件,内容如下:

plaintext[ req ]defaultbits = 2048distinguishedname = reqdistinguishednamex509extensions = v3ca

[ v3cert ]basicConstraints = critical CAFALSEkeyUsage = critical digitalSignature

[ v3ca ]subjectKeyIdentifier = hashauthorityKeyIdentifier = keyidalwaysissueralwaysbasicConstraints = CA truekeyUsage = Certificate Sign

[ reqdistinguishedname ]countryName = Country Name (2 letter code)countryNamedefault = UScountryNamemin = 2countryNamemax = 2

stateOrProvinceName = State or Province Name (full name)stateOrProvinceNamedefault = Washington

localityName = Locality Name (eg city)localityNamedefault = Seattle

创建 CA RSA 私钥 cakeypem 并选择一个密码。

bashopenssl genrsa aes256 out cakeypem 2048

创建 CA X509 凭证 cacertpem,对所有选项保留默认设置。

使用 IAM Roles Anywhere 来帮助您提高本地容器工作负载的安全性 安全博客

bashopenssl req new x509 nodes days 1095 config v3ext key cakeypem out cacertpem

CA 凭证有效期为三年。如需有关凭证有效性的建议,请参见 AWS Private CA 文档。

虎跃加速器破解版下载

创建一个 RSA 私钥 keypem,选择新的密码,并为容器创建凭证签名请求 (CSR) csrpem。对于通用名称 (例如,完全合格的主机名),输入 myContainer。将其余选项留空。

bashopenssl req newkey rsa2048 days 1 keyout keypem out csrpem

使用 CA 私钥、CA 凭证和 CSR 为容器签发 X509 凭证 certpem。

bashopenssl x509 req days 1 sha256 setserial 01 in csrpem out certpem CA cacertpem CAkey cakeypem extfile v3ext extensions v3cert

验证 CA 和凭证的步骤

检查您的 CA 凭证是否满足 IAM Roles Anywhere 的约束。

bashopenssl x509 text noout in cacertpem

输出应包含以下内容:

plaintextCertificateData    Version 3 (0x2)Signature Algorithm sha256WithRSAEncryption    X509v3 extensions        X509v3 Basic Constraints            CATRUE        X509v3 Key Usage            Certificate Sign

检查您的凭证是否满足 IAM Roles Anywhere 的约束。

bashopenssl x509 text noout in certpem

输出应包含以下内容:

plaintextCertificateData    Version 3 (0x2)Signature Algorithm sha256WithRSAEncryption    X509v3 extensions        X509v3 Basic Constraints            CAFALSE        X509v3 Key Usage            Digital Signature

注意,IAM Roles Anywhere 还支持更强的加密算法,如 SHA256。

创建 IAM 资源

在确认您的 PKI 符合 IAM Roles Anywhere 的要求后,您即可创建 IAM 资源。在开始之前,请确保您已 配置 AWS CLI,包括设置默认的 AWS 区域。

创建 IAM 角色的步骤

创建一个名为 policyjson 的文件,指定容器进程所需要的一系列权限。对于本次演示,您将执行简单的 AWS CLI 命令 aws s3 ls,这需要以下权限:

json{ Version 20121017 Statement [ { Effect Allow Action [ s3ListAllMyBuckets ] Resource } ]}

创建一个名为 trustpolicyjson 的文件,包含 IAM Roles Anywhere 服务的假设角色策略。注意,此策略定义了哪些凭证可以假设该角色。 我们根据凭证的通用名称 (CN) 定义它,但您可以在 IAM Roles Anywhere 文档 中探索其他可能性。

json{ Version 20121017 Statement [ { Effect Allow Principal { Service rolesanywhereamazonawscom } Action [ stsAssumeRole stsTagSession stsSetSourceIdentity ] Condition { StringEquals { awsPrincipalTag/x509Subject/CN myContainer } } } ]}

创建名为 bucketlister 的 IAM 角色。

bashaws iam createrole rolename bucketlister assumerolepolicydocument file//trustpolicyjson

回应应为描述该角色的 JSON 文档。

附加您之前创建的 IAM 政策文档。

bashaws iam putrolepolicy rolename bucketlister policyname listbuckets policydocument file//policyjson

该命令将无回应。

启用与 IAM Roles Anywhere 的身份验证

通过使用 CA 凭证使 IAM Roles Anywhere 知