更新时间:2025-09-25 GMT+08:00
分享

JSON元素参考

策略由JSON元素组成,本章节对这些元素进行逐一介绍。这些元素按照在身份策略中使用的大致顺度列出,但是元素的顺序实际上并不重要,顺序不同并不会导致权限不一致。例如,Resource元素可以在Action元素之前出现。注意,一些JSON元素会相互排斥,这意味着您不能创建同时包含两个相互排斥的元素的策略。例如,您不能在同一策略语句中同时使用ActionNotAction

Version

Version策略元素指定策略的版本号,不同版本的策略的语法可能不同。目前IAM身份策略和信任策略的Version元素值固定为5.0,您应始终包含一个Version元素并将其设置为5.0。示例如下:

Version 策略元素与身份策略的版本不同。Version策略元素用在身份策略之中,是用于定义身份策略语言的版本。而身份策略版本是指您在创建或修改自定义身份策略时,IAM均会将创建一个新的身份策略版本,身份策略版本功能可以让您快速回退到身份策略的历史版本。如果您想了解与身份策略版本相关的更多信息,请参见身份策略版本

{
  "Version": "5.0",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "obs:bucket:listBucket"
      ]
    }
  ]
}

Statement

Statement元素为身份策略的主要元素,该元素为必填项。 Statement元素为一个可以包含多个语句的数组,数组必须用方括号 [ ] 括起来,数组中每条单独的语句必须用大括号 { } 括起来。
"Statement": [{...},{...},{...}]
在下面所示的身份策略中,Statement元素包含了两条语句,表示授予主体同时拥有列举OBS桶以及查看和列举ECS服务器的权限。
{
  "Version": "5.0",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "obs:bucket:listBucket"
      ]
    },
    {
      "Effect": "Allow",
      "Action": [
        "ecs:servers:get",
        "ecs:servers:list"
      ]
    }
  ]
}

Sid

您可以提供Sid(Statement ID)作为策略语句的可选标识符,为一个由零个或多个字符组成的字符串。您可以为Statement数组中的每个Statement指定Sid值,用于对策略语句的描述。请注意,IAM不会在公开API中暴露Sid,这意味着您无法基于Sid来检索特定的Statement。
{
  "Version": "5.0",
  "Statement": [
    {
      "Sid": "StatementIDExample",
      "Effect": "Allow",
      "Action": [
        "obs:bucket:listBucket"
      ]
    }
  ]
}

Effect

Effect 是必需具备的元素,用于指定Statement元素中单个语句所产生的结果是“允许”还是“拒绝”。Effect 的有效值为 Allow 和 Deny。在默认情况下,新建的IAM用户是没有任何权限的,所有的请求将被拒绝。如要允许IAM用户访问资源,您必须在策略中将Effect元素显示设置为 Allow 。当同一个Action的Effect既有Allow又有Deny时,遵循Deny优先的原则。有关更多信息,请参阅策略评估逻辑
"Effect":"Allow"

Principal

在资源策略中可以使用Principal元素指定允许或拒绝主体访问该资源。目前华为云的资源策略仅包含OBS桶策略和IAM信任策略,详情请参见支持身份策略与信任委托的云服务列表中的“基于资源的策略”列。

  • 账号 Principal

    Principal策略元素中的“IAM”元素表示账号主体。例如,在IAM信任委托中,当信任的主体类型是普通账号时,您可以在信任策略中指定受信任账号的账号ID来实现跨账号的资源访问。

    例如,在给定账号ID为“55555555555555555555555555555555“ 的情况下,您可以使用以下方法来在 Principal元素中指定账号主体:
    {
        "Version": "5.0",
        "Statement": [
            {
                "Principal": {
                    "IAM": [
                        "55555555555555555555555555555555"
                    ]
                },
                "Effect": "Allow",
                "Action": [
                    "sts:agencies:assume"
                ]
            }
        ]
    }
    因为“IAM”元素值是数组形式,因此您可以在该元素中指定多个账号主体:
    {
        "Version": "5.0",
        "Statement": [
            {
                "Principal": {
                    "IAM": [
                        "55555555555555555555555555555555",
                        "ffffffffffffffffffffffffffffffff"
                    ]
                },
                "Effect": "Allow",
                "Action": [
                    "sts:agencies:assume"
                ]
            }
        ]
    }
  • 云服务 Principal
    Principal策略元素中的“Service”元素表示云服务主体。继续以信任委托为例,当信任的主体类型是云服务时,您可以在信任策略中指定受信任账号为华为云服务,将账号内资源的操作权限委托给华为云服务。
    以下示例描述了将账号内资源的操作权限委托给资源治理中心RGC服务。
    {
      "Version": "5.0",
      "Statement": [
        {
          "Action": [
            "sts:agencies:assume"
          ],
          "Effect": "Allow",
          "Principal": {
            "Service": [
              "service.RGC"
            ]
          }
        }
      ]
    }

