searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

对象桶权限管理介绍

2022-12-22 08:05:10
71
0

权限分类

权限

在对象桶上授权时

在对象上授权时

READ

允许被授权者列出存储桶中的对象

允许被授权者读取对象数据及其元数据

WRITE

允许被授权者在存储桶中创建新对象。对于现有对象的存储桶和对象所有者,还允许删除和覆写这些对象

不适用

READ_ACP

允许被授权者读取存储桶 ACL,可以查看桶的访问控制信息

允许被授权者读取对象 ACL

WRITE_ACP

允许被授权者为适用的存储桶编写 ACL,可以修改桶的访问控制信息

允许被授权者为适用的对象编写 ACL

FULL_CONTROL

允许被授权者在存储桶上的 READ、WRITE、READ_ACP 和 WRITE_ACP 许可

允许被授权者在对象上的 READ、READ_ACP 和 WRITE_ACP 许可

 

被授权对象

被授权者可以是某个对象用户或某个预定义的用户组。可以使用用户 ID或用户邮箱, 向用户授予权限。如果在设置授权时使用邮箱地址,对象存储会根据邮箱地址找到用户ID,把用户ID添加到 ACL。即生成的ACL会是用户 ID,而不是邮箱地址。

设置访问权限时,可以将每个被授权者指定为一个 type,其中 type(类型)为以下值之一:

  • id使用用户ID来指定用户
  • emailAddress使用用户邮箱来指定用户
  • uri使用预定义用户组来设置权限

常用预定义组有:

  • AuthenticatedUsers组,uri为 http://acs.amazonaws.com/groups/global/AuthenticatedUsers。该组代表了所有认证用户,授予该组的访问权限允许任何认证用户访问资源。但是,向桶或对象发送请求时必须时必须带上签名,以经验证用户的合法身份。
  • AllUsers组,uri为http://acs.amazonaws.com/groups/global/AllUsers。授予此组的访问权限将允许任何人访问资源,包含认证用户和匿名用户。请求时可以带上签名(认证用户请求),也可以不用签名(匿名用户请求)。未签名的请求将省略请求中的 Authentication 标头。该用户组权限慎用

 

ACL注意事项:

  • 桶的授权设置为全量覆盖。每次设置权限,都会用新的授权来完全替换旧的授权,而不是增量合并的。如果要为新的用户增加权限,而不删除已有的用户权限,需要先查询出已有的权限,再和新用户权限拼接成新的完整的ACL,再进行权限设置。
  • 授权最多设置100条。
  • ACL不检查权限是否重复、用户是否重复。如果为用户A设置了READ权限,又设置了FULL_CONTROL权限,对象存储不会自动将用户A的权限合并为一条FULL_CONTROL权限,用户A会占用2条授权。如果在设置ACL时,不小心设置了多条重复的权限,比如设置了2次用户A的READ权限,权限依然不会合并,仍然占用2条授权。

 

标准 ACL

对象存储支持一些预定义的授权,称为标准 ACL。每个标准 ACL 都有一组预定义的被授权者和指定权限。部分标准 ACL 及其预定义授权说明如下表(所有者即桶的owner):

标准ACL

添加到ACL的权限

private

所有者将获得 FULL_CONTROL 权限。其他人没有访问权限 。(默认,创建桶时如果不指定ACL,将以此种标准ACL设置桶的权限)

public-read

所有者将获得 FULL_CONTROL 权限。AllUsers组将获得 READ 权限。

public-read-write

所有者将获得 FULL_CONTROL 权限。AllUsers组将获得 READ 和 WRITE 权限。通常不建议在桶上授予该权限。

authenticated-read

所有者将获得 FULL_CONTROL。AuthenticatedUsers组将获得 READ 权限。

注意:使用标准ACL设置桶的权限时,只能指定一个标准ACL,并且会覆盖之前已设置的访问控制权限。

 

ACL设置请求样例

boto3插件对对象存储请求做了封装,只需要配置好一些诸如对象网关链接、用户密钥、桶名等,再在执行具体操作请求的时候输入请求参数即可,不需要自己组装xml格式的请求参数、生成签名等。

 

  1. 创建桶

我们使用用户user1的密钥,创建一个名为bucket01的桶,然后查看桶的owner和ACL信息,代码如下:

# -*- coding: utf-8 -*-
from boto3 import resource
from botocore.config import Config
from botocore import UNSIGNED

rgw_url = 'http://ip:port'  # 可正常访问的对象网关链接
ak = "xxx"  # 用户user1的access_key
sk = "xxxxxx"  # 用户user1的secret_key
s3 = resource('s3', use_ssl=False, endpoint_url=rgw_url,
              aws_access_key_id=ak, aws_secret_access_key=sk,
              config=Config(s3={'addressing_style': 'path'}))
