
# 策略语法介绍
下面以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策略结构   
![](https://support.huaweicloud.com/usermanual-iam/zh-cn_image_0000001111040704.png "点击放大")
#### 策略参数
策略参数包含Version和Statement两部分，下面介绍策略参数详细说明。了解策略参数后，您可以根据场景自定义策略，如[自定义策略示例](https://support.huaweicloud.com/usermanual-iam/iam_01_0600.html)。
表1策略参数说明 
| 参数                                                             || 含义                                                                                    | 值                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
|:---|---|:---|:---|
| Version                                                        || 策略的版本。                                                                                | 1.1：代表基于策略的访问控制。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |
| Statement： 策略的授权语句 | Effect：作用      | 定义Action中的操作权限是否允许执行。                                                                 | - Allow：允许执行。  - Deny：不允许执行。   说明： 当同一个Action的Effect既有Allow又有Deny时，遵循Deny优先的原则。                                                                                                                                                                                                                                                                                      |
| Statement： 策略的授权语句 | Action：授权项     | 操作权限。                                                                                 | 格式为"服务名:资源类型:操作"。授权项支持通配符号\*，通配符号\*表示所有。授权项不区分大小写。 示例： "obs:bucket:ListAllMybuckets"：表示查看OBS桶列表权限，其中obs为服务名，bucket为资源类型，ListAllMybuckets为操作。 您可以在对应服务"API参考"资料中查看该服务所有授权项，如[OBS授权项](https://support.huaweicloud.com/api-obs/obs_04_0110.html)。                                                                                                                                                                                                                   |
| Statement： 策略的授权语句 | Condition：条件   | 使策略生效的特定条件，包括[条件键]和[运算符]。 | 格式为"条件运算符:{条件键：\[条件值1,条件值2\]}"。其中，条件键不区分大小写。 如果您设置多个条件，同时满足所有条件时，该策略才生效。 示例: "StringEndWithIfExists":{"g:UserName":\["specialCharacter"\]}：表示当用户输入的用户名以"specialCharacter"结尾时该条statement生效。                                                                                                                                                                                                                                                                       |
| Statement： 策略的授权语句 | Resource: 资源类型 | 策略所作用的资源。                                                                             | 格式为"服务名:region:domainId:资源类型:资源路径", 资源类型支持通配符号\*，通配符号\*表示所有。资源类型不区分大小写。 支持资源粒度授权的云服务和资源类型参见：[支持IAM资源粒度授权的云服务](https://support.huaweicloud.com/usermanual-iam/iam_01_0610.html)。 示例： - "obs:\*:\*:bucket:\*": 表示所有的OBS桶。  - "obs:\*:\*:object:my-bucket/my-object/\*": 表示my-bucket桶my-object目录下的所有对象。   |
   
- **条件键**
  条件键表示策略语句的 Condition 元素中的键值。根据适用范围，分为全局条件键和服务条件键。
  - **全局级条件键** （前缀为g:）适用于所有操作，IAM提供两种全局条件键：**通用全局条件键** 和**其他全局条件键** 。
    - **通用全局条件键** ：在鉴权过程中，云服务不需要提供用户身份信息，IAM将自动获取并鉴权。详情请参见：[通用全局条件键]。
    
    - **其他全局条件键**：在鉴权过程中，IAM通过云服务获取条件信息并鉴权。仅部分已对接的云服务支持其他全局条件键。
     
  
  - **服务级条件键** （前缀为服务缩写，如obs:）仅适用于对应服务的操作，详情请参见对应云服务的用户指南，如[OBS请求条件](https://support.huaweicloud.com/perms-cfg-obs/obs_40_0041.html)。
  
  
   表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 | 字符串 | 项目名称。示例参见[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委托。
     ![](https://support.huaweicloud.com/usermanual-iam/public_sys-resources/note_3.0-zh-cn.png)
     策略中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条件键运算逻辑示意图   
  ![](https://support.huaweicloud.com/usermanual-iam/zh-cn_image_0000001428101774.png "点击放大")
  1. 对于同一条件键的多个条件值，采用OR运算逻辑，即请求值按照条件运算符匹配到任意一个条件值则返回true。
     ![](https://support.huaweicloud.com/usermanual-iam/public_sys-resources/notice_3.0-zh-cn.png)
     当运算符表示否定含义的时候（例如：StringNotEquals），则请求值按照条件运算符不能匹配到任何一个条件值。
     
  
  2. 同一运算符下的不同条件键之间，采用AND运算逻辑。不同运算符之间，采用AND运算逻辑。
   
 
- **运算符**
  运算符与条件键、条件值一起构成完整的条件判断语句，当请求信息满足该条件时，策略才能生效。运算符可以增加后缀"IfExists"，表示对应请求值为空或满足条件的请求值均使策略生效，如"StringEqualsIfExists"表示请求值为空或请求值等于条件值均使策略生效。运算符为字符串型运算符，表格中如未增加说明，不区分大小写。
  - **String类型**
    表4String类型运算符 
    | 类型     | 运算符                       | 说明                                      |
    |:---|:---|:---|
    | String | StringEquals              | 请求值与任意一个条件值相同（区分大小写）。                   |
    | String | StringNotEquals           | 请求值与所有条件值都不同（区分大小写）。                    |
    | String | StringEqualsIgnoreCase    | 请求值与任意一个条件值相同。                          |
    | String | StringNotEqualsIgnoreCase | 请求值与所有条件值都不同。                           |
    | String | StringMatch               | 请求值符合任意一个条件值的正则表达式（区分大小写，正则表达式仅支持\*和?）。 |
    | String | StringNotMatch            | 请求值不符合所有条件值的正则表达式（区分大小写，正则表达式仅支持\*和?）。  |
       
    示例：指定用户名为ZhangSan的请求者才能够获取对象内容、获取对象元数据。
    ```
    {
        "Version": "1.1",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": [
                    "obs:object:GetObject"
                ],
                "Condition": {
                    "StringEquals": {
                        "g:DomainName": [
                            "ZhangSan"
                        ]
                    }
                }
            }
        ]
    }
    ```
    
  
  - **Number类型**
    表5Number类型运算符 
    | 类型     | 运算符                     | 说明               |
    |:---|:---|:---|
    | Number | NumberEquals            | 请求值等于任意一个条件值。    |
    | Number | NumberNotEquals         | 请求值不等于所有条件值。     |
    | Number | NumberLessThan          | 请求值小于任意一个条件值。    |
    | Number | NumberLessThanEquals    | 请求值小于或任意一个等于条件值。 |
    | Number | NumberGreaterThan       | 请求值大于任意一个条件值。    |
    | Number | 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类型**
    表6Date类型运算符 
    | 类型   | 运算符                   | 说明               |
    |:---|:---|:---|
    | Date | DateLessThan          | 请求值早于任意一个条件值。    |
    | Date | DateLessThanEquals    | 请求值早于或等于任意一个条件值。 |
    | Date | DateGreaterThan       | 请求值晚于任意一个条件值。    |
    | Date | DateGreaterThanEquals | 请求值晚于或等于任意一个条件值。 |
       
    示例：请求者只能在2022年8月1日前创建桶资源。
    ```
    {
        "Version": "1.1",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": [
                    "obs:bucket:CreateBucket"
                ],
                "Condition": {
                    "DateLessThan": {
                        "g:CurrentTime": [
                            "2022-08-01T00:00:00Z"
                        ]
                    }
                }
            }
        ]
    }
    ```
    
  
  - **Bool类型**
    表7Bool类型运算符 
    | 类型   | 运算符  | 说明                          |
    |:---|:---|:---|
    | Bool | Bool | 条件值可选值：true、false。请求值等于条件值。 |
       
    示例：请求者必须使用开启了MFA认证的凭证才能修改指定永久访问密钥。
    ```
    {
        "Version": "1.1",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": [
                    "iam:credentials:updateCredential"
                ],
                "Condition": {
                    "Bool": {
                        "g:MFAPresent": [
                            "true"
                        ]
                    }
                }
            }
        ]
    }
    ```
    
  
  - **Null类型**
    表8Null类型运算符 
    | 类型   | 运算符  | 说明                                                                       |
    |:---|:---|:---|
    | 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。
    
   
 
