📌 結論:SCPは7つの要素で構成される
SCPはJSON形式で書かれ、以下の7つの要素を組み合わせて権限を制御します
🏢 SCPはマンション管理規約のようなもの!
🏠 たとえ話:マンション管理組合の規約
(管理規約)
(各棟)
(各住戸)
SCP = 管理規約
マンション全体で守るべきルール。住人全員に適用される
Statement = 条項
「第1条:ペット禁止」「第2条:深夜の騒音禁止」など個別のルール
Effect = 許可/禁止
「許可する」または「禁止する」という判定
Action = 行為
「ペットを飼う」「ピアノを弾く」などの具体的な行為
Resource = 場所・設備
「共用廊下」「屋上」「駐車場」などの対象場所
Condition = 条件
「22時以降」「週末のみ」などの適用条件
📝 SCPのJSON構造を図解
SCPはJSON形式で記述します。各要素の役割を見ていきましょう。
{ "Version": "2012-10-17", ← 規約のバージョン(固定値) "Statement": [ ← ルールの箱(配列で複数OK) { "Sid": "DenyDeleteS3", ← 条項の名前(任意) "Effect": "Deny", ← 許可 or 拒否 "Action": [ ← 対象アクション "s3:DeleteBucket", "s3:DeleteObject" ], "Resource": "*", ← 対象リソース "Condition": { ← 適用条件(任意) "StringNotEquals": { "aws:PrincipalArn": "arn:aws:iam::*:role/Admin" } } } ] }
🏠 マンション規約に置き換えると...
「第X条(DenyDeleteS3):住人は、管理人(Admin)以外、
ゴミ置き場(S3)の物を勝手に捨てる(Delete)ことを禁止する」
🔍 7つの要素を詳しく解説
「令和5年度版」のように、どのルール体系を使うか指定。
これはIAMポリシーの最新バージョンと同じです。
「第1条」「第2条」...と複数のルールを格納できる。
1つだけでもOK、複数でもOK!
「ペット飼育に関する条項」のような分かりやすい名前。
何をするルールか一目でわかる名前がベスト。
管理規約の「〜してよい」「〜してはならない」の部分。
SCPでは通常Denyでガードレールを設定します。
「ペットを飼う」「ピアノを弾く」「BBQをする」など。
*(アスタリスク)でワイルドカード指定可能!
「共用廊下」「屋上」「駐車場」「特定の部屋」など。
Denyの場合は特定のARNも指定可能!
「22時以降」「週末のみ」「管理人以外」など。
リージョン制限や特定ロール除外に活用!
⚖️ Allow vs Deny の違いを図解
SCPの2つのEffect(効果)を理解しよう!
指定したアクションのみを許可し、それ以外は暗黙的に拒否。
デフォルトの「FullAWSAccess」を外した場合に使用。
🏠 マンションのたとえ
「共用ラウンジでは読書と勉強のみ許可」
→ それ以外の行為(飲食、睡眠等)は自動的に禁止
厳格なセキュリティが必要な環境で、
必要最小限の権限のみを許可したい場合
デフォルトで全てを許可し、特定のアクションのみを拒否。
最も一般的な使い方です。
🏠 マンションのたとえ
「共用部でのBBQは禁止」
→ BBQ以外の行為は基本的にOK
ガードレールとして特定の危険なアクションを
組織全体でブロックしたい場合
🎯 Action vs NotAction の違い
対象アクションの指定方法は2種類あります!
「このアクションに適用」
「このアクション以外に適用」
🏠 マンションのたとえで理解!
「ペットを飼うこと、ピアノを弾くことを禁止」
→ 明示的に列挙したものだけが対象
「緊急避難以外の深夜行動を禁止」
→ 除外したもの以外すべてが対象
🃏 ワイルドカードの使い方
"ec2:Describe*" → Describeで始まる全て
1文字だけの部分一致
"ec2:TerminateInstances"
🔍 Condition(条件)の使い方
「いつ」「誰が」「どこで」などの条件を細かく指定できます!
「A棟とB棟でのみ許可」のような場所制限
東京・大阪リージョンのみを許可する例
「管理人以外は立入禁止」のような人物制限
Adminロール以外に制限を適用する例
「VIP会員証を持つ人のみ利用可」のような資格制限
特定タグが付いたリソースにのみ適用
📋 よく使う条件演算子
完全一致
不一致
ワイルドカード一致
ARNパターン一致
📝 実践!完全なSCPサンプル
実際のSCPを見ながら、各要素の役割を確認しましょう
// リージョン制限SCP { "Version": "2012-10-17", "Statement": [ { "Sid": "DenyOutsideJapan", "Effect": "Deny", "NotAction": [ "iam:*", "organizations:*", "support:*" ], "Resource": "*", "Condition": { "StringNotEquals": { "aws:RequestedRegion": [ "ap-northeast-1", "ap-northeast-3" ] } } } ] }
📖 各要素の解説
IAMポリシーの最新バージョンを指定
「日本以外を拒否」という分かりやすい名前
このルールは「拒否」するガードレール
IAM・Organizations・Support以外のすべてが対象
すべてのリソースに適用
東京・大阪以外のリージョンで発動
🏠 マンション規約に翻訳すると...
「第X条(日本以外を拒否):住人は、管理業務(IAM/Organizations/Support)を除き、
東京棟・大阪棟以外での活動を禁止する」
⚠️ SCPでサポートされない要素
以下の要素はSCPでは使用できません!
個別のプリンシパル指定は不可
指定もサポートされません
💡 代わりに Condition を使用!
特定のユーザー/ロールを除外したい場合は
aws:PrincipalArn 条件キーを使いましょう
📊 SCP要素 一覧比較表
| 要素 | 必須 | Allow | Deny | 用途 |
|---|---|---|---|---|
| 📋 Version | ✅ | ✅ | ✅ | ポリシー言語バージョン |
| 📦 Statement | ✅ | ✅ | ✅ | ルールのコンテナ |
| 🏷️ Sid | ❌ | ✅ | ✅ | 識別用の名前 |
| ⚖️ Effect | ✅ | ✅ | ✅ | 許可/拒否の指定 |
| 🎯 Action | ✅ | ✅ | ✅ | 対象アクション |
| 🚷 NotAction | ❌ | ✅ | ✅ | 除外アクション |
| 📍 Resource | ✅ | * のみ | ARN可 | 対象リソース |
| 🔍 Condition | ❌ | ✅ | ✅ | 適用条件 |
❓ よくある質問
SCPでは Principal と NotPrincipal が使用できません。
また、Allow時のResourceは「*」のみ指定可能です。
基本的なJSON構造は同じなので、IAMポリシーを書いたことがあれば比較的簡単に理解できます。
空白文字(スペース、改行)もカウントされるため、サイズが近づいたら空白を削除しましょう。
複雑なポリシーは複数のSCPに分割することも検討してください。
デフォルトの「FullAWSAccess」ポリシーを維持したまま、特定の危険なアクションだけをブロックする方が管理が楽です。
Allow(許可リスト戦略)は、非常に厳格なセキュリティが必要な場合にのみ使用しましょう。
例えば、リージョン制限をかけるとき、IAMやOrganizationsなどのグローバルサービスは除外する必要があります。
このような場合に NotAction で除外対象を指定すると便利です。
🎓 まとめ
"2012-10-17"
箱(配列)
名前(任意)
Deny
アクション
リソース
条件(任意)