bucket_name = 'bucket01'
b = s3.Bucket(bucket_name)
b.create()

def get_acl():
    o = s3.BucketAcl(bucket_name)
    print 'Owner: ', o.owner
    print 'Grants: '
    for g in o.grants:
        print g

get_acl()

执行以上代码,得到输出结果:

可以看到桶的owner为user1,ACL中只有user1拥有FULL_CONTROL权限,没有其他用户或用户组拥有权限。

 

  1. 为指定用户设置权限

修改桶的权限,为user2赋予桶的READ权限,然后查看ACL。代码如下:

def put_acl():
    grants = [
        {'Grantee': {'EmailAddress': '', 'Type': 'CanonicalUser', 'ID': 'user2'},
         'Permission': 'READ'}
    ]
    o = s3.BucketAcl(bucket_name)
    o.put(
        AccessControlPolicy={
            'Owner': {
                'DisplayName': 'user1',
                'ID': 'user1'
            },
            'Grants': grants
        }
    )

put_acl()
get_acl()

执行以上代码,得到输出结果:

修改桶的授权后,user2拥有了READ权限,但是桶的所有者user1的权限不在ACL中了,这是因为ACL被新的覆盖了。但是,即使不在ACL中声明桶的所有者的权限,所有者依然拥有桶的FULL_CONTROL权限。

 

  1. 使用邮箱、用户组设置权限

前面讲到设置权限时,type有3种类型,包含用户ID、邮箱、用户组,上面的例子使用的是用户ID设置权限。接下来介绍如何使用邮箱和用户组来设置桶的权限。

设置权限时,user3使用邮箱,并为AuthenticatedUsers组赋予WRITE权限,AllUsers组赋予READ权限。

def put_acl():
    grants = [
        {'Grantee': {'Type': 'CanonicalUser', 'ID': 'user2'},
         'Permission': 'READ'},
        {'Grantee': {'EmailAddress': 'user3@qq.com', 'Type': 'AmazonCustomerByEmail'},
         'Permission': 'WRITE'},
        {'Grantee': {'Type': 'Group', 'URI': 'http://acs.amazonaws.com/groups/global/AuthenticatedUsers'},
         'Permission': 'WRITE'},
        {'Grantee': {'Type': 'Group', 'URI': 'http://acs.amazonaws.com/groups/global/AllUsers'},
         'Permission': 'READ'}
    ]
    o = s3.BucketAcl(bucket_name)
    o.put(
        AccessControlPolicy={
            'Owner': {
                'DisplayName': 'user1',
                'ID': 'user1'
            },
            'Grants': grants
        }
    )


put_acl()
get_acl()

输出结果如下:

可以看到ACL中包含了user3的ID信息,对象存储根据用户邮箱查找到对应用户的信息,将ID写入ACL中。两个用户组的权限也设置成功。

 

  1. 匿名用户请求

在上一步中,已经为桶设置了AllUsers组的READ权限,此时可以使用不带签名的请求(称为匿名用户请求),来读取桶中的对象列表信息。先上传一些对象到桶中,再执行以下代码:

from botocore import UNSIGNED

rgw_url = 'http://192.168.56.13:7480'
s3 = resource('s3', use_ssl=False, endpoint_url=rgw_url,
              config=Config(s3={'addressing_style': 'path'},

signature_version=UNSIGNED))
bucket_name = 'bucket01'
b = s3.Bucket(bucket_name)

for obj in b.objects.all():
    print obj

注意匿名用户的resource配置和普通认证用户的配置不一样。输出结果:

未使用密钥生成签名,仍然读取到了对象桶中的对象信息。输出的obj为boto3封装的对象,其中的key即为对象的key。

 

  1. 设置标准ACL

在上面的设置ACL代码中,都是通过AccessControlPolicy参数来设置具体的ACL,接下来看一下如何设置标准ACL,然后查看授权后的ACL列表。

ACL=private:

def put_acl():
    o = s3.BucketAcl(bucket_name)
    o.put(ACL='private')

put_acl()
get_acl()

输出结果:

可以看到,设置标准ACL=private后,只有所有者拥有FULL_CONTROL权限,之前设置的权限已经被覆盖了。

其他几种标准ACL的设置方式一样,这里不再贴代码,对应的ACL列表如下:

ACL=public-read:

ACL=public-read-write:

ACL=authenticated-read:

总结

    以上就是对象桶的权限介绍,以及如何使用python的boto3来设置桶权限。在实际环境中,根据具体情况,使用用户和预定义用户组灵活设置权限,还可以直接指定标准ACL进行授权。设置前要注意是否要保留原有ACL,还有Allusers用户组的权限赋予需要慎重。

0条评论
0 / 1000
重命名
2文章数
1粉丝数
重命名
2 文章 | 1 粉丝
重命名
2文章数
1粉丝数
重命名
2 文章 | 1 粉丝
原创

