统一身份认证服务 IAM-策略语法:策略参数

时间:2024-03-30 14:40:25

策略参数

策略参数包含Version和Statement两部分,下面介绍策略参数详细说明。了解策略参数后,您可以根据场景自定义策略,如自定义策略使用样例

表1 策略参数说明

参数

含义

Version

策略的版本。

1.1:代表基于策略的访问控制。

Statement:

策略的授权语句

Effect:作用

定义Action中的操作权限是否允许执行。

  • Allow:允许执行。
  • Deny:不允许执行。
说明:

当同一个Action的Effect既有Allow又有Deny时,遵循Deny优先的原则。

Action:授权项

操作权限。

格式为“服务名:资源类型:操作”。授权项支持通配符号*,通配符号*表示所有。

示例:

"obs:bucket:ListAllMybuckets":表示查看OBS桶列表权限,其中obs为服务名,bucket为资源类型,ListAllMybuckets为操作。

您可以在对应服务“API参考”资料中查看该服务所有授权项,如OBS授权项

Condition:条件

使策略生效的特定条件,包括条件键运算符

格式为“条件运算符:{条件键:[条件值1,条件值2]}”。

如果您设置多个条件,同时满足所有条件时,该策略才生效。

示例:

"StringEndWithIfExists":{"g:UserName":["specialCharacter"]}:表示当用户输入的用户名以"specialCharacter"结尾时该条statement生效。

Resource: 资源类型

策略所作用的资源。

格式为“服务名:region:domainId:资源类型:资源路径”, 资源类型支持通配符号*,通配符号*表示所有。支持资源粒度授权的云服务和资源类型参见:支持IAM资源粒度授权的云服务

