You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何授权持有AWS IAM密钥的用户对S3存储桶拥有只读访问权限?

问题:如何让任意AWS认证用户访问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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 01:12:08