对象桶权限管理介绍

2022-12-22 08:05:10
71
0

权限分类

权限

在对象桶上授权时

在对象上授权时

READ

允许被授权者列出存储桶中的对象

允许被授权者读取对象数据及其元数据

WRITE

允许被授权者在存储桶中创建新对象。对于现有对象的存储桶和对象所有者,还允许删除和覆写这些对象

不适用

READ_ACP

允许被授权者读取存储桶 ACL,可以查看桶的访问控制信息

允许被授权者读取对象 ACL

WRITE_ACP

允许被授权者为适用的存储桶编写 ACL,可以修改桶的访问控制信息

允许被授权者为适用的对象编写 ACL

FULL_CONTROL

允许被授权者在存储桶上的 READ、WRITE、READ_ACP 和 WRITE_ACP 许可

允许被授权者在对象上的 READ、READ_ACP 和 WRITE_ACP 许可

 

被授权对象

被授权者可以是某个对象用户或某个预定义的用户组。可以使用用户 ID或用户邮箱, 向用户授予权限。如果在设置授权时使用邮箱地址,对象存储会根据邮箱地址找到用户ID,把用户ID添加到 ACL。即生成的ACL会是用户 ID,而不是邮箱地址。

设置访问权限时,可以将每个被授权者指定为一个 type,其中 type(类型)为以下值之一:

  • id使用用户ID来指定用户
  • emailAddress使用用户邮箱来指定用户
  • uri使用预定义用户组来设置权限

常用预定义组有:

  • AuthenticatedUsers组,uri为 http://acs.amazonaws.com/groups/global/AuthenticatedUsers。该组代表了所有认证用户,授予该组的访问权限允许任何认证用户访问资源。但是,向桶或对象发送请求时必须时必须带上签名,以经验证用户的合法身份。
  • AllUsers组,uri为http://acs.amazonaws.com/groups/global/AllUsers。授予此组的访问权限将允许任何人访问资源,包含认证用户和匿名用户。请求时可以带上签名(认证用户请求),也可以不用签名(匿名用户请求)。未签名的请求将省略请求中的 Authentication 标头。该用户组权限慎用

 

ACL注意事项:

  • 桶的授权设置为全量覆盖。每次设置权限,都会用新的授权来完全替换旧的授权,而不是增量合并的。如果要为新的用户增加权限,而不删除已有的用户权限,需要先查询出已有的权限,再和新用户权限拼接成新的完整的ACL,再进行权限设置。
  • 授权最多设置100条。
  • ACL不检查权限是否重复、用户是否重复。如果为用户A设置了READ权限,又设置了FULL_CONTROL权限,对象存储不会自动将用户A的权限合并为一条FULL_CONTROL权限,用户A会占用2条授权。如果在设置ACL时,不小心设置了多条重复的权限,比如设置了2次用户A的READ权限,权限依然不会合并,仍然占用2条授权。

 

标准 ACL

对象存储支持一些预定义的授权,称为标准 ACL。每个标准 ACL 都有一组预定义的被授权者和指定权限。部分标准 ACL 及其预定义授权说明如下表(所有者即桶的owner):

标准ACL

添加到ACL的权限

private

所有者将获得 FULL_CONTROL 权限。其他人没有访问权限 。(默认,创建桶时如果不指定ACL,将以此种标准ACL设置桶的权限)

public-read

所有者将获得 FULL_CONTROL 权限。AllUsers组将获得 READ 权限。

public-read-write

所有者将获得 FULL_CONTROL 权限。AllUsers组将获得 READ 和 WRITE 权限。通常不建议在桶上授予该权限。

authenticated-read

所有者将获得 FULL_CONTROL。AuthenticatedUsers组将获得 READ 权限。

注意:使用标准ACL设置桶的权限时,只能指定一个标准ACL,并且会覆盖之前已设置的访问控制权限。

 

ACL设置请求样例

boto3插件对对象存储请求做了封装,只需要配置好一些诸如对象网关链接、用户密钥、桶名等,再在执行具体操作请求的时候输入请求参数即可,不需要自己组装xml格式的请求参数、生成签名等。

 

  1. 创建桶

我们使用用户user1的密钥,创建一个名为bucket01的桶,然后查看桶的owner和ACL信息,代码如下:

# -*- coding: utf-8 -*-
from boto3 import resource
from botocore.config import Config
from botocore import UNSIGNED

rgw_url = 'http://ip:port'  # 可正常访问的对象网关链接
ak = "xxx"  # 用户user1的access_key
sk = "xxxxxx"  # 用户user1的secret_key
s3 = resource('s3', use_ssl=False, endpoint_url=rgw_url,
              aws_access_key_id=ak, aws_secret_access_key=sk,
              config=Config(s3={'addressing_style': 'path'}))
