我有3个AWS帐户。帐户A有一个lambda(lambda_Account_A(,帐户B有一个角色(role_Account_B(,而帐户C有一个s3 bucket(s3_Account_C(。帐户C中的资源配置了一个bucket策略,该策略表示Role_account_B可以访问此bucket。
如果帐户A中的lambda扮演帐户B角色(role_Account_B(并生成STS凭据,那么这些凭据是否可以访问帐户C资源s3存储桶?
帐户B和C已配置为相互信任。
账户A lambda代码:
try {
AssumeRoleRequest roleRequest = new AssumeRoleRequest()
.withRoleArn(assumeRole) //arn of the role in account B
.withPolicy(policy) // policy contains "arn:aws:s3:::my_bucket"
.withDurationSeconds(3600)
.withRoleSessionName(SESSION_NAME);
// Assume the IAM role
AssumeRoleResult assumeResult = stsClient.assumeRole(roleRequest);
final BasicSessionCredentials temporaryCredentials = new BasicSessionCredentials(
assumeResult.getCredentials().getAccessKeyId(),
assumeResult.getCredentials().getSecretAccessKey(),
assumeResult.getCredentials().getSessionToken());
return temporaryCredentials;
} catch (AWSSecurityTokenServiceException e) {}
账户C:中的桶策略
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::account_No:role/Account_B_role”
},
"Action": [
"s3:Get*",
],
"Resource": "arn:aws:s3:::my_bucket/*”
}
]
}
角色B权限策略为
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"s3:*"
],
"Resource": "*",
"Effect": "Allow"
}
]
}
它的信任关系包括账户A和账户C
当您在另一个帐户中担任角色时,将被视为您在该帐户中。
只要帐户B对此IAM角色具有访问帐户C中存储桶的IAM权限,它就可以执行这些操作。
为了防止未经授权访问某些权限,您可以使用外部ID进行锁定,这些ID在您担任某个角色时可以选择指定。这允许您通过使用引用sts:ExternalId
的条件来锁定角色IAM策略中的特定权限。
关于外部id的更多信息可以在这篇博客文章中找到。