AWS IAM角色主体vs角色会话主体:资源策略中角色主体的适用场景
IAM角色ARN在Principal元素中的适用场景
AWS官方文档指出,在IAM政策的Principal元素中指定角色ARN时,需使用如下格式:
"Principal": { "AWS": "arn:aws:iam::AWS-account-ID:role/role-name" }
但在资源型政策(比如S3桶政策)中直接使用该格式作为Principal时,无法为已扮演该角色的主体授权——因为所有IAM操作实际是由角色会话主体(格式如arn:aws:sts::XXXXXXXXXXXX:assumed-role/MyRole/MyRoleSessionName)执行的。
比如下面这个S3桶政策,直接用角色ARN作为Principal,对同一账户下已扮演MyRole的主体完全无效:
{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::XXXXXXXXXXXX:role/MyRole" }, "Action": "s3:ListBucket", "Resource": "arn:aws:s3:::my-bucket" } }
要实现授权,要么指定具体的角色会话ARN:
"Principal": { "AWS": "arn:aws:sts::XXXXXXXXXXXX:assumed-role/MyRole/MyRoleSessionName" }
要么通过Condition元素匹配该角色的所有会话:
{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Principal": { "AWS": "*" }, "Action": "s3:ListBucket", "Resource": "arn:aws:s3:::my-bucket", "Condition": { "ArnEquals": { "aws:PrincipalArn": "arn:aws:iam::XXXXXXXXXXXX:role/MyRole" } } } }
那什么时候才适合在Principal元素中直接使用IAM角色ARN呢?主要有以下两种场景:
- 跨账户授权时,允许对方账户中的角色访问本账户资源
当需要给其他AWS账户中的角色授予访问权限时,可以直接在资源型政策的Principal中写入对方角色的完整ARN。此时AWS会验证请求的角色会话所属的角色是否匹配该ARN,从而实现授权。示例:
{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::OTHER-ACCOUNT-ID:role/TheirCrossAccountRole" }, "Action": "s3:GetObject", "Resource": "arn:aws:s3:::my-bucket/*" } }
- 信任政策(Trust Policy)中指定可扮演该角色的主体
IAM角色的信任政策本身就是用来定义哪些主体可以扮演该角色的,此时必须在Principal中直接使用角色或用户的ARN(或账户ID等)。示例:允许本账户中的MyOtherRole扮演当前角色的信任政策:
{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::MY-ACCOUNT-ID:role/MyOtherRole" }, "Action": "sts:AssumeRole" } }
简单总结:资源型政策的同账户场景下,直接用角色ARN做Principal无效;但跨账户资源授权、以及角色的信任政策中,直接使用角色ARN作为Principal是标准且有效的用法。
内容的提问来源于stack exchange,提问作者mxxk
相关产品推荐
相关产品推荐

