更新时间:2024-01-18 GMT+08:00

IAM权限

IAM权限简介

默认情况下,管理员创建的IAM用户没有任何权限,需要将其加入用户组,并给用户组授予策略和角色,才能使得用户组中的用户获得策略定义的权限,这一过程称为授权。授权后,用户就可以基于被授予的权限对云服务进行操作。

对于OBS,IAM权限作用于OBS所有的桶和对象。如果要授予IAM用户操作OBS资源的权限,则需要向IAM用户所属的用户组授予一个或多个OBS权限。

OBS部署时不区分物理区域,为全局级服务。授权时,在全局级服务中设置权限,访问OBS时,不需要切换区域。

根据授权精细程度分为角色和策略。

  • 角色:IAM最初提供的一种根据用户的工作职能定义权限的粗粒度授权机制。该机制以服务为粒度,提供有限的服务相关角色用于授权。由于华为云各服务之间存在业务依赖关系,因此给用户授予角色时,可能需要一并授予依赖的其他角色,才能正确完成业务。角色并不能满足用户对精细化授权的要求,无法完全达到企业对权限最小化的安全管控要求。
  • 策略:IAM最新提供的一种细粒度授权的能力,可以精确到具体服务的操作、资源以及请求条件等。基于策略的授权是一种更加灵活的授权方式,能够满足企业对权限最小化的安全管控要求。例如:针对OBS服务,管理员能够控制IAM用户仅能对某一个桶资源进行指定的管理操作。多数细粒度策略以API接口为粒度进行权限拆分,OBS支持的API授权项请参见权限和授权项说明

由于缓存的存在,对用户、用户组以及企业项目授予OBS相关的角色和策略后,大概需要等待10~15分钟权限才能生效。

IAM中为各云服务预置了系统权限,方便您快速完成基础权限配置,表1为OBS的所有系统权限。

如果系统预置的OBS权限,不满足您的授权要求,可以创建自定义策略。自定义策略中可以添加的授权项(Action)请参考桶相关授权项对象相关授权项

表1 OBS系统权限

系统角色/策略名称

描述

类别

依赖关系

Tenant Administrator

拥有该权限的用户拥有除IAM外,其他所有服务的所有执行权限。

系统角色

Tenant Guest

拥有该权限的用户拥有除IAM外,其他所有服务的只读权限。

系统角色

OBS Administrator

拥有该权限的用户为OBS管理员,可以对账号下的所有OBS资源执行任意操作。

系统角色

OBS Buckets Viewer

拥有该权限的用户可以执行列举桶、获取桶基本信息、获取桶元数据的操作。

系统角色

OBS ReadOnlyAccess

拥有该权限的用户可以执行列举桶、获取桶基本信息、获取桶元数据、列举对象(不包含多版本)的操作。

说明:

拥有该权限的用户如果在控制台上列举对象失败,可能是因为桶中存在多版本对象。此时需要额外授予该用户列举多版本对象的权限(obs:bucket:ListBucketVersions),才能在控制台正常看到对象列表。

系统策略

OBS OperateAccess

拥有该权限的用户可以执行OBS ReadOnlyAccess的所有操作,在此基础上还可以执行上传对象、下载对象、删除对象、获取对象ACL等对象基本操作。

说明:

拥有该权限的用户如果在控制台上列举对象失败,可能是因为桶中存在多版本对象。此时需要额外授予该用户列举多版本对象的权限(obs:bucket:ListBucketVersions),才能在控制台正常看到对象列表。

系统策略

下表列出了OBS常用操作与系统权限的授权关系,您可以参照该表选择合适的系统权限。

表2 OBS操作与资源权限关系

操作名称

Tenant Administrator

Tenant Guest

OBS Administrator

OBS Buckets Viewer

OBS ReadOnlyAccess

OBS OperateAccess

列举桶

可以

可以

可以

可以

可以

可以

创建桶

可以

不可以

可以

不可以

不可以

不可以

删除桶

可以

不可以

可以

不可以

不可以

不可以

获取桶基本信息

可以

可以

可以

可以

可以

可以

管理桶访问权限

可以

不可以

可以

不可以

不可以

不可以

管理桶策略

可以

不可以

可以

不可以

不可以

不可以

修改桶存储类别

可以

不可以

可以

不可以

不可以

不可以

列举对象

可以

可以

可以

不可以

可以

可以

列举多版本对象

可以

可以

可以

不可以

不可以

不可以

上传文件

可以

不可以

可以

不可以

不可以

可以

新建文件夹

可以

不可以

可以

不可以

不可以

可以

删除文件

可以

不可以

可以

不可以

不可以

可以

删除文件夹

可以

不可以

可以

不可以

不可以

可以

下载文件

可以

可以

可以

不可以

不可以

可以

删除多版本文件

可以

不可以

可以

不可以

不可以

可以

下载多版本文件

可以

可以

可以

不可以

不可以

可以

修改对象存储类别

可以

不可以

可以

不可以

不可以

不可以

恢复文件

可以

不可以

可以

不可以

不可以

不可以

取消删除文件

可以

不可以

可以

不可以

不可以

可以

删除碎片

