匿名访问的意思未经身份验证的用户可以直接访问资源。
1. 使用存储桶策略设置匿名访问
存储桶策略的介绍
a. 存储桶策略的大小限制为20KB
b. 存储桶策略的文件为JSON格式文件。
c. 策略中的常用元素
<1> 资源:存储桶和对象时您能够允许或拒绝的s3资源。在策略中,使用Amazon资源和名称(ARN)标识资源
<2> 操作:对于每个资源,Amazon s3都支持一组操作。允许(或拒绝)的资源操作通过操作关键字指定
<3> Effect:当用户请求特定操作(可以时允许或拒绝)时的效果。如果没有显示授予(允许)对资源的访问权限,则隐式拒绝访问。您也可显示拒绝资源的访问,这样可确保用户无法访问该资源,即使有其他策略授予了访问权限的情况下也是如此。
<4> Principal:允许访问语句中的操作和资源的账户或用户。在存储桶策略中,委托人式作为权限获得者的用户、账户、服务或其他实体。
当需要设置匿名访问时,须将存储桶策略中的Principal元素指定为通配符(*)。
下面是一个示例存储桶策略。需要使用JSON文件来表示存储桶策略(和用户策略)。该策略授予对一个存储桶中所有对象匿名读取权限。该存储桶中有一条语句,允许对名为examplebucket的存储桶中的对象执行s3:GetObject操作(读取权限)。通过使用通配符(*)指定principal,该策略授予匿名访问权限。
注意:在授予对您的s3存储桶的匿名访问权限时应谨慎使用。如果授予匿名访问权限,那么世界上的任何人都可以访问您的存储桶。所以绝对不要授予对s3存储桶的任何类型的匿名写入权限。
接下来介绍如何通过REST API应用存储桶策略。
PUT Bucket policy
PUT操作是实现使用策略子资源来添加或替换桶上的策略。日过桶上已经有一个策略,这个请求中的会完全取代它。要执行此操作,必须是桶的所有者。
如果你不是桶所有者,但对桶有 PutBucketPolicy权限,s3会返回 405 method Not Allowed;在其他情况下,对于不来自桶所有者的PUT Bucket Policy请求,s3返回403 Access Denied。
1. Requests
a. 语法
b. 请求参数:无
c. 请求头:通用的请求头
d. 请求元素:请求体格式为JSON格式。
2. Responses
a. 响应头:通用响应头
b. 响应元素:返回操作是否成功
c. 特殊错误:无
3. Examples
GET Bucket policy
GET操作是实现使用策略子资源返回指定桶的策略。要使用此操作,必须在指定的桶上具有GetPolicy的权限。你必须是桶的所有者。
如果没有GetPolicy权限,s3将返回403 Access Denied错误。 如果您有正确的权限,但您不是桶所有者,s3返回405Method Not Allowed错误。如果桶没有策略,s3返回404 Policy Not found 错误。
1. Requests
a. 语法
b. 请求参数:无
c. 请求头:通用请求头
d. 请求元素:无
2. Responses
a. 响应头:通用响应头
b. 响应元素:响应主体为指定桶的策略,json格式
c. 特殊错误:无
3. Examples
DELETE Bucket policy
此删除操作的实现使用策略子资源来删除指定桶上的策略。若要使用该操作,
必须在指定的桶上具有删除策略权限,并为桶所有者。
如果没有删除策略权限,s3将返回403Access Denied错误。如果你拥有权限,但不是桶所有者账户的用户,s3将返回405Method Not Allowed错误。如果桶没有策略,Amazon S3返回204无内容错误。
1. Requests
a. 语法
b. 请求参数:无
c. 请求头:通用请求头
d. 请求元素:无
2. Responses
a. 响应头:通用响应头
b. 响应元素:包含删除操作的状态,如果请求失败,则包含错误代码
c. 特殊错误:无
3. Examples
2. 使用acl设置匿名访问
Acl使您可以管理对存储桶和对象的访问权限。每个存储桶和对象都有一个作为子资源而附加的ACL。它定义了哪些AWS账户或组将被授予访问权限以及访问的类型。收到针对某个资源的请求后,Amazon s3将检查相应的ACL以验证请求者是否拥有所需的访问权限。
Acl的格式是xml格式,例如:
示例ACL包含一个可通过AWS账户的规范用户ID识别所有者的Owner元素。Grant元素将识别被授权者(AWS账户或预定义的组)和所授予的权限,此默认的ACL拥有一个适用于所有者的Grant元素。您可以通过添加Grant元素授予权限,每个授权都将被识别被授权者和权限。
注意:ACL最多可以拥有100个授权。
被授权者:被授权者可以是AWS账户或某个预定义的Amazon s3组。您可以使用电子邮件地址或规范用户ID向AWS账户授予权限。但是,如果您在授权请求中提供电子邮件地址,Amazon s3将为该账户查找规范用户ID并将它添加到ACL。生成的ACL将始终包含AWS账户的规范ID,而不是AWS账户的电子邮件地址。
Amazon s3预定义的组:Amazon s3拥有一系列预定义的组。将账户访问权限授予某个组时,您可以指定我们的一个URL,而不是规范用户ID。
1. 经身份验证的用户组
由http://acs.amazonaws.com/groups/global/AuthenticatedUsers表示。该组代表了所有AWS账户。改组的访问许可允许任何AWS账户访问资源。但是,所有的请求必须时已签名的(经身份验证)。 警告:在您为Authenticated Users组授予访问权限后,世界上任何经过身份验证的AWS用户都可以访问您的资源
2. 所有的用户组
由http://acs.amazonaws.com/groups/global/AllUsers表示。授予此组的访问权限将允许世界上的任何人访问资源。请求可以是已签名的(经身份验证),也可以时未签名的(匿名)。未签名的请求将省略请求中的Authentication标头。
警告:如果你公开存储桶(不建议),则任何未经身份验证的用户都可以将对象上传到存储桶。所以强烈建议绝不要向All Users组授予WRITE、Write_ACP或FULL_CONTROL权限。
3. 日志传输组
由http://acs.amazonaws.com/groups/s3/LogDelivery表示。存储桶上的WRITE许可使改组可以将服务器访问日志写入存储桶。
因此,我们可以通过编写ACL,将权限授予给All Users组,实现匿名访问。
如上图红框部分,授予READ权限给All Users组,因此任何用户(包括匿名用户)都可以访问该资源。
对acl操作的相关API。
- GET Bucket acl
- PUT Bucket acl
- Get Object acl
- PUT Object acl
- PUT Object
- PUT Bucket
- PUT object – Copy
- Initiate Multipart Upload
API相关信息和操作可查阅s3 API文档。