Action

Action元素描述将允许或拒绝的特定操作,Action元素的值也称为授权项。Statement元素中的语句必须包含Action或NotAction元素。每个云服务都有自己单独的授权项,一般以云服务名称为前缀,要查看每个云服务支持的授权项完整列表,请参见身份策略授权参考,然后打开指定云服务的章节,并导航至“操作”小节。一些云服务的Action 元素示例如下:

华为云OBS操作:
"Action":["obs:object:PutObjectRetention"]
华为云ECS操作:
"Action": ["ecs:cloudServers:put"]
华为云IAM操作:
"Action": ["iam:users:listUsersV5"]
您也可以为Action元素同时指定多个值:
"Action": ["obs:object:PutObjectRetention", "ecs:cloudServers:put", "iam:users:listUsersV5"]
也可以在Action元素中使用多字符匹配通配符 (*) 和单字符匹配通配符 (?),来授予特定云服务所有操作的访问权限。例如,以下Action元素适用于所有ECS的操作:
"Action": ["ECS:*:*"]
还可以将通配符(*?)作为授权项名称的一部分使用。例如,下列 Action 元素适用于所有包含字符串CredentialV5的IAM凭证相关操作,包括iam:credentials:createCredentialV5、iam:credentials:updateCredentialV5和iam:credentials:deleteCredentialV5。
"Action": ["iam:credentials:*CredentialV5"]

NotAction

NotAction是匹配指定的授权项列表之外的所有内容。使用 NotAction 时只需列出不需要匹配的一些授权项,而不用列出所有需要匹配的授权项,因此NotAction生成的策略较短。当NotAction与"Effect": "Allow"配合使用时,则允许未在NotAction元素中列出的所有授权项对应的操作;而当NotAction与 "Effect": "Deny"配合使用时,则拒绝未在NotAction元素中列出的所有授权项对应的操作。将 NotAction 与 Resource 元素结合使用时,相当于您进一步对策略限定了资源范围。
  • NotAction与Allow
    可在包含 "Effect": "Allow" 的语句中使用 NotAction 元素,来提供未在NotAction元素中列出的所有授权项对应的操作的访问权限。有时您可能需要允许访问大量操作,使用 NotAction 元素可有效地修改策略语句,生成更短的授权项列表。例如,由于华为云提供了很多的云服务,您可能需要创建一个身份策略,以允许用户执行除访问 IAM 操作之外的所有操作,其身份策略示例如下所示:
    {
      "Version": "5.0",
      "Statement": [
        {
          "Effect": "Allow",
          "NotAction": [
            "IAM:*:*"
          ]
        }
      ]
    }

    在同一语句或一个策略内的不同语句中使用 NotAction 元素和 "Effect": "Allow" 时要特别注意,NotAction会匹配所有未明确列出或不适用于指定资源的服务和授权项,这可能会授予用户比您预期更多的权限。

  • NotAction与Deny

    可在包含 "Effect": "Deny" 的语句中使用 NotAction 元素,来拒绝未在NotAction元素中列出的所有授权项对应的操作的访问权限。此组合没有授予列出的服务和授权项的权限,而是拒绝所有未列出的服务和授权项,因此您仍然需要显示允许您要授予的服务和授权项。

    以下条件示例拒绝用户在未使用多重身份验证(MFA)登录时访问非IAM的操作。如果用户使用MFA登录,则Condition匹配失败,最终的 Deny语句将不起作用。但请注意,这并不会授予用户访问任何操作的权限;它只会在未使用多重身份验证登录时明确拒绝除IAM操作之外的所有其他操作。
    {
      "Version": "5.0",
      "Statement": [
        {
          "Effect": "Deny",
          "NotAction": [
            "IAM:*:*"
          ],
          "Condition": {
            "BoolIfExists": {
              "g:MFAPresent": [
                "false"
              ]
            }
          }
        }
      ]
    }

Resource

策略语句中的 Resource 元素指定了该语句适用的一个或多个资源。华为云使用资源URN来标识资源,资源URN的格式取决于具体云服务和特定资源,有关资源URN的介绍,请参见使用URN标识华为云资源。尽管URN格式各不相同,但您可以始终使用 URN 来标识资源,想要查看云服务特定资源的URN格式,请参见身份策略授权参考,然后打开指定云服务的章节,并导航至“资源类型”小节。