可以

不可以

可以

不可以

不可以

可以

管理对象访问权限

可以

不可以

可以

不可以

不可以

不可以

设置对象元数据

可以

不可以

可以

不可以

不可以

不可以

获取对象元数据

可以

可以

可以

不可以

不可以

可以

管理多版本控制

可以

不可以

可以

不可以

不可以

不可以

管理日志记录

可以

不可以

可以

不可以

不可以

不可以

管理标签

可以

不可以

可以

不可以

不可以

不可以

管理生命周期规则

可以

不可以

可以

不可以

不可以

不可以

管理静态网站托管

可以

不可以

可以

不可以

不可以

不可以

管理CORS规则

可以

不可以

可以

不可以

不可以

不可以

管理防盗链

可以

不可以

可以

不可以

不可以

不可以

域名管理

可以

不可以

可以

不可以

不可以

不可以

管理跨区域复制

可以

不可以

可以

不可以

不可以

不可以

管理图片处理

可以

不可以

可以

不可以

不可以

不可以

追加写对象

可以

不可以

可以

不可以

不可以

可以

设置对象ACL

可以

不可以

可以

不可以

不可以

不可以

设置指定版本对象ACL

可以

不可以

可以

不可以

不可以

不可以

获取对象ACL

可以

可以

可以

不可以

不可以

可以

获取指定版本对象ACL

可以

可以

可以

不可以

不可以

可以

多段上传

可以

不可以

可以

不可以

不可以

可以

列举已上传段

可以

可以

可以

不可以

不可以

可以

取消多段上传任务

可以

不可以

可以

不可以

不可以

可以

IAM权限应用场景

IAM权限主要面向对同账号下IAM用户授权的场景:

  • 使用策略控制账号下整个云资源的权限时,使用IAM权限授权。
  • 使用策略控制账号下OBS所有的桶和对象的权限时,使用IAM权限授权。
  • 使用策略控制账号下OBS指定资源的权限时,使用IAM权限授权。

策略结构&语法

策略结构包括:Version(策略版本号)和Statement(策略权限语句),其中Statement可以有多个,表示不同的授权项。

图1 策略结构

策略语法,示例:

{
	"Version": "1.1",
	"Statement": [
                {
			"Effect": "Allow",
			"Action": [
				"obs:bucket:HeadBucket",
				"obs:bucket:ListBucket",
				"obs:bucket:GetBucketLocation"
			],
			"Resource": [
				"obs:*:*:bucket:*"
			],
			"Condition": {
				"StringEndWithIfExsits": {
					"g:UserName": ["specialCharacter"]
				},
				"Bool": {
					"g:MFAPresent": ["true"]
				}
			}
		}
	]
}
表3 策略语法参数

参数

说明

Version

标识策略的版本号:
  • 1.0:RBAC策略。RBAC策略是将服务作为一个整体进行授权,授权后,用户可以拥有这个服务的所有权限。
  • 1.1:细粒度策略。相比RBAC策略,细粒度策略基于服务的API接口进行权限拆分,授权更加精细,可以精确到具体操作和具体资源。例如:您可以限制子用户只能访问某一个OBS桶中某一个目录下的对象。

Statement

策略授权语句,描述策略的详细信息,包含Effect(效果)、Action(动作)、Resource(资源)和Condition(条件)。其中Resource和Condition为可选。
  • Effect(效果)

    作用包含两种:Allow(允许)和Deny(拒绝),系统预置策略仅包含允许的授权语句,自定义策略中可以同时包含允许和拒绝的授权语句,当策略中既有允许又有拒绝的授权语句时,遵循Deny优先的原则。

  • Action(动作)

    对资源的具体操作权限,格式为:服务名:资源类型:操作,支持单个或多个操作权限,支持通配符号*,通配符号表示所有。OBS只有两种资源类型:bucket和object。

    详细的Action描述请参见桶相关授权项对象相关授权项

  • Resource(资源)

    策略所作用的资源,格式为:服务名:region:domainId:资源类型:资源路径,支持通配符号*,通配符号表示所有。在JSON视图中,不带Resource表示对所有资源生效。

    Resource支持以下字符:-_0-9a-zA-Z*./\,如果Resource中包含不支持的字符,请采用通配符号*。

    OBS是全局级服务,region填“*”;domainId表示资源拥有者的账号ID,建议填写“*”简单地表示所填资源的账号ID。

    示例:

    • "obs:*:*:bucket:*": 表示所有的OBS桶。
    • "obs:*:*:object:my-bucket/my-object/*": 表示桶my-bucket中“my-object”目录下的所有对象。
  • Condition(条件)

    您可以在创建自定义策略时,通过添加Condition元素来控制策略何时生效。Condition包括条件键和运算符,条件键表示策略语句的Condition元素,分为全局级条件键和服务级条件键。全局级条件键(前缀为g:)适用于所有操作,服务级条件键(前缀为服务缩写,如obs:)仅适用于对应服务的操作。运算符与条件键一起使用,构成完整的条件判断语句。

    OBS通过IAM预置了一组条件键,例如,您可以先使用obs:SourceIp条件键检查请求者的IP地址,然后再允许执行操作。

    OBS支持的条件键和运算符与桶策略的Condition一致,在IAM配置时需要在前面加上“obs:”。详细的Condition介绍请参见桶策略参数说明

    Condition的条件值仅支持以下字符:-,./ a-zA-Z0-9_@#$%&,如果条件值中包含不支持的字符,请考虑使用模糊匹配的条件运算符,如:StringMatch等。

    示例:

    • "StringEndWithIfExists":{"g:UserName":["specialCharacter"]}:表示当用户输入的用户名以"specialCharacter"结尾时该条statement生效。
    • "StringLike":{"obs:prefix":["private/"]}:表示在列举桶内对象时,需要指定prefix为private/或者包含private/这一子字符串。
  • Resource(资源)级别细粒度授权特性会逐步在各个区域上线,需要使用该特性时请确保桶所在区域已经支持。
  • 使用Resource(资源)级别细粒度授权特性前,请提交工单到OBS,申请开通Resource(资源)级别细粒度授权特性白名单。

