设置桶策略
bucket策略(bukcet policy)可以灵活地配置用户各种操作和访问资源的权限。访问控制列表(access control lists,ACL)只能对单一对象设置权限,而bucket策略可以基于各种条件对一个bucket内的全部或者一组对象配置权限。bucket的所有者拥有PutBucketPolicy操作的权限,如果bucket已经被设置了policy,则新的policy会覆盖原有的policy。
PutBucketPolicy操作可以设置bucket策略,描述bucket策略的信息以JSON格式的字符串形式通过Policy参数传入。一个policy的示例如下:
{
"Id": "PolicyId",
"Version": "2012-10-17",
"Statement" : [{
"Sid": "ExampleStatementID1",
"Principal": [
"arn:aws:iam:::user/userId",
"arn:aws:iam:::user/userName"
],
"Effect": "Allow",
"Action": [
"s3:ListBucket",
"s3:CreateBucket"
],
"Resource": [
"arn:aws:iam:::exampleBucket"
],
"Condition": "some conditions"
},
......
]
}
Statement的内容说明如下:
元素 | 描述 | 是否必要 |
---|---|---|
Sid | statement Id,可选关键字,描述statement的字符串。 | 否 |
Principal | 可选关键字,被授权人,指定本条statement权限针对的Domain以及User,支持通配符“*”,表示所有用户(匿名用户)。当对Domain下所有用户授权时,Principal格式为arn:aws:iam:::user/**。*当对某个User进行授权时,Principal格式为arn:aws:iam:::user/userId或者arn:aws:iam:::user/userName。 | 可选,Principal与NotPrincipal选其一 |
NotPrincipal | 可选关键字,不被授权人,statement匹配除此之外的其他人。取值同Principal。 | 可选,NotPrincipal与Principal选其一 |
Action | 可选关键字,指定本条statement作用的操作,Action字段为媒体存储支持的所有操作集合,以字符串形式表示,不区分大小写。支持通配符“*”,表示该资源能进行的所有操作。例如:“Action”:[“List*”, “Get*"]。 | 可选,Action与NotAction选其一 |
NotAction | 可选关键字,指定一组操作,statement匹配除该组操作之外的其他操作。 取值同Action。 | 可选,NotAction与Action选其一 |
Effect | 必选关键字,效果,指定本条statement的权限是允许还是拒绝,Effect的值必须为Allow或者Deny。 | 必选 |
Resource | 可选关键字,指定statement起作用的一组资源,支持通配符“*”,表示所有资源。 | 可选,Resource与NotResource选其一 |
NotResource | 可选关键字,指定一组资源,statement匹配除该组资源之外的其他资源。 取值同Resource。 | 可选,NotResource与Resource选其一 |
Condition | 可选关键字,本条statement生效的条件。 | 可选 |
代码示例:
using System;
using System.Threading.Tasks;
using Amazon.Runtime;
using Amazon.S3;
using Amazon.S3.Model;
namespace DotNetSDK.BucketOperation
{
public class PutBucketPolicyExample
{
public static async Task PutBucketPolicy()
{
var accessKey = "YOUR_ACCESS_KEY";
var secretKey = "YOUR_SECRET_KEY";
var endpoint = "YOUR_ENDPOINT";
var bucketName = "EXAMPLE_BUCKET";
var policyJsonStr = "POLICY_JSON_STR";
try
{
var credentials = new BasicAWSCredentials(accessKey, secretKey);
var conf = new AmazonS3Config
{
ServiceURL = endpoint
};
var s3Client = new AmazonS3Client(credentials, conf);
var putBucketPolicyRequest = new PutBucketPolicyRequest()
{
BucketName = bucketName,
Policy = policyJsonStr
};
var result = await s3Client.PutBucketPolicyAsync(putBucketPolicyRequest);
if (result.HttpStatusCode != System.Net.HttpStatusCode.OK)
{
Console.WriteLine("fail to put policy to bucket {0}, HttpStatusCode:{1}, ErrorCode:{2}.", bucketName, (int) result.HttpStatusCode, result.HttpStatusCode);
}
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
}
PutBucketPolicyRequest可以设置的参数如下:
参数 | 类型 | 说明 | 是否必要 |
---|---|---|---|
BucketName | string | bucket的名称。 | 是 |
Policy | string | JSON格式的bucket策略信息。 | 是 |
响应结果:
HTTP状态码 | 响应码 | 描述 |
---|---|---|
200 | OK | 操作成功。 |
400 | BadRequest | policy参数错误。 |
403 | Forbidden | 用户没有权限执行操作。 |
404 | NotFound | 操作指定的bucket不存在。 |