以下示例表示了账号xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx中所有的OBS桶。
"Resource": ["obs::xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:bucket:*"]
  • 在资源URN中使用通配符

    您可在URN(用冒号分隔的部分)的各分段中使用通配符(*和 ?):

    • *号可以匹配任意的多个字符。
    • ?号可以匹配任意的一个字符。
    您可以在每个分段中使用多个 * 或 ? 字符。如果 * 通配符是资源 URN 分段的最后一个字符,则它可以扩展以匹配冒号边界以外的内容。

    不得在服务分段中使用通配符,有关URN分段的更多信息,请参见使用URN标识华为云资源

    以下示例表示了其账号下的所有IAM用户。注意,需要在实际使用时将{account_id}替换为您实际的账号ID。
    "Resource": ["iam:*:{account_id}:user:*"]
    以下示例表示了其账号中my-bucket桶my-object目录下的所有对象。注意,需要在实际使用时将{account_id}替换为您实际的账号ID。
    "Resource": ["obs:*:{account_id}:object:my-bucket/my-object/*"]
  • 指定多个资源
    Resource元素是数组格式,您可以在数组中指定多个资源。下列示例适用于OBS服务的my-bucket桶my-object目录下的所有对象以及IAM所有的委托及信任委托。注意,需要在实际使用时将{account_id}替换为您实际的账号ID。
    "Resource": [
        "obs:*:{account_id}:bucket:my-bucket/my-object/*",
        "iam:*:{account_id}:agency:*"
    ]
  • 在资源URN中使用策略变量
    在Resource元素中,您可以在标识特定资源的URN部分中使用策略变量。例如,您可以使用${g:UserName}作为资源URN的一部分,以表示应包含当前用户的名称作为资源名称的一部分。
    {
      "Version": "5.0",
      "Statement": [
        {
          "Effect": "Allow",
          "Action": [
            "obs:bucket:listBucket"
          ],
          "Resource": [
            "obs:*:*:bucket:${g:UserName}"
          ]
        }
      ]
    }

Condition

Condition元素允许您指定策略生效的条件。Condition元素是可选的。在Condition元素中,您可以使用条件键运算符来构建出使策略生效的特定条件。

条件键名称不区分大小写,条件键的键值是否区分大小写取决于您使用的运算符

