问题描述
在AWS中有一个组织,包括一个主账户(账户A)和一个第二个账户(账户B)。用户希望创建一个角色,使账户B中的所有实例都能够从账户A中的所有资源中获得读取权限。例如,账户B中的EKS将能够从账户A中的ECR拉取镜像,或者账户B中的资源将能够从账户A中的RDS或S3中读取数据。
用户想知道如何创建一个角色,并将其应用于账户B中的所有当前和未来的资源,以便它们能够完全读取账户A中的资源。
解决方案
请注意以下操作注意版本差异及修改前做好备份。
方案1
有几种方法可以实现访问权限,你的问题涉及到了其中的一些方法。
首先,可以给EC2实例在另一个账户中执行AWS API调用的权限。为此,实例需要适当的IAM凭证。你可以为实例分配一个IAM角色。关系是 “IAM策略” -> “IAM角色” -> “IAM实例配置文件” -> “EC2实例”。这个策略可以给予该实例在其所在账户中执行sts:AssumeRole
API调用的权限,并在第二个账户中扮演一个角色。参考链接
我没有测试过这个方法,但据我所知,尽管上述描述是正确的,但它在使用sts:AssumeRole
API时不起作用,因为它需要非临时(非会话)凭证。而提供给EC2实例的凭证实际上是通过EC2元数据服务提供给它的sts:GetSessionToken
类型的凭证。
对于在EKS中运行的工作节点和Pod也是一样的。有一种方法可以在EKS中启用这个功能,详细说明在文档中有描述。参考链接
另一方面,如果你只需要访问RDS并与MySQL/PostgreSQL数据库通信,你不需要任何IAM凭证。只需要一个通过网络的清晰路径,其中安全组允许这些实例访问RDS数据库。在EC2和RDS中,安全组允许将外部账户的安全组作为”源IP地址”的过滤器。因此,当你选择执行这样的操作时,你不需要指定应用程序执行的EC2实例的IP地址,而是只需指定该实例使用的安全组,以及账户号码。参考链接
S3服务需要IAM凭证才能从中读取/写入数据,但在这种情况下,它还允许在S3存储桶本身上指定权限策略。因此,虽然上述的sts:AssumeRole
凭证方法可能不起作用,但你可以创建允许来自对等账户的访问的S3存储桶。参考链接
与此非常相似,ECR服务也有一个选项,允许来自另一个账户的GetLogin
API调用。参考链接
当然,最简单的方法是直接为EC2实例提供凭证。这可以通过将它们写入文件来实现。例如,aws
CLI使用文件~/.aws/credentials
,它允许指定多个命名配置文件,以便指定需要控制的账户。参考链接
另一种选择是创建一个作为”凭证自动提取机”的服务。一个非常好的工具是HashiCorp Vault。AWS甚至有一个QuickStart CloudFormation模板,可以在你的账户中部署Vault。参考链接
以上是一些实现访问权限的方法,你可以根据你的具体需求选择适合你的方法。
方案2
使用脚本或工具来管理访问权限可能会增加复杂性,并且需要确保正确设置账户B中的资源与账户A的依赖关系。
另一种方法是编写脚本或使用工具来控制资源的运行顺序。你可以使用aws
CLI命令来手动控制资源的启动顺序,或者使用一些第三方工具来管理资源的依赖关系。
希望这些解决方案能够帮助到你,如果有任何问题,请随时提问。