如何授权持有AWS IAM密钥的用户对S3存储桶拥有只读访问权限?
我希望让持有AWS IAM密钥的用户能够访问若干示例数据集,以学习如何结合数据库使用存储在S3中的数据文件。我记得曾有允许任意认证用户访问的选项,但时隔数年,如今找不到配置方法。
我查阅了AWS官方文档及示例配置,仍未找到所需方案,由于涉及安全问题,特寻求专业建议。
我原本认为以下策略可行,但深入查阅文档后,担心该配置会将对象设为公开:
{ "Id": "Policy1691165563530", "Version": "2012-10-17", "Statement": [ { "Sid": "Allow any AWS authenticated user to get this single file", "Action": [ "s3:GetObject" ], "Effect": "Allow", "Resource": "arn:aws:s3:::your-bucket-name/*", "Principal": { "AWS": [ "*" ] } } ] }
补充:
我认为在Principal设为*的基础上添加条件,可将只读访问限制为仅认证用户。此配置是否正确?
{ "Effect": "Allow", "Principal": "*", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::your-bucket-name/*", "Condition": { "StringLike": { "aws:userId": "AWS:authuser" } } }
解答
关于你第一个策略的安全性
你担心的“把对象设为公开”是多余的。这个策略里Principal: {"AWS": "*"}的含义是允许所有拥有有效AWS凭证的认证用户访问,并非公开给匿名用户。公开访问的判定是Principal: "*"且无任何条件限制,允许任何人(包括没AWS密钥的用户)访问,而你的第一个策略只对持有合法IAM密钥的用户开放,是安全的。
不过要注意:这里的“所有AWS认证用户”包括其他AWS账户的用户,只要他们有有效的IAM密钥就能访问你的S3对象。
你补充的策略存在错误
你写的第二个策略里,aws:userId的格式是固定的,要么是[你的AWS账户ID]:[IAM用户ID],要么是临时凭证对应的AWS:[临时安全令牌ID],根本不存在AWS:authuser这个值。这个条件会导致没有任何用户能通过认证,等于没开访问权限,完全不可行。
正确的配置方案
方案1:直接限定AWS认证用户(推荐)
沿用你第一个策略的思路,这是AWS官方认可的允许所有认证用户访问的方式,安全且简洁:
{ "Id": "AllowAuthenticatedUsersAccess", "Version": "2012-10-17", "Statement": [ { "Sid": "AllowGetObjectForAuthenticatedUsers", "Effect": "Allow", "Principal": { "AWS": "*" }, "Action": "s3:GetObject", "Resource": "arn:aws:s3:::your-bucket-name/*" } ] }
如果只想让自己账户内的IAM用户访问,把Principal改成你的账户ARN即可,比如"AWS": "arn:aws:iam::123456789012:root",然后给账户内的IAM用户附加对应的S3访问权限策略。
方案2:用条件过滤认证用户
如果一定要用Principal: "*"加条件的方式,正确的做法是检查用户的认证类型,比如只允许IAM用户访问:
{ "Id": "AllowAuthenticatedUsersAccess", "Version": "2012-10-17", "Statement": [ { "Sid": "AllowGetObjectForAuthenticatedUsers", "Effect": "Allow", "Principal": "*", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::your-bucket-name/*", "Condition": { "StringEquals": { "aws:PrincipalType": "IAMUser" } } } ] }
这个条件会自动排除匿名用户,只允许持有IAM密钥的认证用户访问。
额外注意事项
- 配置桶策略后,务必检查桶的访问控制列表(ACL),确保没有设置“公开读”权限,否则ACL会优先于桶策略生效,导致对象真的公开。
- 如果你的用户范围是特定群体(比如自己公司的员工),建议优先通过IAM用户组分配权限,而不是开放给所有AWS认证用户,这样安全性更高。
内容的提问来源于stack exchange,提问作者DanR

