AWS SAA(Solutions Architect - Associate)対策

IAMポリシー設計

このレッスンを終えると、複数のポリシーが重なった状態で「結局その API 呼び出しは通るのか」を、評価ロジックの順番どおりに追って判定できるようになります。

まず要件から

ある会社が、開発者グループに S3 の読み書きを許可しています。運用が進んだあとで監査部門から「バケット finance-reports だけは開発者に一切触らせないでほしい」と言われました。開発者グループのポリシーは 30 人以上のユーザーに効いていて、書き換えると影響範囲が読めません。

正解は、既存の Allow に手を入れず、finance-reports を対象にした明示的な Deny を足すことです。なぜそれで確実に止まるのかは、評価の順番を知っていれば一瞬で説明できます。

評価は3段で決まる

見るもの結果
1明示的な Deny があるかあれば即拒否。以降は一切見ない
2明示的な Allow があるかあれば許可
3どちらも無い暗黙の Deny で拒否

押さえるべきは2点です。ひとつは明示的な Deny を Allow で打ち消す方法は無いこと。もうひとつは何も書かなければ拒否であること。SAA では「権限を確実に外したい」「例外だけ塞ぎたい」という要件が出たら、Allow の削除ではなく Deny の追加を選びます。削除は他の要件まで巻き込むからです。

ポリシーを読む

開発者グループに次が付いているとします。

{ "Effect": "Allow", "Action": "s3:*", "Resource": "*" }

ここに次を足します。

{ "Effect": "Deny", "Action": "s3:*", "Resource": [ "arn:aws:s3:::finance-reports", "arn:aws:s3:::finance-reports/*" ] }

バケット本体とオブジェクトで ARN が別物である点に注意します。バケット名だけを書くと ListBucket は止まりますが、GetObject は止まりません。オブジェクトを対象にするには末尾の /* が要ります。試験ではこの片方だけを書いた選択肢が「惜しい誤答」として並びます。

もうひとつ頻出なのが Condition です。

{ "Effect": "Deny", "Action": "*", "Resource": "*", "Condition": { "BoolIfExists": { "aws:MultiFactorAuthPresent": "false" } } }

これは「MFA を通していないなら全部拒否」です。Deny 側に条件を書くと「条件を満たさないときだけ塞ぐ」という表現になり、Allow を一つずつ直さずに全体へ制約をかけられます。

何を合わせて評価するのか

種類付ける先役割
アイデンティティベースユーザー、グループ、ロール誰が何をできるか
リソースベースバケット、キュー、鍵などそのリソースに誰を通すか
権限境界ユーザー、ロールそのプリンシパルが持てる権限の上限
SCPOrganizations の OU、アカウントアカウント全体の権限の上限

権限境界と SCP は上限を決めるだけで、権限を与えません。両方が絡む場合、最終的に通るのは「アイデンティティベースで Allow され、かつ上限にも含まれ、どこにも Deny が無い」ときだけです。

要件語から構成へ

要件文の言い回し選ぶもの
特定のバケットだけ確実に触らせない明示的な Deny を追加
開発アカウントで高額なリージョンを使わせないSCP に Deny
委任した管理者が権限を昇格できないようにする権限境界
MFA を通したときだけ操作させるCondition 付きの Deny
別アカウントからこのバケットを読ませるリソースベースポリシー

よくある引っ掛け

ひとつめは「SCP に Allow を書いたのに使えない」です。SCP は上限であって付与ではないので、ユーザー側の Allow が無ければ通りません。

ふたつめは「Deny があるが Allow のほうが具体的なので勝つ」という選択肢です。ポリシーの具体性で勝敗は決まりません。Deny が1つでもあれば、その時点で終わりです。

まとめ

  • 評価は明示的 Deny、明示的 Allow、暗黙の Deny の順で、Deny が最優先
  • 権限を外す要件では Allow の削除ではなく Deny の追加を選ぶ
  • バケットとオブジェクトは ARN が別。/* の有無で結果が変わる
  • 権限境界と SCP は上限であって、権限を与えるものではない
生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア
編集 LuaGate編集部

復習ミニクイズ

ある企業では、開発者グループに S3 のフルアクセスを与える IAM ポリシーが 40 人のユーザーに適用されています。監査対応として、バケット audit-logs のオブジェクトだけは開発者が一切参照できない状態を確実に保証したいと考えています。既存の権限設定への影響を最小にしつつ、この要件を満たす方法はどれですか。