OBS自定义策略样例

  • 示例1:给用户授予OBS的所有权限

    此策略表示用户可以对OBS进行任何操作,使用方式包括API、SDK、控制台及工具。

    由于用户登录OBS控制台时,会访问一些其他服务的资源,如CTS审计信息,CDN加速域名,KMS密钥等。因此除了配置OBS的权限外,还需要配置其他服务的访问权限。其中CDN属于全局服务,CTS、KMS等属于区域级服务,需要根据您实际使用到的服务和区域分别在全局项目和对应区域项目中配置Tenant Guest权限。
    {
        "Version": "1.1",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": [
                    "obs:*:*"
                ]
            }
        ]
    }
  • 示例2:给用户授予桶的只读权限(不限定目录)
    此策略表示用户可以对桶obs-example下的所有对象进行列举和下载。
    {
        "Version": "1.1",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": [
                    "obs:object:GetObject",
                    "obs:bucket:ListBucket"
                ],
                "Resource": [
                    "obs:*:*:object:obs-example/*",
                    "obs:*:*:bucket:obs-example"
                ]
            }
        ]
    }
  • 示例3:给用户授予桶的只读权限(限定目录)
    此策略表示用户只能下载桶obs-example中“my-project/”目录下的所有对象,其他目录下的对象虽然可以列举,但无法下载。
    {
        "Version": "1.1",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": [
                    "obs:object:GetObject",
                    "obs:bucket:ListBucket"
                ],
                "Resource": [
                    "obs:*:*:object:obs-example/my-project/*",
                    "obs:*:*:bucket:obs-example"
                ]
            }
        ]
    }
  • 示例4:给用户授予桶的读写权限(限定目录)
    此策略表示用户可以对桶obs-example中“my-project”目录下的所有的对象进行列举、下载、上传和删除。
    {
        "Version": "1.1",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": [
                    "obs:object:GetObject",
                    "obs:object:ListMultipartUploadParts",
                    "obs:bucket:ListBucket",
                    "obs:object:DeleteObject",
                    "obs:object:PutObject"
                ],
                "Resource": [
                    "obs:*:*:object:obs-example/my-project/*",
                    "obs:*:*:bucket:obs-example"
                ]
            }
        ]
    }
  • 示例5:给用户授予桶的所有权限
    此策略表示用户可以对桶obs-example进行任何操作。
    {
        "Version": "1.1",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": [
                    "obs:*:*"
                ],
                "Resource": [
                    "obs:*:*:bucket:obs-example",
                    "obs:*:*:object:obs-example/*"
                ]
            }
        ]
    }
  • 示例6:拒绝用户上传对象

    拒绝策略需要同时配合其他策略使用,否则没有实际作用。用户被授予的策略中,一个授权项的作用如果同时存在Allow和Deny,则遵循Deny优先原则

    如果您给用户授予OBS OperateAccess的系统策略,但不希望用户拥有OBS OperateAccess中定义的上传对象的权限,您可以创建一条拒绝上传对象的自定义策略,然后同时将OBS OperateAccess和拒绝策略授予用户,根据Deny优先原则,则用户可以执行除了上传对象外OBS OperateAccess允许的所有操作。拒绝策略示例如下:

    {
        "Version": "1.1",
        "Statement": [
            {
                "Effect": "Deny",
                "Action": [
                    "obs:object:PutObject"
                ]
            }
        ]
    }
  • 示例7:给用户授予指定桶的修改桶存储类别权限以及桶内指定对象的删除权限

    此策略表示用户可以对桶obs-example进行修改桶存储类别,以及对桶obs-example中“my-object.txt”对象进行删除。

    {
        "Version": "1.1",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": [
                    "obs:bucket:ListAllMyBuckets",
                    "obs:bucket:ListBucket"
                ]
            },
            {
                "Effect": "Allow",
                "Action": [
                    "obs:object:DeleteObject",
                    "obs:bucket:PutBucketStoragePolicy"
                ],
                "Resource": [
                    "OBS:*:*:object:obs-example/my-object.txt",
                    "OBS:*:*:bucket:obs-example"
                ]
            }
        ]
    }