身份策略变量
身份策略变量介绍
在编写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'}"
}
}
}]
}