示例1:以下条件包含StringEquals运算符,条件键为g:UserName,以确保只有Bob提出的请求才符合条件,名为bob的用户会被拒绝访问。
{
  "Version": "5.0",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "iam:users:listUsersV5"
      ],
      "Condition": {
        "StringEquals": {
          "g:UserName": [
            "Bob"
          ]
        }
      }
    }
  ]
}
示例2:以下条件包含StringEquals运算符,条件键为g:userName,也是确保只有Bob提出的请求才符合条件,名为bob的用户会被拒绝访问。
{
  "Version": "5.0",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "iam:users:listUsersV5"
      ],
      "Condition": {
        "StringEquals": {
          "g:userName": [
            "Bob"
          ]
        }
      }
    }
  ]
}
示例3: 以下条件包含运算符StringEqualsIgnoreCase,条件键为g:userName,可以匹配名为bobBob的用户。
{
  "Version": "5.0",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "iam:users:listUsersV5"
      ],
      "Condition": {
        "StringEqualsIgnoreCase": {
          "g:userName": [
            "Bob"
          ]
        }
      }
    }
  ]
}
  • 运算符
    运算符与条件键、条件值一起构成完整的条件判断语句,当请求信息满足该条件时,策略才能生效。运算符可以增加后缀“IfExists”,表示对应请求值不存在或请求值存在且满足条件时均使策略生效,如“StringEqualsIfExists”表示请求值不存在或请求值等于条件值均使策略生效。
    1. 请求值是指请求上下文中携带的条件键对应的值,条件值是指策略中配置的条件键对应的值。
    2. 请求值不存在和空值是2个概念,空值表示请求值存在但是为空。例如,如果是字符串类型条件键,不存在表示为None,空值则是空字符串;如果是多值条件键,不存在表示为None,空值则是空数组。
    3. 否定运算符,如"StringNotEquals",确实与None值匹配,因为None值不等于指定的字符串值。
    • String类型运算符
      • 策略变量 – 支持
      • 通配符 – 只有StringMatch和StringNotMatch支持
      表1 String类型运算符

      类型

      运算符

      说明

      String

      StringEquals

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

      StringNotEquals

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

      StringEqualsIgnoreCase

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

      StringNotEqualsIgnoreCase

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

      StringLike(不推荐)

      任何一个条件值作为请求值连续子串出现,不区分大小写,不支持通配符。

      StringNotLike(不推荐)

      所有条件值均不作为请求值连续子串出现,不区分大小写,不支持通配符。

      StringMatch(推荐)

      请求值符合任意一个条件值,区分大小写,支持通配符*和?。如果StringMatch包含多个值,还可以使用集合运算符ForAllValues、ForAnyValue来限定。

      StringNotMatch(推荐)

      请求值不符合所有条件值,区分大小写,支持通配符*和?。如果StringNotMatch包含多个值,还可以使用集合运算符ForAllValues、ForAnyValue来限定。

      StringStartWith

      包含作为前缀,不区分大小写。

      StringEndWith

      包含作为后缀,不区分大小写。

      StringNotStartWith

      未包含作为前缀,不区分大小写。

      StringNotEndWith

      未包含作为后缀,不区分大小写。

      示例:指定用户名为ZhangSan的请求者才能够查询IAM用户列表。
      {
        "Version": "5.0",
        "Statement": [
          {
            "Effect": "Allow",
            "Action": [
              "iam:users:listUsersV5"
            ],
            "Condition": {
              "StringEquals": {
                "g:UserName": [
                  "ZhangSan"
                ]
              }
            }
          }
        ]
      }
      如果请求上下文中没有您在策略条件中指定的键,则这些值不匹配。在下面示例中,当主体是IAM用户时,只有为IAM用户添加了标签时,请求上下文中才会存在 g:PrincipalTag/job-category 键;当主体是IAM信任委托时,为信任委托添加了标签或在获取信任委托临时安全凭证时添加了会话标签,则请求上下文中也会存在 g:PrincipalTag/job-category 键。如果使用没有标签的主体发起请求,则该条件将会返回 false,因此没有标签的主体将会被拒绝访问用户列表。
      {
        "Version": "5.0",
        "Statement": [
          {
            "Effect": "Allow",
            "Action": [
              "iam:users:listUsersV5"
            ],
            "Condition": {
              "StringEquals": {
                "g:PrincipalTag/job-category": [
                  "admin"
                ]
              }
            }
          }
        ]
      }
      下表显示了IAM如何根据请求中的条件键值来评估此策略。
      表2 IAM如何根据请求中的条件键值来评估此策略

      身份策略条件

      请求上下文

      结果

      "StringEquals": {
      	"g:PrincipalTag/job-category": [
      		"admin"
      	]
      }
      g:PrincipalTag/job-category: admin

      匹配

      "StringEquals": {
      	"g:PrincipalTag/job-category": [
      		"admin"
      	]
      }
      g:PrincipalTag/job-category: operator

      不匹配

      "StringEquals": {
      	"g:PrincipalTag/job-category": [
      		"admin"
      	]
      }
      请求上下文中没有 g:PrincipalTag/job-category

      不匹配

    • Number类型运算符
      • 策略变量 – 支持
      • 通配符 – 不支持
      表3 Number类型运算符

      类型

      运算符

      说明

      Number

      NumberEquals

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

      NumberNotEquals

      请求值不等于所有条件值

      NumberLessThan

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

      NumberLessThanEquals

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

      NumberGreaterThan

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

      NumberGreaterThanEquals

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

      示例:请求者一次最多可以在example_bucket桶中列出10个对象。
      {
          "Version": "5.0",
          "Statement": [
              {
                  "Effect": "Allow",
                  "Action": [
                      "obs:bucket:ListBucket"
                  ],
                  "Resource": [
                      "OBS:*:*:bucket:example_bucket"
                  ],
                  "Condition": {
                      "NumberLessThanEquals": {
                          "obs:max-keys": [
                              "10"
                          ]
                      }
                  }
              }
          ]
      }
    • Date类型运算符

      Date类型用于匹配RFC 3339格式的UTC时间。

      • 策略变量 – 支持
      • 通配符 – 不支持
      表4 Date类型运算符

      类型

      运算符

      说明

      Date

      DateEquals

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

      DateNotEquals

      请求值不等于所有条件值

      DateLessThan

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

      DateLessThanEquals

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

      DateGreaterThan

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

      DateGreaterThanEquals

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

      示例:请求者只能在2025年9月9日前查询IAM用户列表。
      {
        "Version": "5.0",
        "Statement": [
          {
            "Effect": "Allow",
            "Action": [
              "iam:users:listUsersV5"
            ],
            "Condition": {
              "DateLessThan": {
                "g:CurrentTime": [
                  "2025-09-09T00:00:00Z"
                ]
              }
            }
          }
        ]
      }
      
    • Bool类型运算符
      • 策略变量 – 支持
      • 通配符 – 不支持
      表5 Bool类型运算符

      类型

      运算符

      说明

      Bool

      Bool

      条件值可选值:true、false,不区分大小写。当请求值等于条件键的值时视作匹配,当请求值不存在时,视作不匹配。

      示例:请求者必须使用开启了MFA认证的凭证才能修改永久访问密钥。
      {
          "Version": "5.0",
          "Statement": [
              {
                  "Effect": "Allow",
                  "Action": [
                      "iam:credentials:updateCredentialV5"
                  ],
                  "Condition": {
                      "Bool": {
                          "g:MFAPresent": [
                              "true"
                          ]
                      }
                  }
              }
          ]
      }
    • IP类型运算符
      • 策略变量 – 支持
      • 通配符 – 不支持
      表6 IP类型运算符

      类型

      运算符

      说明

      IP

      IpAddress

      指定IP地址或者IP范围。

      当条件键为多值条件键时,支持传入IP或IP网段,其语义为:

      • 对于ForAnyValue:请求上下文中任一IP(包括IP网段中的IP)需要在用户策略配置网段中任意一个或多个的网段中时策略才生效。
      • 对于ForAllValues:请求上下文中所有IP(包括IP网段中的IP)需要在用户策略配置网段中任意一个或多个的子网中时策略才生效。

      NotIpAddress

      指定IP地址或者IP范围之外的所有IP地址。

      当条件键为多值条件键时,支持传入IP或IP网段,其语义为:

      • 对于ForAnyValue:请求上下文中任一IP(包括IP网段中的IP)不在用户策略配置所有网段中时策略才生效。
      • 对于ForAllValues:请求上下文中所有IP(包括IP网段中的IP)都不在用户策略配置所有网段中时策略才生效。
      示例:只允许IP地址在10.27.128.0到10.27.128.255范围内的请求才能够修改指定的永久访问密钥。有关g:SourceIp条件键的详细介绍见全局条件键
      {
      	"Version": "5.0",
      	"Statement": [{
      		"Effect": "Allow",
      		"Action": [
      			"iam:credentials:updateCredentialV5"
      		],
      		"Condition": {
      			"IpAddress": {
      				"g:SourceIp": [
      					"10.27.128.0/24"
      				]
      			}
      		}
      	}]
      }
    • Null类型运算符
      • 策略变量 – 支持
      • 通配符 – 不支持
      表7 Null类型运算符

      类型

      运算符

      说明

      Null

      Null

      条件值可选值:true、false,不区分大小写。条件值为true,要求请求值不存在即值为null;条件值为false,要求请求值必须存在即不为null。

      示例:请求者的创建桶请求必须来源于VPC。
      {
          "Version": "5.0",
          "Statement": [
              {
                  "Effect": "Allow",
                  "Action": [
                      "obs:bucket:CreateBucket"
                  ],
                  "Condition": {
                      "Null": {
                          "obs:SourceVpc": [
                              "false"
                          ]
                      }
                  }
              }
          ]
      }
    • IfExists 运算符后缀
      除Null运算符以外,您可以在任何条件运算符名称的末尾添加IfExists,例如:StringEqualsIfExists。如果请求的内容中存在条件键,则依照策略所述来进行匹配。如果该键不存在,则该条件元素的匹配结果将为true。

      语句中其他条件因素仍然可以导致不匹配。如果您使用否定运算符(如 StringNotEqualsIfExists),无论是否带有IfExists后缀,都等效于存在IfExists后缀。例如,在Effect为Deny时使用StringNotEquals,即使条件键不存在,请求仍会被拒绝。

      {
        "Version": "5.0",
        "Statement": [
          {
            "Effect": "Allow",
            "Action": [
              "iam:users:listUsersV5"
            ],
            "Condition": {
              "StringEqualsIfExists": {
                "g:PrincipalTag/job": [
                  "iam-user"
                ]
              }
            }
          }
        ]
      }
      下表显示了如何根据请求中的条件键值来评估此策略。
      表8 根据请求中的条件键值来评估此策略

      策略条件

      请求上下文

      结果

      "Condition": {
      	"StringEqualsIfExists": {
      		"g:PrincipalTag/job": [
      			"iam-user"
      		]
      	}
      }
      g:PrincipalTag/job:iam-user

      匹配

      "Condition": {
      	"StringEqualsIfExists": {
      		"g:PrincipalTag/job": [
      			"iam-user"
      		]
      	}
      }
      g:PrincipalTag/job:admin

      不匹配

      "Condition": {
      	"StringEqualsIfExists": {
      		"g:PrincipalTag/job": [
      			"iam-user"
      		]
      	}
      }
      请求上下文中没有标签g:PrincipalTag/job

      不匹配

  • 多个条件键或值

    您可以使用Condition元素来编写具有多个条件键或单个条件键具有多个值的策略。

    • 多个条件键或值的评估逻辑

      一个Condition元素可以包含多个运算符,而每个运算符又可以包含多个条件键的键值对。

      • 如果您的策略语句具有多个运算符,则使用AND运算逻辑评估这些运算符。
      • 如果您的策略语句在一个运算符中包含多个条件键,则使用AND运算逻辑评估这些条件键。
      • 如果单个运算符包含一个条件键的多个值,则使用OR运算逻辑评估这些值。
      • 如果单个表否定含义的运算符(例如:StringNotEquals)包含一个条件键的多个值,则使用NOR运算逻辑评估这些值。

      Condition元素中的所有条件键都必须解析为true才能达到所需的Allow或Deny效果。

      下图说明了具有多个运算符和条件键值对的评估逻辑。
      图1 多个运算符和条件键值对的评估逻辑

      例如,以下IAM身份策略说明了上图在策略中的表示方式。此条件块包含条件运算符StringEquals ,以及条件键g:UserName和 g:PrincipalTag/job。要达到所需的Allow或Deny效果,Condition元素中的所有条件键都必须解析为true。

      此身份策略描述的是对IAM用户名为bob或者alice,且携带键值为"job":"admin"的标签的用户被授予IAM服务的所有权限。
      {
        "Version": "5.0",
        "Statement": [
          {
            "Effect": "Allow",
            "Action": [
              "IAM:*:*"
            ],
            "Condition": {
              "StringEquals": {
                "g:UserName": [
                  "bob",
                  "alice"
                ],
                "g:PrincipalTag/job": [
                  "admin"
                ]
              }
            }
          }
        ]
      }
      下表显示了IAM如何根据请求中的条件键值来评估身份策略。
      表9 根据请求中的条件键值评估身份策略

      身份策略条件

      请求上下文

      结果

      "Condition": {
      	"StringEquals": {
      		"g:UserName": [
      			"bob",
      			"alice"
      		],
      		"g:PrincipalTag/job": [
      			"admin"
      		]
      	}
      }
      g:UserName: "bob"
      g:PrincipalTag/job: "admin"

      匹配

      "Condition": {
      	"StringEquals": {
      		"g:UserName": [
      			"bob",
      			"alice"
      		],
      		"g:PrincipalTag/job": [
      			"admin"
      		]
      	}
      }
      g:UserName: "alice"
      请求上下文中没有主体标签

      不匹配

      "Condition": {
      	"StringEquals": {
      		"g:UserName": [
      			"bob",
      			"alice"
      		],
      		"g:PrincipalTag/job": [
      			"admin"
      		]
      	}
      }
      g:UserName: "other-user"
      g:PrincipalTag/job: "admin"

      不匹配

      "Condition": {
      	"StringEquals": {
      		"g:UserName": [
      			"bob",
      			"alice"
      		],
      		"g:PrincipalTag/job": [
      			"admin"
      		]
      	}
      }
      g:UserName: "alice"
      g:PrincipalTag/job: "iam-user"

      不匹配

    • 否定运算符的评估逻辑

      一些运算符(如StringNotEquals或StringNotMatch),使用否定匹配的方式将策略中的条件键值对与请求中的上下文键值对进行比较。当使用否定运算符为策略中的单个条件键指定多个值时,其工作方式类似于NOR运算逻辑。在否定匹配中,IAM会将请求中的上下文键值与策略的条件键值逐一比较,仅当所有值都计算为false时,逻辑NORNOT OR才会返回true。

      下图说明了具有多个运算符和条件键值对的否定运算符的评估逻辑。
      图2 多个运算符和条件键值对的否定运算符的评估逻辑
      以下示例描述了请求者的用户名不在否定匹配条件键对应的列表中时,结果鉴权为true。
      {
        "Version": "5.0",
        "Statement": [
          {
            "Effect": "Allow",
            "Action": [
              "IAM:*:*"
            ],
            "Condition": {
              "StringNotEquals": {
                "g:UserName": [
                  "alice",
                  "bob"
                ]
              }
            }
          }
        ]
      }
      下表显示了IAM如何根据请求中的条件键值来评估此身份策略。
      表10 根据请求中的条件键值评估身份策略

      策略条件

      请求上下文

      结果

      "Condition": {
      	"StringNotEquals": {
      		"g:UserName": [
      			"alice",
      			"bob"
      		]
      	}
      }
      g:UserName: alice

      不匹配

      "Condition": {
      	"StringNotEquals": {
      		"g:UserName": [
      			"alice",
      			"bob"
      		]
      	}
      }
      g:UserName: bob

      不匹配

      "Condition": {
      	"StringNotEquals": {
      		"g:UserName": [
      			"alice",
      			"bob"
      		]
      	}
      }
      g:UserName: other-user

      匹配

  • 单值和多值条件键

    单值条件键和多值条件键之间的差异取决于请求上下文中的值数量,而不是策略条件中的值数量。要查看每个云服务支持的服务级条件键是单值还是多值条件键,请参见

    ,然后打开指定云服务的章节,并导航至“条件”小节。
    • 单值条件键在请求上下文中最多有一个值。例如,当您在云服务中标记资源时,每个资源标签都以键值对的形式存储。由于资源标签键只能具有单个标签值,因此g:ResourceTag/key-name 为单值条件键。
    • 多值条件键在请求上下文中可以有多个值。例如,当您在云服务中标记资源时,您可以在请求中包含多个标签键值对。因此,g:TagKeys是多值条件键。
    多值条件键的集合运算符
    • ForAllValues

      请求上下文中每个成员的值是否为条件键集的子集。如果请求上下文中的每个键值均与策略中的至少一个值匹配,则条件返回true。注意:如果请求上下文中键对应的值为空,它也会返回true,如果请求上下文中键不存在,则会返回false。

      以下示例,身份策略描述为对于请求者发起共享的组织中所有组织路径必须为orgPath1、orgPath2或者orgPath3中的元素,那么允许共享。
      {
          "Version": "5.0",
          "Statement": [
              {
                  "Effect": "Allow",
                  "Action": [
                      "ims:images:share"
                  ],
                  "Condition": {
                      "ForAllValues:StringEquals": {
                          "ims:TargetOrgPaths": [
                              "orgPath1",
                              "orgPath2",
                              "orgPath3"
                          ]
                      }
                  }
              }
          ]
      }
      下表显示了IAM如何根据请求上下文中的键值来评估此身份策略。
      表11 上下文中的键值来评估此身份策略

      策略条件

      请求上下文

      结果

      "Condition": {
      	"ForAllValues:StringEquals": {
      		"ims:TargetOrgPaths": [
      			"orgPath1",
      			"orgPath2",
      			"orgPath3"
      		]
      	}
      }
      ims:TargetOrgPaths: 
      orgPath1
      orgPath3

      匹配

      "Condition": {
      	"ForAllValues:StringEquals": {
      		"ims:TargetOrgPaths": [
      			"orgPath1",
      			"orgPath2",
      			"orgPath3"
      		]
      	}
      }
      ims:TargetOrgPaths:
      orgPath1
      orgPath2
      orgPath3
      orgPath4

      不匹配

    • ForAnyValue

      请求上下文中至少一个成员是否与条件键值集的至少一个成员匹配。如果请求上下文中的任何一个键值与策略中的任何一个条件值匹配,则条件返回true。如果请求上下文中没有任何键值与策略中的任何条件值匹配,或者请求上下文中不存在对应的键,条件返回false。

      以下示例,身份策略描述为对于请求者发起共享的组织中任一个组织路径包含orgPath1、orgPath2或者orgPath3中的元素,那么允许共享。
      {
          "Version": "5.0",
          "Statement": [
              {
                  "Effect": "Allow",
                  "Action": [
                      "ims:images:share"
                  ],
                  "Condition": {
                      "ForAnyValue:StringEquals": {
                          "ims:TargetOrgPaths": [
                              "orgPath1",
                              "orgPath2",
                              "orgPath3"
                          ]
                      }
                  }
              }
          ]
      }
      下表显示了IAM如何根据请求中的条件键值来评估此身份策略。
      表12 上下文中的键值来评估此身份策略

      策略条件

      请求上下文

      结果

      "Condition": {
      	"ForAnyValue:StringEquals": {
      		"ims:TargetOrgPaths": [
      			"orgPath1",
      			"orgPath2",
      			"orgPath3"
      		]
      	}
      }
      ims:TargetOrgPaths:
      orgPath1
      orgPath4

      匹配

      "Condition": {
      	"ForAnyValue:StringEquals": {
      		"ims:TargetOrgPaths": [
      			"orgPath1",
      			"orgPath2",
      			"orgPath3"
      		]
      	}
      }
      ims:TargetOrgPaths:
      orgPath4
      orgPath5

      不匹配

