设置桶策略

您可以使用 putBucketPolicy 接口设定桶策略,桶策略可以灵活地配置用户各种操作和访问资源的权限。访问控制列表只能对单一对象设置权限,而桶策略可以基于各种条件对一个桶内的全部或者一组对象配置权限。桶的拥有者拥有 PutBucketPolicy 操作的权限,如果桶已经设置了 policy ,则新设置的 policy 会覆盖原有的policy。

您需要使用 json 格式的文本字符串指定策略,一个 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生效的条件。 可选

以下代码展示如何设置禁止除了指定用户以外的用户删除桶的策略:

// 以下示例策略禁止除了用户名为exampleuser以外的用户删除桶。
$bucket = '<your-bucket-name>';
try {
    $resp = $s3Client->putBucketPolicy([
        'Bucket' => $bucket,
        'Policy' => '{
          "Version": "2012-10-17",
          "Statement": [
            {
              "Sid": "1",
              "Effect": "Deny",
              "Principal": {
                "AWS": "*"
              },
              "Action": [
                "s3:DeleteBucket"
              ],
              "Resource": [
                "arn:aws:s3:::<your-bucket-name>/*"
              ],
              "Condition":{
                  "StringNotEquals":{
                      "aws:username":["exampleuser"]
                  }
              }
            }
          ]
        }',
    ]);
    echo "Succeed in put a policy on bucket: " . $bucket . "\n";
} catch (AwsException $e) {
    echo $e->getMessage();
    echo "\n";
}

在上传对象时如果不设置对象访问权限,默认下只有对象的拥有者才能访问该对象。如果需要使桶内对象可公共读,可以通过设置桶策略的方式允许桶内对象公共读,以下代码展示如何设置桶内对象可公共读的策略:

// 以下示例策略允许所有用户可读取桶内对象。
$bucket = '<your-bucket-name>';
try {
    $resp = $s3Client->putBucketPolicy([
        'Bucket' => $bucket,
        'Policy' => '{
          "Version": "2012-10-17",
          "Statement": [
            {
              "Sid": "1",
              "Effect": "Allow",
              "Principal": {
                "AWS": "*"
              },
              "Action": [
                "s3:GetObject"
              ],
              "Resource": [
                "arn:aws:s3:::<your-bucket-name>/*"
              ]
            }
          ]
        }',
    ]);
    echo "Succeed in put a policy on bucket: " . $bucket . "\n";
} catch (AwsException $e) {
    echo $e->getMessage();
    echo "\n";
}