设置桶策略

桶策略(bukcet policy)可以灵活地配置用户各种操作和访问资源的权限。桶的拥有者拥有PutBucketPolicy操作的权限,如果桶已经被设置了policy,则新的policy会覆盖原有的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生效的条件。 可选

您可以使用 put_bucket_policy 接口设定桶策略,以下代码展示如何设置桶的策略:

def put_bucket_policy(client, bucket_name, principal, action)
  bucket_policy = {
    'Version' => '2012-10-17',
    'Statement' => [
      {
        'Effect' => 'Allow',
        'Principal' => {
          'AWS' => principal
        },
        'Action' => action,
        'Resource' => "arn:aws:s3:::#{bucket_name}/*"
      }
    ]
  }.to_json
  client.put_bucket_policy(
    bucket: bucket_name,
    policy: bucket_policy
  )
  puts 'Bucket policy set.'
rescue StandardError => e
  puts "Error setting bucket policy: #{e.message}"
end