SJ blog
ドリル一覧

T1-Q17: S3 ABACはAllowだけでは足りない。条件なしAllowを明示的Denyで潰す

S3タグベース制御で、同一トラストゾーンやPutObject条件だけに寄った誤答をポリシー評価順序で補強する。

AWS SCS-C03 S3 ABAC IAM

T1-Q17: S3 ABACはAllowだけでは足りない。条件なしAllowを明示的Denyで潰す

対象誤答: T1 Q17 S3 ABAC EXPLICIT DENY

あなたの選択と正答

観点内容
あなたの選択バケットポリシーは同じトラストゾーン内のプリンシパルには適用されない、という方向に解釈した。
正答プリンシパルのIAMアイデンティティベースポリシーが条件なしでS3 PutObjectを許可している場合、条件付きAllowだけでは制限できない。明示的Denyが必要。
誤答の引力リソースポリシーの条件付きAllowで十分だと思っている。別のアイデンティティポリシーが条件なしAllowを持つと、Denyなしでは抜け道が残る。
判断軸S3制御で『必ずこの条件を満たせ』を作るなら、満たさない場合のExplicit Denyを設計する。

この問題の芯

T1-Q17 は S3 の ABAC/タグ条件/PutObject 制御の問題。あなたは「同じトラストゾーンならバケットポリシーが効かない」方向に寄った。正しくは、条件付きAllowだけでは、別のIAMアイデンティティポリシーによる条件なしAllowを潰せない。必要なのは明示的Deny。

IAM評価の基本に戻す

AWSの認可では、どこかに明示的Denyがあれば必ず拒否される。一方、Allowは複数のポリシーから合成される。S3バケットポリシーで「タグが一致したらAllow」を書いても、同じプリンシパルに条件なしの s3:PutObject Allow が付いていれば、条件を満たさないPutObjectが別経路で許可される可能性がある。

強制したい条件はDenyで書く

タグが一致しないPutObjectを確実に止めたいなら、こういう考え方になる。

{
  "Effect": "Deny",
  "Principal": "*",
  "Action": "s3:PutObject",
  "Resource": "arn:aws:s3:::bucket/*",
  "Condition": {
    "StringNotEquals": {
      "s3:RequestObjectTag/Team": "${aws:PrincipalTag/Team}"
    }
  }
}

これは「Teamタグが一致しないPutObjectは、他にAllowがあっても拒否」という設計。

次回の秒殺ルール

「条件を満たしたら許可」ではなく「条件を満たさないなら必ず拒否」が必要な問題では、Explicit Denyを探す。
S3、KMS、VPC endpoint policy、SCPの問題ではこの差がそのまま正誤になる。

仕上げの一問一答

  • この問題の主語は何か: S3
  • 先に除外する選択肢: 問題文の主語と違うサービス責務に寄っているもの。
  • 最後に確認する語: 「最もコスト効率」「組織全体」「未指定を拒否」「監査」「自動有効化」などの制約語。

参照