AWS跨账号Assume角色使用Session Manager访问实例报错如何配置
AWS跨账号SSM Session Manager访问权限配置修复方案
问题根因
你遇到的TerminateSession接口AccessDenied报错,核心原因是权限策略中使用的${aws:username}全局变量在跨账号AssumeRole场景下无法匹配会话ARN:当账号B的IAM用户Assume到账号A的ssm-accoutB-role后,生成的SSM会话名称前缀是AssumeRole时指定的会话名,而非账号B的IAM用户名,导致原策略的资源匹配规则失效。
另外你当前策略中额外附加的sts:AssumeRole权限属于冗余配置,ssm-accoutB-role作为被Assume的角色,自身不需要该权限,还会引入安全风险。
修复步骤
1. 修正账号A中ssm-accoutB-role的权限策略
替换为以下配置,如果你需要精细化控制仅允许操作自己发起的会话,可以将会话资源的通配符替换为arn:aws:ssm:*:*:session/${aws:stsRoleSessionName}-*:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ssm:StartSession" ], "Resource": [ "arn:aws:ec2:<你的实例区域>:<账号A的ID>:instance/*" ], "Condition": { "StringEquals": { "ssm:resourceTag/ssm": "true" } } }, { "Effect": "Allow", "Action": [ "ssm:TerminateSession", "ssm:ResumeSession" ], "Resource": [ "arn:aws:ssm:*:*:session/*" ] } ] }
2. 补充会话操作记录所需配置
如果你需要留存外部账号的操作命令日志,还需要完成以下配置:
- 登录账号A的Systems Manager控制台,进入「会话管理器」-「首选项」,配置会话日志输出到指定S3存储桶或者CloudWatch Logs日志组
- 给EC2实例附加的实例角色补充日志写入权限:如果输出到S3则添加对应存储桶的
s3:PutObject权限,如果输出到CloudWatch Logs则添加logs:CreateLogStream、logs:PutLogEvents权限
3. 配置账号B侧IAM用户的AssumeRole权限
账号B的IAM用户本身需要拥有Assume到账号A角色的权限,给该用户附加如下策略:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "sts:AssumeRole", "Resource": "arn:aws:iam::<账号A的ID>:role/ssm-accoutB-role" } ] }
4. 验证生效
账号B侧用户重新Assume角色获取凭证后,执行以下命令即可正常发起会话:aws ssm start-session --target <目标实例ID> --region <实例所在区域>
内容的提问来源于stack exchange,提问作者Democracii
相关产品推荐
相关产品推荐

