AWS IAM ポリシーの StringNotEquals 条件の複数値指定は AND になる
AWS IAM ポリシーの条件で同一キーに対して複数値を指定した場合,通常は OR で評価されます。
例えば,以下の StringEquals 条件の例では,aws:PrincipalTag/role
が audit
または security
のいずれかであれば true になります。
"Condition": {
"StringEquals": {
"aws:PrincipalTag/role": [ "audit", "security" ]
}
}
では StringNotEquals 条件にするとどうでしょうか?
例えば以下のポリシーで aws:PrincipalTag/role
が audit
の場合,OR で評価すると security
とは一致しないので true になり,どんな値でも常に true になってしまいます。
"Condition": {
"StringNotEquals": {
"aws:PrincipalTag/role": [ "audit", "security" ]
}
}
否定を含む条件演算子の場合
StringNotEquals のように否定を含む条件演算子で複数値を指定した場合は,例外的に AND で評価されます。
公式ドキュメントの注記に書いてありました。
StringNotEquals や DateNotEquals などのように、否定された一致条件演算子のポリシーで複数の値がリストされた場合、有効なアクセス許可は論理的 AND であるように働きます。
先程の例では,aws:PrincipalTag/role
が audit
または security
のいずれかであれば false になり,いずれも当てはまらない場合に true になります。
IAM ポリシーの論理を再確認したときに「あれ複数値指定は OR 評価だったような…」と考えると困惑してしまいますが,否定を含む条件演算子でも「キーの値が列挙した値のいずれでもない場合は…」のように直観的に理解して値を列挙してしまって問題ありません。
否定を含む条件演算子の一覧
条件演算子の中から否定を含むものを列挙しました。これらに対して複数指定する場合も同様に本件が当てはまります。
- StringNotEquals
- StringNotEqualsIgnoreCase
- StringNotLike
- NumericNotEquals
- DateNotEquals
- NotIpAddress
- ArnNotEquals
- ArnNotLike
関連資料
S3 バケットポリシーを例にしたポリシードキュメントの論理の説明です。
評価条件をまとめた図が参考になります。(本件の内容は載っていません。)
Discussion