示例:

  • "obs:*:*:bucket:*": 表示所有的OBS桶。
  • "obs:*:*:object:my-bucket/my-object/*": 表示my-bucket桶my-object目录下的所有对象。
  • 条件键
    条件键表示策略语句的 Condition 元素中的键值。根据适用范围,分为全局条件键和服务条件键。
    • 全局级条件键(前缀为g:)适用于所有操作,IAM提供两种全局条件键:通用全局条件键其他全局条件键
      • 通用全局条件键:在鉴权过程中,云服务不需要提供用户身份信息,IAM将自动获取并鉴权。详情请参见:通用全局条件键
      • 其他全局条件键:在鉴权过程中,IAM通过云服务获取条件信息并鉴权。仅部分已对接的云服务支持其他全局条件键。
    • 服务级条件键(前缀为服务缩写,如obs:)仅适用于对应服务的操作,详情请参见对应云服务的用户指南,如OBS请求条件
    表2 通用全局条件键

    全局条件键

    类型

    说明

    g:CurrentTime

    时间

    接收到鉴权请求的时间。以 ISO 8601 格式表示,例如:2012-11-11T23:59:59Z。示例参见1

    g:DomainName

    字符串

    请求者的账号名称。示例参见2

    g:MFAPresent

    布尔值

    是否使用MFA多因素认证方式获取Token。示例参见3

    g:MFAAge

    数值

    通过MFA多因素认证方式获取的Token的生效时长。该条件需要和g:MFAPresent一起使用。示例参见4

    g:ProjectName

    字符串

    项目名称。示例参见5

    g:ServiceName

    字符串

    服务名称。示例参见6

    g:UserId

    字符串

    IAM用户ID。示例参见7

    g:UserName

    字符串

    IAM用户名。示例参见8

    表3 其他全局条件键

    全局条件键

    类型

    说明

    g:SourceIp

    IP Address

    请求用户的IP地址

    g:SourceVpc

    String

    请求用户的VPC ID

    g:SourceVpce

    String

    请求用户的VPC Endpoint ID

    g:TagKeys

    String

    资源标签键

    g:ResourceTag/{TagKey}

    String

    资源标签键值

    1. g:CurrentTime

      示例:表示用户在北京时间2023年3月1日8点到北京时间2023年3月30日8点可以创建IAM自定义角色。注意:策略中g:CurrentTime条件键值的时间格式为UTC时间。

      {
               "Version": "1.1",
               "Statement": [{
                        "Effect": "Allow",
                        "Action": ["iam:roles:createRoles"],
                        "Condition": {
                                "DateGreaterThan": {
                                         "g:CurrentTime": ["2023-03-01T00:00:00Z"]
                                },
                                "DateLessThan": {
                                         "g:CurrentTime": ["2023-03-30T00:00:00Z"]
                                }
                        }
               }]
      }
    2. g: DomainName

      示例:表示仅有用户zhangsan可以创建自定义角色。

      {
               "Version": "1.1",
               "Statement": [{
                        "Effect": "Allow",
                        "Action": ["iam:roles:createRoles"],
                        "Condition": {
                                "StringEquals": {
                                         "g:DomainName": ["zhangsan"]
                                }
                        }
               }]
      }
    3. g:MFAPresent

      示例:表示请求者获取身份凭证时采用了MFA认证后才可以创建IAM自定义角色。

      {
               "Version": "1.1",
               "Statement": [{
                        "Effect": "Allow",
                        "Action": ["iam:roles:createRoles"],
                        "Condition": {
                                "Bool": {
                                         "g:MFAPresent": ["true"]
                                }
                        }
               }]
      }
    4. g:MFAAge

      示例:表示请求者获取身份凭证时采用了MFA认证的时间必须大于900s才可以创建IAM自定义角色。

      {
               "Version": "1.1",
               "Statement": [{
                        "Effect": "Allow",
                        "Action": ["iam:roles:createRoles"],
                        "Condition": {
                                " NumberGreaterThanEquals ": {
                                         "g:MFAAge": ["900"]
                                }
                        }
               }]
      }
    5. g:ProjectName

      示例:表示请求者获取的凭证范围必须是在北京四时才可以创建IAM自定义角色。

      {
               "Version": "1.1",
               "Statement": [{
                        "Effect": "Allow",
                        "Action": ["iam:roles:createRoles"],
                        "Condition": {
                                " StringEquals ": {
                                         "g: ProjectName ": ["cn-north-4"]
                                }
                        }
               }]
      }
    6. g: ServiceName

      示例:表示用户可访问除IAM之外其他的所有服务,该条件键匹配的值来源于鉴权Action中的Service Name。

      {
               "Version": "1.1",
               "Statement": [{
                        "Action": [
                                "*:*:*"
                        ],
                        "Effect": "Allow",
                        "Condition": {
                                "StringNotEqualsIgnoreCase": {
                                         "g:ServiceName": [
                                                  "iam"
                                         ]
                                }
                        }
               }]
      }
    7. g: UserId

      示例:表示用户ID为xxxxxxxxxxx…的用户才可以创建IAM自定义角色。

      {
               "Version": "1.1",
               "Statement": [{
                        "Effect": "Allow",
                        "Action": ["iam:roles:createRoles"],
                        "Condition": {
                                "StringEquals": {
                                         "g: UserId ": ["xxxxxxxxxxx…"]
                                }
                        }
               }]
      }
    8. g: UserName

      示例:表示用户lisi才可以创建IAM自定义角色。

      {
               "Version": "1.1",
               "Statement": [{
                        "Effect": "Allow",
                        "Action": ["iam:roles:createRoles"],
                        "Condition": {
                                "StringEquals": {
                                         "g: UserName ": ["lisi"]
                                }
                        }
               }]
      }
    • 多值条件键
      1. ForAllValues:测试请求集的每个成员的值是否为条件键集的子集。如果请求中的每个键值均与策略中的至少一个值匹配,则条件返回true。
        {
            "Version": "1.1",
            "Statement": [
                {
                    "Effect": "Allow",
                    "Action": [
                        "ims:images:share"
                    ],
                    "Condition": {
                        "ForAllValues:StringEquals": {
                            "ims:TargetOrgPaths": [
                                "orgPath1",
                                "orgPath2",
                                "orgPath3"
                            ]
                        }
                    }
                }
            ]
        }

        此策略描述的是对于请求者发起共享的组织中所有组织路径必须是orgPath1、orgPath2或者orgPath3,那么允许共享。

        假如请求者想共享镜像给组织路径orgPath1、orgPath3下的成员,策略匹配成功。

        假如请求者想共享镜像给组织路径orgPath1、orgPath2、orgPath3、orgPath4下的成员,策略匹配失败。

      2. ForAnyValue:测试请求值集的至少一个成员是否与条件键值集的至少一个成员匹配。如果请求中的任何一个键值与策略中的任何一个条件值匹配,则条件返回true。对于没有匹配的键或空数据集,条件返回false。
        {
            "Version": "1.1",
            "Statement": [
                {
                    "Effect": "Allow",
                    "Action": [
                        "ims:images:share"
                    ],
                    "Condition": {
                        "ForAnyValue:StringEquals": {
                            "ims:TargetOrgPaths": [
                                "orgPath1",
                                "orgPath2",
                                "orgPath3"
                            ]
                        }
                    }
                }
            ]
        }

        此策略描述的是对于请求者发起共享的组织中任一一个组织路径是orgPath1、orgPath2或者orgPath3,那么允许共享。

        假如请求者想共享镜像给组织路径orgPath1、orgPath4下的成员,策略匹配成功。

        假如请求者想共享镜像给组织路径orgPath4、orgPath5下的成员,策略匹配失败。

    条件键运算逻辑

    图2 条件键运算逻辑示意图
    1. 对于同一条件键的多个条件值,采用OR运算逻辑,即请求值按照条件运算符匹配到任意一个条件值则返回true。

      当运算符表示否定含义的时候(例如:StringNotEquals),则请求值按照条件运算符不能匹配到所有的条件值。

    2. 同一运算符下的不同条件键之间,采用AND运算逻辑。不同运算符之间,采用AND运算逻辑。
support.huaweicloud.com/usermanual-iam/iam_01_0019.html