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

身份策略变量

身份策略变量介绍

在编写Resource或Condition的条件值时,可以使用身份策略变量作为占位符。在实际鉴权的时候,这些占位符将会被自动替换成请求上下文中指定条件键的值。

语法与替换规则

策略变量结构支持使用$前缀,后跟一对大括号{ }。在大括号内,包含想要使用的请求上下文中的条件键的名称,例如${g:UserName},在实际鉴权的时候,${g:UserName}将被自动替换为条件键g:UserName的值。

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

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

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

如果变量指定的条件键替换失败,您可以为它提供原定设置文本作为默认值。要向变量添加默认值,请用单引号' '括起默认值,并用英文逗号和空格分隔条件键名称和默认值,例如${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}${*},不会继续迭代。

示例

在资源中使用变量

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,若未设置标签MaxAllowedMfaAge,则视作600秒:

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

相关文档