AWS IAM-一个角色可以扮演另一个角色的身份并且该角色可以再次扮演另一个角色的身份吗?

3

问题与标题相同,我想知道一个角色是否可以扮演另一个角色。

例如: 角色A:由外部账户信任的角色,具有可以扮演任何角色的策略。 角色B:由A扮演,也具有可以扮演角色C的策略。 角色C:具有访问S3存储桶的策略。

2个回答

6

是的,您可以创建扮演其他角色的角色。此过程称为角色链接

当您使用 AWS CLI 或 API 通过一个角色来扮演第二个角色时,就会发生角色链接。

需要记住的关键一点是,一旦 A 扮演 B 的角色,A 的所有权限都会暂时丧失,角色 B 的有效权限将生效。因此,角色 A、B 和 C 的权限不会相加


2
角色链的概念:
您可以获取链中每个角色的会话,然后将每个角色传递给另一个角色,直到达到最终角色。在最终目标帐户上,您将向其传递最终会话(前一个角色的会话),并获取所需的客户端,例如s3iam
使用角色链进行跨帐户访问的场景:
  1. 如果您有三个帐户(主帐户 -> 第二个帐户 -> 第三个帐户),并且您在主帐户中,想要访问第三个帐户,但是您无法这样做,除非您在第二个帐户中扮演一个角色(因为第二个帐户在第三个帐户的角色内部处于信任关系),以便能够到达第三个帐户角色,这将使您获得在第三个帐户上执行任何操作的权限。
  2. 您需要控制组织帐户下的子帐户(该组织帐户位于控制塔中,充当主控制塔帐户“付款人帐户”),以便能够在其中创建任何资源或基础架构。在此处,您可以扮演Oragnization_main_account(payer)的角色,然后从那里扮演子帐户内的角色,然后直接在组织中的每个子帐户上进行所需操作。

-注意:AWS默认在child_organization_accounts上创建了一个名为AWSControlTowerExecution的角色,请参阅AWS文档。

如何使用AWS Boto3 API进行角色链接:

def get_role_client_credentials(session,
                            session_name,
                            role_arn,
                            external_id=""):
client = session.client('sts')
if external_id:
    assumed_role = client.assume_role(RoleArn=role_arn,
                                      RoleSessionName=session_name,
                                      ExternalId=external_id)
else:
    assumed_role = client.assume_role(RoleArn=role_arn,
                                      RoleSessionName=session_name)
return assumed_role['Credentials']




def get_assumed_client(session,
                   client_name,
                   role_arn,
                   session_name,
                   region,
                   external_id=""):
credentials = get_role_client_credentials(session=session,
                                          session_name=session_name,
                                          role_arn=role_arn,
                                          external_id=external_id)

return session.client(client_name,
                      region_name=region,
                      aws_access_key_id=credentials['AccessKeyId'],                         
                    aws_secret_access_key=credentials['SecretAccessKey'],
                      aws_session_token=credentials['SessionToken'])

#### Role Chaining ######

def get_role_session_credentials(session,
                            session_name,
                            role_arn,
                            external_id=""):
client = session.client('sts')
if external_id:
    assumed_role = client.assume_role(RoleArn=role_arn,
                                      RoleSessionName=session_name,
                                      ExternalId=external_id)
else:
    assumed_role = client.assume_role(RoleArn=role_arn,
                                      RoleSessionName=session_name)
return assumed_role['Credentials']


def get_assumed_role_session(session,
                       role_arn,
                       session_name,
                       region,
                       external_id=""):
credentials = get_role_session_credentials(session,
                                          session_name=session_name,
                                          role_arn=role_arn,
                                          external_id=external_id)

return  boto3.session.Session(
                              region_name=region,                                  
                          aws_access_key_id=credentials['AccessKeyId'],                                
                  aws_secret_access_key=credentials['SecretAccessKey'],                                  
                         aws_session_token=credentials['SessionToken']
                              )

- 使用上述辅助函数的方法:

    role_A_arn = f"arn:aws:iam::{second_target_account_id}:role/RoleA"
    assumed_Role_A_session = get_assumed_role_session(session, role_A_arn, 
                                default_session_name, region, external_id="")
    
    role_B_arn = f"arn:aws:iam::{third_target_account_id}:role/RoleB"
    assumed_Role_B_client = get_assumed_client(assumed_Role_A_session, 's3', role_B_arn, different_session_name, region, external_id="")

    assumed_Role_B_client.create_bucket(Bucket='testing-bucket',
                            CreateBucketConfiguration={
                               'LocationConstraint': f'{region}'
                            })

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接