AWS IAM BoolとBoolIfExistsの違い
回答
指定の条件キーが存在しないとき、Bool
要素はfalseと評価され[1]、BoolIfExists
要素はtrueと評価されます[2]。
他の...IfExists
条件演算子も同様に、条件キーが存在しない場合はtrueとなります[2:1]。
例を用いた解説
例としてaws:MultiFactorAuthPresent
キーを用いて説明します。
Boolが適切な場合
例えば、以下のような条件を考えます。
"Effect": "Allow",
"Condition": {
"Bool": {
"aws:MultiFactorAuthPresent": "true"
}
}
Bool
とBoolIfExists
のどちらを使用するかは、リクエストにaws:MultiFactorAuthPresent
が存在しなかったらどうしたいかによって決まります。
上の例では、通常「MFA認証済みのリクエストのみ許可したい」を意図しているはずです。その場合、MFA認証済みかどうか分からないリクエストは許可したくない、すなわち、aws:MultiFactorAuthPresent
キーが存在しないとき条件はfalseとなってほしいので、例示のとおりBool
を使用するのが適切です。
BoolIfExistsが適切な場合
続いて、以下のような条件を考えます。
##### 注意: 推奨されません #####
"Effect": "Deny",
"Condition": {
"Bool": {
"aws:MultiFactorAuthPresent": "false"
}
}
この例では、通常「MFA認証されていないリクエストを拒否したい」を意図しているはずです。その場合、MFA認証済みかどうか分からないリクエストも拒否したい、すなわち、aws:MultiFactorAuthPresent
キーが存在しないときも条件はtrueになってほしいので、例示は不適切であることが分かります。正しくは、BoolIfExists
を使用して、以下のようにします。
"Effect": "Deny",
"Condition": {
"BoolIfExists": {
"aws:MultiFactorAuthPresent": "false"
}
}
まとめ
端的に言うと、Bool
-true
またはBoolIfExists
-false
の組み合わせが適切な場合がほとんどだと言えそうですね(※意図的に例外的な組み合わせを使用する場面もあると思います)。
余談:なぜIfExistsで存在しないときtrueなのか
なぜ...IfExists
では存在しないときtrueになるのか、不思議に思うかもしれません。
これは論理学や数学における「前提が偽ならば全体は真」という考え方で説明できそうです(参考:vacuous truth)。今回の場合、「存在する」ならば「演算を評価する」という全体の条件に対して、前提の「存在する」が偽になるので、...IfExists
要素全体はtrueになる、ということなのだと思います。
参考
-
"ポリシー条件で指定したキーがリクエストコンテキストに存在しない場合、値は一致せず条件は false になります。" - IAM JSON ポリシー要素: 条件演算子 ↩︎
-
"キーが存在しない場合、条件要素は true と評価されます。" - IfExists 条件演算子 ↩︎ ↩︎
Discussion