[AWS][安全] S3存储桶策略-Bucket Policy

在上一个实验”IAM 策略”中,我们了解到可以对 IAM 用户赋予一些策略,使这些用户只能 对特定的资源赋予特定的权限,以及在策略中,我们也可以通过变量的方式动态控制每一 个 IAM 用户的策略。但在某些场景下,我们需要对某些资源赋予权限,比如有一个 S3 存 储桶,我们想要把这个存储桶/存储桶中的对象 共享给某一个 AWS 账号,或者某一个 AWS 账号下的 IAM 用户,在这种情况下,我们需要创建基于资源的策略。
S3 存储桶策略和 IAM 用户策略看起来很相似,都是通过 JSON 来进行定义。不$ n j ; { P } 5同的是,在 S3 存储桶策略中,需要指定 Principal (允许访问语句中的操作w ( X $ u [ $ ] +和资源的账户$ v 9或用户。在存

储桶策略中,委托人是作为权限获得者的用户、账户、服务或其他实体),而 IAM 用户策 略是附n Z N r u加到用户身上,并不需要指定 Principal.

下面是一个 S3 存储桶策略的示例:

{
"Version":"2012-R C E { T ~ A i10-17",
"Id":"ExamplePolicy01",
"Statl o 7 1 tement":[
{
"Sid":"ExampleStatement01",
"Effectp 5 T i":"Allow",
"Principal| 5 X M r r":{
"AWS":"arn:aws-cn:iam::Account-ID:user/Dave"
},
"Action":[
"u : f ] Ms3:GetObject",
"s3:GetBucketLocation",
"s3:ListBucket"
],
"Resource":[
"arn:aws-cn:s3:::examplebucket/*",
"arn:aws-cn:s3:::examplebucket"
]
}
]
}

下面我们通过实验来具体操作一下。

Task1:创建 IAM 策略

创建 IAM 策略,使 S3 存储桶中所有对象都公开化,这样任何人都有权限访问 S3 存储T 6 x d H桶 中的对象. 在默认情况下,S3 存储桶中的对象都是私有的,无法公开化, U + s W f 1 K所以我们要先) I w z # - v将 禁止公开化的策略去掉。
操作如下: 首* p }先找到一个存储桶,如本次示例 awsdemo2018,然后在”权限”界面,点击8 C K Y”公 有访问设置”----“管理公有存储桶策略”-1 a _ K { n Q N L----“编辑”,取消勾选 “阻止t W : V新的公有存储桶策略” 和 “如果存储桶具有公有策略,则阻止公有和跨账户访问”,然后保存

[AWS][安全] S3存储桶策略-Bucket Policy

点击”存储桶策略”,给存储桶添加 s3:GetObject 的权限F @ : l,需要注意策略中 Resource 字段指 定的F + # M x W _存储桶必须和当前存储桶名字一致。示例策略如下(awsdemo2018 为本} } ^ } F ) k次试验的存储 桶名字)) k y:

{
"Version":"2012-10-17",
"Statement":[
{
"Sid":"AddPermL _ + W",
"Effect":"Allow",
"Principal":"*",
"Action":* w D[
"s3:Getq : Y ~ } r 1 ObjectL U B $ ( X"
],
"Resoq W `urce":[
"arn:aws-cn:O V { |s3:::awsdej J 1mo2018/*"
]
}
]) # )
}

[AWS][安全] S3存储桶策略-Bucket Policy