bucket_name = 'bucket01'
b = s3.Bucket(bucket_name)
b.create()

def get_acl():
    o = s3.BucketAcl(bucket_name)
    print 'Owner: ', o.owner
    print 'Grants: '
    for g in o.grants:
        print g

get_acl()

执行以上代码,得到输出结果:

可以看到桶的owner为user1,ACL中只有user1拥有FULL_CONTROL权限,没有其他用户或用户组拥有权限。

 

  1. 为指定用户设置权限

修改桶的权限,为user2赋予桶的READ权限,然后查看ACL。代码如下:

def put_acl():
    grants = [
        {'Grantee': {'EmailAddress': '', 'Type': 'CanonicalUser', 'ID': 'user2'},
         'Permission': 'READ'}
    ]
    o = s3.BucketAcl(bucket_name)
    o.put(
        AccessControlPolicy={
            'Owner': {
                'DisplayName': 'user1',
                'ID': 'user1'
            },
            'Grants': grants
        }
    )

put_acl()
get_acl()

执行以上代码,得到输出结果:

修改桶的授权后,user2拥有了READ权限,但是桶的所有者user1的权限不在ACL中了,这是因为ACL被新的覆盖了。但是,即使不在ACL中声明桶的所有者的权限,所有者依然拥有桶的FULL_CONTROL权限。

 

  1. 使用邮箱、用户组设置权限

前面讲到设置权限时,type有3种类型,包含用户ID、邮箱、用户组,上面的例子使用的是用户ID设置权限。接下来介绍如何使用邮箱和用户组来设置桶的权限。

设置权限时,user3使用邮箱,并为AuthenticatedUsers组赋予WRITE权限,AllUsers组赋予READ权限。

def put_acl():
    grants = [
        {'Grantee': {'Type': 'CanonicalUser', 'ID': 'user2'},
         'Permission': 'READ'},
        {'Grantee': {'EmailAddress': 'user3@qq.com', 'Type': 'AmazonCustomerByEmail'},
         'Permission': 'WRITE'},
        {'Grantee': {'Type': 'Group', 'URI': 'http://acs.amazonaws.com/groups/global/AuthenticatedUsers'},
         'Permission': 'WRITE'},
        {'Grantee': {'Type': 'Group', 'URI': 'http://acs.amazonaws.com/groups/global/AllUsers'},
         'Permission': 'READ'}
    ]
    o = s3.BucketAcl(bucket_name)
    o.put(
        AccessControlPolicy={
            'Owner': {
                'DisplayName': 'user1',
                'ID': 'user1'
            },
            'Grants': grants
        }
    )


put_acl()
get_acl()

输出结果如下:

可以看到ACL中包含了user3的ID信息,对象存储根据用户邮箱查找到对应用户的信息,将ID写入ACL中。两个用户组的权限也设置成功。

 

  1. 匿名用户请求

在上一步中,已经为桶设置了AllUsers组的READ权限,此时可以使用不带签名的请求(称为匿名用户请求),来读取桶中的对象列表信息。先上传一些对象到桶中,再执行以下代码:

from botocore import UNSIGNED

rgw_url = 'http://192.168.56.13:7480'
s3 = resource('s3', use_ssl=False, endpoint_url=rgw_url,
              config=Config(s3={'addressing_style': 'path'},

signature_version=UNSIGNED))
bucket_name = 'bucket01'
b = s3.Bucket(bucket_name)

for obj in b.objects.all():
    print obj

注意匿名用户的resource配置和普通认证用户的配置不一样。输出结果:

未使用密钥生成签名,仍然读取到了对象桶中的对象信息。输出的obj为boto3封装的对象,其中的key即为对象的key。

 

  1. 设置标准ACL

在上面的设置ACL代码中,都是通过AccessControlPolicy参数来设置具体的ACL,接下来看一下如何设置标准ACL,然后查看授权后的ACL列表。

ACL=private:

def put_acl():
    o = s3.BucketAcl(bucket_name)
    o.put(ACL='private')

put_acl()
get_acl()

输出结果:

可以看到,设置标准ACL=private后,只有所有者拥有FULL_CONTROL权限,之前设置的权限已经被覆盖了。

其他几种标准ACL的设置方式一样,这里不再贴代码,对应的ACL列表如下:

ACL=public-read:

ACL=public-read-write:

ACL=authenticated-read:

总结

    以上就是对象桶的权限介绍,以及如何使用python的boto3来设置桶权限。在实际环境中,根据具体情况,使用用户和预定义用户组灵活设置权限,还可以直接指定标准ACL进行授权。设置前要注意是否要保留原有ACL,还有Allusers用户组的权限赋予需要慎重。

文章来自个人专栏
存储知识分享
2 文章 | 2 订阅
0条评论
0 / 1000
请输入你的评论
0
0