在AWS控制台中传播角色会话名称的技术问题
场景回顾
我有一个供Google Workspace用户使用的IAM角色GoogleWorkspaceIdentityRole(无权限),用户登录后控制台显示身份为GoogleWorkspaceIdentityRole/myemail@example.com。部分用户需要切换到附加AdministratorAccess权限的Administrator角色,当前Administrator的信任策略如下:
{ "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::<ACCOUNT_ID>:role/GoogleWorkspaceIdentityRole" }, "Action": [ "sts:AssumeRole" ], "Condition": { "StringEquals": { "aws:userId": [ "<ROLE_ID>:myemail@example.com", "<ROLE_ID>:otheremail@example.com" ] } } }
切换角色后成功,但控制台未显示会话名称(如邮箱),需要传播该名称用于审计。
解决方案
1. 配置GoogleWorkspaceIdentityRole的权限策略
给GoogleWorkspaceIdentityRole添加权限策略,限制它在扮演Administrator角色时必须使用源会话的邮箱作为新会话名称:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "sts:AssumeRole", "Resource": "arn:aws:iam::<ACCOUNT_ID>:role/Administrator", "Condition": { "StringEquals": { "sts:RoleSessionName": {"Fn:Split": [":", "${aws:userid}"][1]} } } } ] }
这里通过Fn:Split从aws:userid(格式为<ROLE_ID>:邮箱)中提取邮箱部分,强制作为新会话的名称。
2. 更新Administrator角色的信任策略
修改信任策略,同时验证源会话的aws:userId和传递的会话名称,确保只有指定用户能切换并使用正确的会话名:
{ "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::<ACCOUNT_ID>:role/GoogleWorkspaceIdentityRole" }, "Action": "sts:AssumeRole", "Condition": { "StringEquals": { "aws:userId": [ "<ROLE_ID>:myemail@example.com", "<ROLE_ID>:otheremail@example.com" ], "sts:RoleSessionName": [ "myemail@example.com", "otheremail@example.com" ] } } }
3. 控制台切换角色时指定会话名称
用户在控制台切换角色时,在会话名称输入框中填写自己的邮箱(如myemail@example.com)。完成切换后,控制台右上角会显示Administrator/myemail@example.com,会话名称成功传播,满足审计追踪需求。
补充:自动传播的替代方案
如果需要完全自动传递会话名称(无需手动输入),可以使用AWS CLI或SDK调用sts:AssumeRole,通过--role-session-name参数传入源会话的邮箱部分,再用生成的临时凭证登录控制台。例如CLI命令:
aws sts assume-role \ --role-arn arn:aws:iam::<ACCOUNT_ID>:role/Administrator \ --role-session-name myemail@example.com
内容的提问来源于stack exchange,提问作者CoatedMoose