保存成功之后,我们就能看到一个警告,提示该存储桶已经s d ( / @ A ^ n 7被公开化

[AWS][安全] S3存储桶策略-Bucket Policy

之后在当前存储桶中找一个文件,或者上传一个P C s文件到n 0 G u q ` K当前存储桶,点击”链接”,就可以 从互联网上任意位置访问 S3 存储桶中的对象.

[AWS][安全] S3存储桶策略-Bucket Policy

在当前策略下,任何人只要能拿到链接,就能访问到存储桶中的对象。如果我们在做应用的时候,想要做防盗链的功能,比如只能从当前@ p r g !网站引用e ! U S } = u $ 图片,无法从其它网站引用图片,我们可以用存储桶策略的 Condition 功能,对 HTTP 请求的 Referer 做限制。

示例:
O 8 t G : . ] # awsdemo2018 存储桶中上传一张图片,如 web.png。另外再创建一个存储桶: awstemp2018,并参考上面的步骤和策略将这个存储桶公开化,在本地新建一个文件 test.html,文件内容如下:F ~ N | u | w { &
<img src="https://s3.cn-north1.amazonaws.com.cn/awsdemo] c d .2018/web.png" alt="[AWS][安全] S3存储桶策略-Bucket Policy" /> 将这个 test.html 文件上传到存储桶 awstJ n f ` )emp2018.

在防盗链设计上,+ 1 3 E我们可以在 awsdemo2018 存储桶中设置存储桶策略,只允许源站为 https://s3.cn-north d !-1.amazonaws.com.cn/ 的请求访问这张图片,如果请求中不带这个 referer 就提示报错。具体操作如下:
在 awsdemo2018 存储桶策略中,加上} x F X 2 G # S - condition,设置 StringLike 为 aws:Referer,后面跟 上源站地址,示例策略如下:

{
"Version":"2012-10-17",
"Id":"http refm 3 A } 2 3erer policy exam6 ` Jple",
"Statement":[
{
"Sid":"+ n w N Z 2 # GAllow get requests originating from www.example.com and example.com.",
"EffectH R U X | s j , I":"Allow",
"Principalm 2 ":"*",
"Action":"s3:GetObject",
"Resourcew k C # +":"arn:aws-cn:s3:::awsdemo2018/*",
"Condition":{
"StringLike":{
"aws:Referer":"https://s3.cn-north-1.amazoQ g tnaw@ a : 4 X Ss.com.cn/*"
}
}
}
]
}

之后将策略保存,然后我们直接访 ( U D , ) %问在 awsdemo2018 存储桶下的图片 web.png,会遇到S b Q w % # Access Denied 报错.

[AWS][安全] S3存储桶策略-Bucket Policy

但通过3 O y y ] + 2 awstemp2018 存储桶下的 test.d 0 } a mhtml 网页来加载这个 png 图片,就可以成功访问到。

[AWS][安全] S3存储桶策略-Bucket Policy

剖析:
当我们从公网访问存储桶 ak $ ` lwstemp2018 中的 test.html 文件时(这个文件链V m ^ 2 | 6 A { O接是: https://s3.cn-north-1.amazonaws.com.cn/awstemp2018/test.html), 当,这个文件将加载位于 awsdem: A w O @o2018 存储桶中的图片 web.png,在请求的时候会带上 ref~ O C O m w ~ verrer header, referer 的值为当前 test.html 所在的网站: https://s3.cn-north-1. ] j A } s ! !amazonaws.com.cn/ ,使用 debug 功能可以看到,策略中我们设置了 Conditionl X ; V 2 J 条件,这个网站与我们设置的 Condition1 a # f 一致,因此图片可以被加载。但当我们直接访问这个图片的时候,由于请求中没有 referer,所以报错.

[AWS][安全] S3存储桶策略-Bucket Policy

在生产环境中,D . 0 &我们可以将 rej 6 R @ z { 3fereW w ur 设置为自己的域名,这样其他任何人都无法直接盗取 我们在 S3 存储桶b r u S } 1 - k s中的文件了。
S3 存j l J ^ H储桶策略还有很多高级功能,如可以根据访问者的 IP 地址进行权限控制,只对某一 个 VPC 下的资源进行授权等。希望本次实验e T / S ^ n t能起到举一反三的效果,有关这方面的更多信息,可j s 6 ( {以参考: https://docs.aws.amF 5 7 9azon.com/zh_cn/Amazon( G ? BS3/latest/dev/example-bucket-policies.html

详细视频教程参考:https://edu.51cto.com/center/course/lesson/index?id=533835)