📜 AWS SCP構文 完全図解ガイド

マンション管理規約で理解する!Service Control Policyの書き方

📌 結論:SCPは7つの要素で構成される

SCPはJSON形式で書かれ、以下の7つの要素を組み合わせて権限を制御します

📋
Version
バージョン指定
📦
Statement
ルールの箱
🏷️
Sid
識別名
⚖️
Effect
許可/拒否
🎯
Action
対象アクション
📍
Resource
対象リソース
🔍
Condition
適用条件

🏢 SCPはマンション管理規約のようなもの!

🏠 たとえ話:マンション管理組合の規約

🏢 AWS Organization(マンション管理組合)
📜 SCP
(管理規約)
📋
第1条
📋
第2条
📋
第3条
🏢 OU
(各棟)
🏠
A棟
🏠
B棟
🏠
C棟
🔑 アカウント
(各住戸)
🚪
101号室
🚪
102号室
🚪
103号室
📜

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つの要素を詳しく解説

📋
Version
必須
🏠 マンションのたとえ
管理規約の「改定年月日」のようなもの。
「令和5年度版」のように、どのルール体系を使うか指定。
"Version": "2012-10-17"
💡 ポイント
常に "2012-10-17" を指定します。
これはIAMポリシーの最新バージョンと同じです。
📦
Statement
必須
🏠 マンションのたとえ
管理規約の「条項」を入れる箱。
「第1条」「第2条」...と複数のルールを格納できる。
"Statement": [ { /* 第1条 */ }, { /* 第2条 */ } ]
💡 ポイント
配列形式で複数のステートメントを含めることが可能
1つだけでもOK、複数でもOK!
🏷️
Sid
任意
🏠 マンションのたとえ
条項の「タイトル」や「見出し」。
「ペット飼育に関する条項」のような分かりやすい名前。
"Sid": "DenyS3Delete"
💡 ポイント
省略可能ですが、分かりやすい名前をつけると管理が楽に!
何をするルールか一目でわかる名前がベスト。
⚖️
Effect
必須
🏠 マンションのたとえ
「許可する」か「禁止する」かの判定。
管理規約の「〜してよい」「〜してはならない」の部分。
"Effect": "Allow" または "Effect": "Deny"
💡 ポイント
Allow(許可)またはDeny(拒否)の2択。
SCPでは通常Denyでガードレールを設定します。
🎯
Action / NotAction
必須
🏠 マンションのたとえ
対象となる「行為」の指定。
「ペットを飼う」「ピアノを弾く」「BBQをする」など。
"Action": ["s3:DeleteBucket", "ec2:*"] "NotAction": ["iam:*"] ← 除外指定
💡 ポイント
サービス名:アクション名の形式で指定。
*(アスタリスク)でワイルドカード指定可能!
📍
Resource / NotResource
必須
🏠 マンションのたとえ
対象となる「場所・設備」の指定。
「共用廊下」「屋上」「駐車場」「特定の部屋」など。
"Resource": "*" ← 全リソース "Resource": "arn:aws:s3:::my-bucket" ← 特定リソース
💡 ポイント
Allowの場合は"*"のみ指定可能。
Denyの場合は特定のARNも指定可能!
🔍
Condition
任意
🏠 マンションのたとえ
ルールが適用される「条件」。
「22時以降」「週末のみ」「管理人以外」など。
"Condition": { "StringNotEquals": { "aws:RequestedRegion": "ap-northeast-1" } }
💡 ポイント
条件演算子(StringEquals等)と条件キーを組み合わせ。
リージョン制限特定ロール除外に活用!

⚖️ Allow vs Deny の違いを図解

SCPの2つのEffect(効果)を理解しよう!

Allow(許可)
許可リスト戦略で使用します。
指定したアクションのみを許可し、それ以外は暗黙的に拒否。
デフォルトの「FullAWSAccess」を外した場合に使用。

🏠 マンションのたとえ

共用ラウンジでは読書と勉強のみ許可
→ それ以外の行為(飲食、睡眠等)は自動的に禁止

📌 使用場面:

厳格なセキュリティが必要な環境で、
必要最小限の権限のみを許可したい場合

🚫
Deny(拒否)
拒否リスト戦略で使用します。
デフォルトで全てを許可し、特定のアクションのみを拒否。
最も一般的な使い方です。

🏠 マンションのたとえ

共用部でのBBQは禁止
→ BBQ以外の行為は基本的にOK

📌 使用場面:

ガードレールとして特定の危険なアクションを
組織全体でブロックしたい場合

🎯 Action vs NotAction の違い

対象アクションの指定方法は2種類あります!

🎯
Action
対象を直接指定
「このアクションに適用」
⚔️
🚷
NotAction
除外を指定
「このアクション以外に適用」

🏠 マンションのたとえで理解!

Action の場合

ペットを飼うことピアノを弾くことを禁止」
→ 明示的に列挙したものだけが対象

NotAction の場合

緊急避難以外の深夜行動を禁止」
→ 除外したもの以外すべてが対象

🃏 ワイルドカードの使い方

