在EC2上实现跨帐户访问的解决方案

59次阅读
没有评论

问题描述

在EC2实例上想要使用aws cli在另一个账户中创建一些资源,但是不想使用aws_secret_key和aws_access_key。他想知道是否有其他方法实现这个目标。

解决方案

请注意以下操作可能涉及到账户间的访问和权限设置,请确保了解相关的安全性和权限控制。

方案

可以通过在两个账户之间创建角色并使用AssumeRole的方式来实现在EC2实例上访问另一个账户的资源,而不需要直接使用aws_secret_key和aws_access_key。以下是详细步骤:

  1. 在账户A中创建角色和策略
  2. 在账户A中创建一个名为RoleForB的角色,该角色将信任账户B。为该角色附加一个允许它在账户A中执行某些读操作的IAM策略,比如ReadOnlyAccess
  3. 配置角色的信任策略,允许账户B的根用户扮演这个角色。以下是一个示例信任策略:

json
{
"Version": "2012-10-17",
"Statement": {
"Effect": "Allow",
"Principal": {"AWS": "arn:aws:iam::Account_B_ID:root"},
"Action": "sts:AssumeRole"
}
}

  1. 在账户B中创建角色和策略
  2. 在账户B中创建一个名为AssumeRoleInA的角色,附加一个策略,允许它扮演账户A中的RoleForB角色。
  3. 配置AssumeRoleInA角色的策略,允许它扮演账户A中的RoleForB角色。以下是一个示例策略:

json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Resource": [
"arn:aws:iam::Account_A_ID:role/RoleForB"
]
}
]
}

  1. 在账户B中的EC2实例上分配角色
  2. 在账户B中,为需要访问账户A资源的EC2实例分配AssumeRoleInA角色。
  3. 这可以通过为EC2实例关联IAM角色来完成,使得EC2实例能够假扮为AssumeRoleInA角色。

  4. 在账户B中的EC2实例上使用assume-role命令

  5. 在EC2实例上,使用aws sts assume-role命令来假扮为账户A中的RoleForB角色,以获取临时凭证。
  6. 在EC2终端中运行以下命令:

bash
aws sts assume-role --role-arn "arn:aws:iam::Account_A_ID:role/RoleForB" --role-session-name "EC2FromB"

  1. 获取临时凭证并设置环境变量
  2. 当命令在步骤4中完成后,你会获得访问键ID、秘密访问键和会话令牌。你可以从命令输出(stdout)中获取这些值,然后将它们分配给环境变量。

bash
export AWS_ACCESS_KEY_ID=your_access_key_id
export AWS_SECRET_ACCESS_KEY=your_secret_access_key
export AWS_SESSION_TOKEN=your_session_token

现在,你可以使用这些临时凭证在EC2实例上执行操作,访问账户A中的资源。

请注意,这个解决方案的核心思想是利用角色扮演(AssumeRole)机制来实现跨账户访问,同时避免了直接使用访问密钥。

正文完