所以我认为最简单的解决方案是我的问题就是将所有事情都使用 AWS,但我想了解什么是可能的:
我了解 IAM 角色可以与 AWS 服务(如 EC2 或 Lambda)相关联,以便在该服务中运行的应用程序/函数可以检索凭证以签署对其他 AWS 服务的 API 请求。 我有一个以前的应用程序在 Heroku 上运行并使用 Amazon S3。目前,我为此应用程序设置了一个 IAM 用户,该用户使用与 IAM 用户账户关联的访问密钥对 AWS API 的请求进行签名。我认为最佳实践是使用 IAM 角色而不是用户进行应用程序源代码 AWS API 调用,但是是否可以为 AWS 外部托管的应用程序进行设置,或者我是否需要将应用程序迁移到 AWS EC2 才能使用 IAM 角色?
应用程序托管在哪里并不重要,但要代入 IAM 角色,您将需要 IAM 凭证(先有鸡还是先有蛋)。通常,你会为应用设计一种安全的方式来检索这些基本凭据。这是在 AWS 外部运行计算的一个缺点(因为它无法自动代入 IAM 角色)。
一种选择是创建一个 IAM 用户,其唯一权限是能够代入给定的 IAM 角色。将这些 IAM 用户凭证安全地提供给 AWS 外部的应用程序,并让应用程序代入 IAM 角色,理想情况下,ExternalId
本身也由您的应用程序安全存储和安全检索。此外,您还可以管理对 IAM 角色的访问,例如定义哪些委托人可以代入该角色以及在哪些条件下代入该角色。
AWS宣布了一项新功能AWS IAM Anywhere,如果您需要避免使用访问/私有密钥,该功能应该会有所帮助。它更复杂,但遵循安全最佳实践。
AWS Identity and Access Management (IAM) 现在支持以下工作负载: 在 AWS 外部运行,以使用 IAM Roles Anywhere 访问 AWS 资源。 IAM 角色随处允许您的工作负载,例如服务器、容器、 以及使用 X.509 数字证书获取临时证书的应用程序 AWS 凭证并使用您拥有的相同 IAM 角色和策略 为您的 AWS 工作负载配置以访问 AWS 资源。
以及更多内容:
创建一个信任锚,您可以在其中引用您的 AWS 证书管理器私有证书颁发机构 (ACM 私有 CA) 或 向 IAM 角色注册您自己的证书颁发机构 (CA) 无论何处。通过向配置文件添加一个或多个角色并启用 IAM 角色 无论在哪里 要代入这些角色,您的应用程序现在都可以使用 由 CA 颁发的客户端证书,用于向 AWS 并获取访问 AWS 环境的临时凭证。
AWS 公告:https://aws.amazon.com/about-aws/whats-new/2022/07/aws-identity-access-management-iam-roles-anywhere-workloads-outside-aws/
用户指南: https://docs.aws.amazon.com/rolesanywhere/latest/userguide/introduction.html
来自 Heroku 文档:
由于 S3 凭证的敏感性,切勿将其提交到版本控制。相反,将它们设置为将使用它们的 Heroku 应用程序的配置变量的值。
使用
heroku config:set
设置两个键
heroku config:set AWS_ACCESS_KEY_ID=xxx AWS_SECRET_ACCESS_KEY=yyy
Adding config vars and restarting app... done, v21
AWS_ACCESS_KEY_ID => xxx
AWS_SECRET_ACCESS_KEY => yyy
以上内容符合 AWS 自己管理 AWS 访问密钥的最佳实践,特别是不直接在代码中嵌入访问密钥。
您不能使用 IAM 角色,因为它是由 AWS 在 AWS 外部自动选取的,而无需专门指定凭证。
您的下一个最佳选择是环境变量(如上所述),为具有角色的用户指定访问密钥 ID 和秘密访问密钥,该角色授予他们需要从 S3 读取的文件所需的最低权限,例如特定存储桶名称、特定文件,甚至特定 IP 地址(如果可能)等。