*(アスタリスク)
0文字以上の任意の文字列
"s3:*" → S3の全アクション
"ec2:Describe*" → Describeで始まる全て
?(クエスチョン)
任意の1文字
"s3:Get?" → s3:GetS, s3:GetX など
1文字だけの部分一致
サービス:アクション
基本的な記法
"s3:DeleteBucket"
"ec2:TerminateInstances"

🔍 Condition(条件)の使い方

「いつ」「誰が」「どこで」などの条件を細かく指定できます!

🌍
リージョン制限
🏠 マンションのたとえ

「A棟とB棟でのみ許可」のような場所制限

"Condition": { "StringEquals": { "aws:RequestedRegion": [ "ap-northeast-1", "ap-northeast-3" ] } }

東京・大阪リージョンのみを許可する例

👤
プリンシパル制限
🏠 マンションのたとえ

「管理人以外は立入禁止」のような人物制限

"Condition": { "StringNotEquals": { "aws:PrincipalArn": [ "arn:aws:iam::*:role/Admin" ] } }

Adminロール以外に制限を適用する例

🏷️
タグベース制限
🏠 マンションのたとえ

「VIP会員証を持つ人のみ利用可」のような資格制限

"Condition": { "StringEquals": { "aws:ResourceTag/Environment": "Production" } }

特定タグが付いたリソースにのみ適用

📋 よく使う条件演算子

StringEquals

完全一致

StringNotEquals

不一致

StringLike

ワイルドカード一致

ArnLike

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"
          ]
        }
      }
    }
  ]
}

📖 各要素の解説

📋 Version

IAMポリシーの最新バージョンを指定

🏷️ Sid: DenyOutsideJapan

「日本以外を拒否」という分かりやすい名前

⚖️ Effect: Deny

このルールは「拒否」するガードレール

🎯 NotAction

IAM・Organizations・Support以外のすべてが対象

📍 Resource: *

すべてのリソースに適用

🔍 Condition

東京・大阪以外のリージョンで発動

🏠 マンション規約に翻訳すると...

第X条(日本以外を拒否):住人は、管理業務(IAM/Organizations/Support)を除き、
東京棟・大阪棟以外での活動を禁止する

⚠️ SCPでサポートされない要素

以下の要素はSCPでは使用できません!

👤
Principal
SCPは組織全体に適用されるため
個別のプリンシパル指定は不可
🚷
NotPrincipal
同様にプリンシパル除外の
指定もサポートされません

💡 代わりに Condition を使用!
特定のユーザー/ロールを除外したい場合は
aws:PrincipalArn 条件キーを使いましょう

📊 SCP要素 一覧比較表

要素 必須 Allow Deny 用途
📋 Version ポリシー言語バージョン
📦 Statement ルールのコンテナ
🏷️ Sid 識別用の名前
⚖️ Effect 許可/拒否の指定
🎯 Action 対象アクション
🚷 NotAction 除外アクション
📍 Resource * のみ ARN可 対象リソース
🔍 Condition 適用条件

❓ よくある質問

🤔 SCPとIAMポリシーの構文は同じ?
ほぼ同じですが、いくつか違いがあります。
SCPでは PrincipalNotPrincipal が使用できません。
また、Allow時のResourceは「*」のみ指定可能です。
基本的なJSON構造は同じなので、IAMポリシーを書いたことがあれば比較的簡単に理解できます。
🤔 SCPのサイズ制限は?
SCPの最大サイズは5,120バイトです。
空白文字(スペース、改行)もカウントされるため、サイズが近づいたら空白を削除しましょう。
複雑なポリシーは複数のSCPに分割することも検討してください。
🤔 AllowとDeny、どちらを使うべき?
通常は Deny(拒否リスト戦略)を推奨します。
デフォルトの「FullAWSAccess」ポリシーを維持したまま、特定の危険なアクションだけをブロックする方が管理が楽です。
Allow(許可リスト戦略)は、非常に厳格なセキュリティが必要な場合にのみ使用しましょう。
🤔 NotActionはいつ使う?
「特定のサービス以外すべて」を対象にしたい場合に使用します。
例えば、リージョン制限をかけるとき、IAMやOrganizationsなどのグローバルサービスは除外する必要があります。
このような場合に NotAction で除外対象を指定すると便利です。

🎓 まとめ

📋
Version
常に
"2012-10-17"
📦
Statement
ルールを入れる
箱(配列)
🏷️
Sid
わかりやすい
名前(任意)
⚖️
Effect
Allow or
Deny
🎯
Action
対象の
アクション
📍
Resource
対象の
リソース
🔍
Condition
適用する
条件(任意)
🏠 マンション管理規約 = SCP構文

📜 管理規約全体 = SCPポリシー
📋 各条項 = Statement
⚖️ 許可/禁止 = Effect
🎯 対象行為 = Action
📍 対象場所 = Resource
🔍 適用条件 = Condition

この7つの要素を組み合わせて、組織のセキュリティガードレールを構築しましょう!🛡️

Created by SSuzuki1063

AWS SAP Learning Resources