策略变量

在编写Resource或Condition的条件值时,如果您不知道资源或条件键的精确值,可以使用策略变量作为占位符。在实际鉴权的时候,这些占位符将会被自动替换成请求上下文中指定条件键的值。策略变量结构支持使用$前缀,后跟一对大括号{ }。在大括号内,包含想要使用的请求上下文中的条件键的名称,例如${g:UserName},在实际鉴权的时候,${g:UserName}将被自动替换为条件键g:UserName的值。

如果变量指定的条件键替换失败,您可以为它提供默认值。要向变量添加默认值,请用单引号' '括起默认值,并用英文逗号和空格分隔条件键名称和默认值,例如${key, 'default'},表示当key不存在或者替换失败时,将${key, 'default'}替换为文本串default。条件键名称不区分大小写,但是默认值区分大小写。此外,条件键名称与默认值引号前后的空格都会被忽略。例如${ g:username , 'Default_User_Name' }表示如果访问身份是IAM用户,则替换成g:UserName的值,否则替换成文本串Default_User_Name。

  • 特殊符号

    对于策略中具有特殊含义的字符:"*"(通配符)、"?"(通配符)、"$"(策略变量标识符),如果您不想让这三个字符表示这些特殊含义,请将它们改写为${*}、${?}、${$};此外,在策略变量默认值中,如果您想表达一个单引号字符('),请使用一对连续的单引号('')来表示。例如${g:UserName, 'A single quote is '', two quotes are ''''.'},当使用默认值进行替换时,它将被替换成A single quote is ', two quotes are ''。

    IAM只会进行一轮替换,这意味着即使替换完毕后包含新的策略变量结构,它仍然不会被替换。例如${g:UserName, '${g:UserName}${*}'},当使用默认值进行替换时,它将被替换成${g:UserName}${*},不会继续迭代。

  • 变量的使用
    策略变量的本质即在策略中设置占位符,从而定义动态值。

    如果指定条件键在请求上下文中不存在,或者指定条件键是多值条件键,那么将会替换失败,可能会导致整个语句无效。

    例如当且仅当访问身份是IAM用户时,请求中才会存在g:UserName。如果以其它身份访问,那么所有包含${g:UserName}的资源和条件键都将视作不匹配。

    同理,对于多值条件键g:CalledVia,即使它存在于请求上下文中,由于它是多值条件键,${g:CalledVia}依然会被判定为替换失败,从而视作不匹配。

    • 在资源中使用变量
      Config服务关联委托的预置身份策略,在资源中使用"iam::${g:DomainId}:agency:rms_tracker_agency_v5"来指定对应账号下的信任委托URN:
      {
        "Version": "5.0",
        "Statement": [
          {
            "Effect": "Allow",
            "Action": [
              "iam:agencies:attachPolicyV5",
              "iam:agencies:detachPolicyV5"
            ],
            "Resource": [
              "iam::${g:DomainId}:agency:rms_tracker_agency_v5"
            ],
            "Condition": {
              "StringEquals": {
                "iam:PolicyURN": "iam::system:policy:ConfigTrackAgencyPolicy"
              }
            }
          }
        ]
      }
    • 在条件值中使用变量
      禁止跨组织访问资源:
      {
        "Version": "5.0",
        "Statement": [
          {
            "Effect": "Deny",
            "Action": [
              "*"
            ],
            "Resource": [
              "*"
            ],
            "Condition": {
              "StringNotEquals": {
                "g:ResourceOrgId": "${g:PrincipalOrgId}"
              },
              "Null": {
                "g:ResourceOrgId": "false"
              }
            }
          }
        ]
      }
    • 与标签配合使用
      通过给每个IAM用户设置标签MaxAllowedMfaAge,使得该IAM用户仅能在经过多因素认证MaxAllowedMfaAge秒内才能调用IAM API:
      {
        "Version": "5.0",
        "Statement": [
          {
            "Effect": "Allow",
            "Action": [
              "iam:*"
            ],
            "Condition": {
              "NumberLessThanEquals": {
                "g:MFAAge": "${g:PrincipalTag/MaxAllowedMfaAge}"
              }
            }
          }
        ]
      }
  • 指定默认值

    要向变量添加默认值,请用单引号 (' ') 括起默认值,并用逗号和空格 (, ) 分隔变量文本和默认值。

    例如,通过给每个IAM用户设置标签MaxAllowedMfaAge,使得该IAM用户仅能在经过多因素认证MaxAllowedMfaAge秒内才能调用IAM API,若未设置标签MaxAllowedMfaAge,则视作600秒:

    {
      "Version": "5.0",
      "Statement": [
        {
          "Effect": "Allow",
          "Action": [
            "iam:*"
          ],
          "Condition": {
            "NumberLessThanEquals": {
              "g:MFAAge": "${g:PrincipalTag/MaxAllowedMfaAge, '600'}"
            }
          }
        }
      ]
    }

相关文档