🔑

AWS IAM ポリシーの StringNotEquals 条件の複数値指定は AND になる

2022/11/10に公開

AWS IAM ポリシーの条件で同一キーに対して複数値を指定した場合,通常は OR で評価されます。
例えば,以下の StringEquals 条件の例では,aws:PrincipalTag/roleaudit または security のいずれかであれば true になります。

"Condition": {
  "StringEquals": {
    "aws:PrincipalTag/role": [ "audit", "security" ]
  }
}

では StringNotEquals 条件にするとどうでしょうか?
例えば以下のポリシーで aws:PrincipalTag/roleaudit の場合,OR で評価すると security とは一致しないので true になり,どんな値でも常に true になってしまいます。

"Condition": {
  "StringNotEquals": {
    "aws:PrincipalTag/role": [ "audit", "security" ]
  }
}

否定を含む条件演算子の場合

StringNotEquals のように否定を含む条件演算子で複数値を指定した場合は,例外的に AND で評価されます。

公式ドキュメントの注記に書いてありました。

StringNotEquals や DateNotEquals などのように、否定された一致条件演算子のポリシーで複数の値がリストされた場合、有効なアクセス許可は論理的 AND であるように働きます。

先程の例では,aws:PrincipalTag/roleaudit または security のいずれかであれば false になり,いずれも当てはまらない場合に true になります。

IAM ポリシーの論理を再確認したときに「あれ複数値指定は OR 評価だったような…」と考えると困惑してしまいますが,否定を含む条件演算子でも「キーの値が列挙した値のいずれでもない場合は…」のように直観的に理解して値を列挙してしまって問題ありません。

否定を含む条件演算子の一覧

条件演算子の中から否定を含むものを列挙しました。これらに対して複数指定する場合も同様に本件が当てはまります。

  • StringNotEquals
  • StringNotEqualsIgnoreCase
  • StringNotLike
  • NumericNotEquals
  • DateNotEquals
  • NotIpAddress
  • ArnNotEquals
  • ArnNotLike

関連資料

S3 バケットポリシーを例にしたポリシードキュメントの論理の説明です。
評価条件をまとめた図が参考になります。(本件の内容は載っていません。)

https://dev.classmethod.jp/articles/learn-aws-policy-documents-with-examples/
https://dev.classmethod.jp/articles/s3-bucket-policy-multi-condition/

Discussion