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

策略语法

下面以OBS的自定义策略为例,说明策略的语法。

{
    "Version": "1.1",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "obs:bucket:ListAllMyBuckets",
                "obs:bucket:HeadBucket",
                "obs:bucket:ListBucket",
                "obs:bucket:GetBucketLocation"
            ],
            "Condition": {
                "StringEndWithIfExists": {
                    "g:UserName": [
                        "specialCharacter"
                    ]
                },
                "Bool": {
                    "g:MFAPresent": [
                        "true"
                    ]
                }
            },
            "Resource": [
                "obs:*:*:bucket:*"
            ]
        }
    ]
}

策略结构

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

图1 策略结构

策略参数

策略参数包含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:PKITokenIssueTime

    时间

    PKI Token的签发时间。以ISO 8601格式表示,例如:2012-11-11T23:59:59Z。示例参见5

    g:ProjectName

    字符串

    项目名称。示例参见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:PKITokenIssueTime

      示例:表示用户在北京时间2023年3月1日8点前请求签发的PKI Token可以创建IAM委托。

      策略中g:PKITokenIssueTime条件键值的时间格式为UTC时间。

      {
      	"Version": "1.1",
      	"Statement": [{
      		"Effect": "Allow",
      		"Action": ["iam:roles:createRoles"],
      		"Condition": {
      			"DateLessThan": {
      				"g:PKITokenIssueTime": ["2023-03-01T00:00:00Z"]
      			}
      		}
      	}]
      }
    6. g:ProjectName

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

      {
               "Version": "1.1",
               "Statement": [{
                        "Effect": "Allow",
                        "Action": ["iam:roles:createRoles"],
                        "Condition": {
                                " StringEquals ": {
                                         "g: ProjectName ": ["cn-north-4"]
                                }
                        }
               }]
      }
    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运算逻辑。
  • 运算符

    运算符与条件键、条件值一起构成完整的条件判断语句,当请求信息满足该条件时,策略才能生效。运算符可以增加后缀“IfExists”,表示对应请求值为空或满足条件的请求值均使策略生效,如“StringEqualsIfExists”表示请求值为空或请求值等于条件值均使策略生效。运算符为字符串型运算符,表格中如未增加说明,不区分大小写。

    • String类型
      表4 String类型运算符

      类型

      运算符

      说明

      String

      StringEquals

      请求值与任意一个条件值相同(区分大小写)。

      StringNotEquals

      请求值与所有条件值都不同(区分大小写)。

      StringEqualsIgnoreCase

      请求值与任意一个条件值相同。

      StringNotEqualsIgnoreCase

      请求值与所有条件值都不同。

      StringMatch

      请求值符合任意一个条件值的正则表达式(区分大小写,正则表达式仅支持*和?)。

      StringNotMatch

      请求值不符合所有条件值的正则表达式(区分大小写,正则表达式仅支持*和?)。

      示例:指定用户名为ZhangSan的请求者才能够获取对象内容、获取对象元数据。

      {
          "Version": "1.1",
          "Statement": [
              {
                  "Effect": "Allow",
                  "Action": [
                      "obs:object:GetObject"
                  ],
                  "Condition": {
                      "StringEquals": {
                          "g:DomainName": [
                              "ZhangSan"
                          ]
                      }
                  }
              }
          ]
      }
    • Number类型
      表5 Number类型运算符

      类型

      运算符

      说明

      Number

      NumberEquals

      请求值等于任意一个条件值。

      NumberNotEquals

      请求值不等于所有条件值。

      NumberLessThan

      请求值小于任意一个条件值。

      NumberLessThanEquals

      请求值小于或任意一个等于条件值。

      NumberGreaterThan

      请求值大于任意一个条件值。

      NumberGreaterThanEquals

      请求值大于或等于任意一个条件值。

      示例:请求者一次最多可以在example_bucket桶中列出10个对象。

      {
          "Version": "1.1",
          "Statement": [
              {
                  "Effect": "Allow",
                  "Action": [
                      "obs:bucket:ListBucket"
                  ],
                  "Resource": [
                      "OBS:*:*:bucket:example_bucket"
                  ],
                  "Condition": {
                      "NumberLessThanEquals": {
                          "obs:max-keys": [
                              "10"
                          ]
                      }
                  }
              }
          ]
      }
    • Date类型
      表6 Date类型运算符

      类型

      运算符

      说明

      Date

      DateLessThan

      请求值早于任意一个条件值。

      DateLessThanEquals

      请求值早于或等于任意一个条件值。

      DateGreaterThan

      请求值晚于任意一个条件值。

      DateGreaterThanEquals

      请求值晚于或等于任意一个条件值。

      示例:请求者只能在2022年8月1日前创建桶资源。

      {
          "Version": "1.1",
          "Statement": [
              {
                  "Effect": "Allow",
                  "Action": [
                      "obs:bucket:CreateBucket"
                  ],
                  "Condition": {
                      "DateLessThan": {
                          "g:CurrentTime": [
                              "2022-08-01T00:00:00Z"
                          ]
                      }
                  }
              }
          ]
      }
    • Bool类型
      表7 Bool类型运算符

      类型

      运算符

      说明

      Bool

      Bool

      条件值可选值:true、false。请求值等于条件值。

      示例:请求者必须使用开启了MFA认证的凭证才能修改指定永久访问密钥。

      {
          "Version": "1.1",
          "Statement": [
              {
                  "Effect": "Allow",
                  "Action": [
                      "iam:credentials:updateCredential"
                  ],
                  "Condition": {
                      "Bool": {
                          "g:MFAPresent": [
                              "true"
                          ]
                      }
                  }
              }
          ]
      }
    • Null类型
      表8 Null类型运算符

      类型

      运算符

      说明

      Null

      Null

      条件值可选值:true、false。条件值为true,要求请求值不存在或者值为null;条件值为false,要求请求值必须存在且值不为null。

      示例:请求者的创建桶请求必须来源于VPC。

      {
          "Version": "1.1",
          "Statement": [
              {
                  "Effect": "Allow",
                  "Action": [
                      " obs:bucket:CreateBucket"
                  ],
                  "Condition": {
                      "Null": {
                          "obs:SourceVpc": [
                              "false"
                          ]
                      }
                  }
              }
          ]
      }
    • “IfExists”运算符后缀

      除Null运算符以外,您可以在任何条件运算符名称的末尾添加IfExists,例如:StringEqualsIfExists。如果请求的内容中存在条件键,则依照策略所述来进行匹配。如果该键不存在,则该条件元素的匹配结果将为true。