我在 s3 存储桶中的图像可供公众访问,这不应该是

Posted

技术标签:

【中文标题】我在 s3 存储桶中的图像可供公众访问,这不应该是【英文标题】:My image in s3 bucket is accessible to public which is not supposed to be 【发布时间】:2017-09-29 14:06:07 【问题描述】:

我面临一个非常奇怪的问题,要么是我缺乏知识,要么是 aws s3 中的错误:

所以我创建了一个任何人都无法在公共场合访问的 s3bucket,然后我将图像放入其中。所以当我尝试那个绝对不是每个人都可以看到的图像时,这是好的。(所以我的存储桶和图像都没有公共访问权限) 然后我向其中添加了以下存储桶策略:


 "Version": "2012-10-17",
 "Id": "Policy1506624486110",
 "Statement": [
   
       "Sid": "Stmt1506624421375",
       "Effect": "Allow",
       "Principal": 
           "AWS": "*"
       ,
       "Action": "s3:GetObject",
       "Resource": "arn:aws:s3:::mybucketname/*"
   
 ]

根据我的理解,此时此图像可以访问所有 aws 资源,但公众中的任何其他人都无法访问。奇怪的是,我看到公共场合的人,任何陌生人都可以访问此图像。谁能解释一下该存储桶策略的神奇之处在于它使公众可以使用它吗?

【问题讨论】:

您是否希望提供对特定 IAM 角色或所有 AWS 服务的访问权限? @VijayanathViswanathan 希望向所有 aws 用户提供访问权限,但不向任何公开的陌生人提供访问权限 @HamedMinaee "AWS": "*" 表示绝对是任何人和每个人。和"*"是一回事。 @Michael-sqlbot thanx,对,这正是它的行为方式,也是迄今为止我唯一能同意的答案。但那为什么一开始就是aws呢?那有什么意义呢? aws 中是否有任何引用说 aws:* 和 * 是一样的? 引用:To grant permission to everyone, also referred as anonymous access, you set the wildcard, "*", as the Principal value. For example, if you configure your bucket as a website, you want all the objects in the bucket to be publicly accessible. The following are equivalent: "Principal":"*" and "Principal":"AWS":"*" 【参考方案1】:

您明确将您的存储桶公开。

要向所有人授予权限(也称为匿名访问),请将通配符“*”设置为 Principal 值。例如,如果您将存储桶配置为网站,您希望存储桶中的所有对象都可以公开访问。以下是等价的:

"Principal":"*"

"Principal":"AWS":"*"

http://docs.aws.amazon.com/AmazonS3/latest/dev/s3-bucket-user-policy-specifying-principal-intro.html

在“开始”处使用 "AWS"(作为 JSON 对象中的对象键)或裸标量字符串 "*" 的选项可能是出于历史原因,其中一种是比其他,但这似乎没有记录在案。对象键是一个权限类型,其他documented values包括"CanonicalUser""Federated""Service"

在策略中使用"*" 的有效用例非常少,除非在策略中使用额外的条件测试来缩小策略的范围。

还要注意* 不是真正的通配符,这里。它只是“每个人”的占位符。您不能在主体中使用它来匹配 ARN 的一部分。例如,"AWS": [ "arn:aws:iam:account-id:user/*" ] 不代表指定账户中的所有 IAM 用户。

当可以使用用户或角色策略完成所需的操作时,最佳实践建议是不要使用存储桶策略。

【讨论】:

【参考方案2】:

您应该特定于校长。您可以提供多个 ARN 而不是“*”。您存储策略生成器以生成策略并指定您希望在委托人中使用的 ARN。下面的链接值得一读,

http://docs.aws.amazon.com/AmazonS3/latest/dev/example-bucket-policies.html

【讨论】:

但是 "AWS":"*" 是否意味着只有 aws 资源才能看到图像?如果是,为什么陌生人也能看到?

以上是关于我在 s3 存储桶中的图像可供公众访问,这不应该是的主要内容,如果未能解决你的问题,请参考以下文章

允许用户访问 S3 存储桶中的一个目录

将对象保存在具有公共访问权限的 AWS S3 存储桶中

S3“拒绝访问”到存储桶

由于 CORS,无法从 S3 存储桶中获取图像

如何从S3存储桶中的文件夹中删除带后缀的图像

AWS S3 拒绝除 1 个用户之外的所有访问 - 存储桶策略