🆚

AWS IAM BoolとBoolIfExistsの違い

2024/09/22に公開

回答

指定の条件キーが存在しないとき、Bool要素はfalseと評価され[1]BoolIfExists要素はtrueと評価されます[2]

他の...IfExists条件演算子も同様に、条件キーが存在しない場合はtrueとなります[2:1]

例を用いた解説

例としてaws:MultiFactorAuthPresentキーを用いて説明します。

Boolが適切な場合

例えば、以下のような条件を考えます。

"Effect": "Allow",
"Condition": {
    "Bool": {
        "aws:MultiFactorAuthPresent": "true"
    }
}

BoolBoolIfExistsのどちらを使用するかは、リクエストに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になる、ということなのだと思います。

参考

脚注
  1. "ポリシー条件で指定したキーがリクエストコンテキストに存在しない場合、値は一致せず条件は false になります。" - IAM JSON ポリシー要素: 条件演算子 ↩︎

  2. "キーが存在しない場合、条件要素は true と評価されます。" - IfExists 条件演算子 ↩︎ ↩︎

Discussion