设置桶策略

存储桶授权策略(bukcet policy)可以灵活地配置用户各种操作和访问资源的权限。访问控制列表(access control lists,ACL)只能对单一对象设置权限,而存储桶授权策略可以基于各种条件对一个桶内的全部或者一组对象配置权限。桶的拥有者拥有PutBucketPolicy操作的权限,如果同已经被设置了policy,则新的policy会覆盖原有的policy。

  • PutBucketPolicy

    PutBucketPolicy操作可以设置桶策略,描述桶策略的信息以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:::YOUR_BUCKET_NAME"
       ],
         "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生效的条件。 可选

    代码示例:

    def put_bucket_policy(policy):
        try:
            resp = s3_client.put_bucket_policy(
                Bucket='YOUR_BUCKET_NAME',
                Policy='{"Version": "2012-10-17", "Statement": [{ "Sid": "id-1","Effect": "Allow","Principal": {"AWS": "arn:aws:iam::USER/USERNAME"}, "Action": [ "s3:PutObject","s3:PutObjectAcl"], "Resource": ["arn:aws:s3:::YOUR_BUCKET_NAME/*"]}]}'
            )
            print(resp)
        except ClientError as e:
            logging.error(e)