AWS Organizationsでマルチアカウント環境を構築した後、次に必要なのが組織全体のセキュリティガードレールの設計です。サービスコントロールポリシー(SCP)は、組織内のアカウントに対して「できること」の上限を設定する強力なツールです。本記事では、SCPの概念から実践的な使用パターン、設計のベストプラクティスまでを体系的に解説します。
サービスコントロールポリシー(SCP)とは
サービスコントロールポリシー(Service Control Policy、SCP)は、AWS Organizations内のアカウントやOU(組織単位)に対して、利用可能なAWSサービスとアクションの最大範囲を定義するポリシーです。
SCPの基本概念
SCPは「許可を与える」ものではなく、「許可の上限を設定する」ものです。アカウント内のIAMユーザーやロールが実際にアクションを実行するには、SCPで許可されている範囲内で、かつIAMポリシーでも明示的に許可されている必要があります。
flowchart TB
subgraph "権限の関係"
SCP[SCP<br/>許可の上限を設定]
IAM[IAMポリシー<br/>実際の権限を付与]
RESULT[実行可能な操作<br/>両方の共通部分]
end
SCP --> RESULT
IAM --> RESULTこの概念を「フィルター」に例えると理解しやすくなります。SCPは組織レベルのフィルターであり、IAMポリシーによる許可がSCPのフィルターを通過した場合にのみ、アクションが許可されます。
SCPとIAMポリシーの違い
SCPとIAMポリシーは構文が似ていますが、役割と適用範囲が大きく異なります。
| 比較項目 | SCP | IAMポリシー |
|---|---|---|
| 適用対象 | アカウント、OU | IAMユーザー、ロール、グループ |
| 役割 | 許可の上限(ガードレール) | 実際の権限付与 |
| 効果 | 許可を制限するが、付与はしない | 許可を付与する |
| 適用範囲 | アカウント内のすべてのプリンシパル | 指定されたプリンシパルのみ |
| 管理者 | Organizations管理者 | アカウント管理者 |
SCPの特徴と制約
SCPには以下の特徴と制約があります。
適用対象
- メンバーアカウントに適用される
- 管理アカウントには適用されない(重要)
- ルートユーザーを含むすべてのプリンシパルに影響
適用されないケース
- 管理アカウント自体
- サービスリンクロール
- リソースベースのポリシーで許可された外部プリンシパルからのアクセス
flowchart TB
subgraph "SCPの適用範囲"
direction TB
subgraph "適用される"
M1[メンバーアカウントの<br/>IAMユーザー]
M2[メンバーアカウントの<br/>IAMロール]
M3[メンバーアカウントの<br/>ルートユーザー]
end
subgraph "適用されない"
MA[管理アカウント]
SLR[サービスリンクロール]
EXT[外部からの<br/>リソースベースアクセス]
end
endSCPの継承と評価ロジック
SCPの効果を正しく理解するには、継承の仕組みと評価ロジックを把握する必要があります。
継承の仕組み
SCPは、組織のルートからOU、そしてアカウントへと階層的に継承されます。
flowchart TB
ROOT[Root<br/>SCP: FullAWSAccess]
OU1[Production OU<br/>SCP: DenyRiskyServices]
OU2[Development OU<br/>SCP: AllowDevelopment]
ACC1[本番アカウント A<br/>SCP: DenyDeleteLogs]
ACC2[本番アカウント B]
ACC3[開発アカウント]
ROOT --> OU1
ROOT --> OU2
OU1 --> ACC1
OU1 --> ACC2
OU2 --> ACC3本番アカウント Aには以下のSCPが適用されます。
- Root の FullAWSAccess
- Production OU の DenyRiskyServices
- アカウント自身の DenyDeleteLogs
有効なポリシーの計算
継承されたすべてのSCPの共通部分(AND条件)が、そのアカウントで許可される操作の上限となります。
flowchart LR
subgraph "継承されたSCP"
P1[Root SCP<br/>すべて許可]
P2[OU SCP<br/>特定サービス拒否]
P3[アカウント SCP<br/>特定アクション拒否]
end
P1 --> |AND| EFFECTIVE[有効なポリシー<br/>共通部分のみ許可]
P2 --> |AND| EFFECTIVE
P3 --> |AND| EFFECTIVE評価ロジックの詳細
AWSのポリシー評価において、SCPは以下の位置で評価されます。
flowchart TD
A[リクエスト開始] --> B{明示的なDenyが<br/>いずれかのポリシーに<br/>あるか?}
B -->|Yes| C[アクセス拒否]
B -->|No| D{すべての継承SCPで<br/>許可されているか?}
D -->|No| C
D -->|Yes| E{Permission Boundary<br/>で許可されているか?}
E -->|No| C
E -->|Yes| F{IAMポリシーで<br/>許可されているか?}
F -->|No| G{リソースベースポリシーで<br/>許可されているか?}
G -->|No| C
G -->|Yes| H[アクセス許可]
F -->|Yes| HSCPは、Permission BoundaryやIAMポリシーよりも先に評価されます。SCPで拒否されているアクションは、他のポリシーで許可されていても実行できません。
FullAWSAccessポリシー
Organizations作成時、デフォルトでFullAWSAccessポリシーがルートにアタッチされます。
|
|
このポリシーは「すべてを許可する」という意味ではなく、「SCPによる制限を追加しない」という意味です。このポリシーを削除すると、すべてのアクションが暗黙的に拒否されます。
SCP設計のアプローチ
SCPの設計には、主に2つのアプローチがあります。
許可リスト(Allow List)方式
許可するサービスとアクションを明示的にリストし、それ以外をすべて拒否するアプローチです。
flowchart LR
subgraph "許可リスト方式"
DEFAULT[デフォルト: すべて拒否]
ALLOW[許可リストに<br/>あるもののみ許可]
end
DEFAULT --> ALLOWメリット
- セキュリティが非常に高い
- 新しいサービスはデフォルトで拒否される
デメリット
- 管理が複雑
- 新しいサービス利用時に都度更新が必要
- FullAWSAccessポリシーの削除が必要
実装例
|
|
拒否リスト(Deny List)方式
デフォルトですべてを許可し、禁止したいサービスやアクションを明示的に拒否するアプローチです。
flowchart LR
subgraph "拒否リスト方式"
DEFAULT[デフォルト: すべて許可<br/>FullAWSAccess]
DENY[拒否リストに<br/>あるものを除外]
end
DEFAULT --> DENYメリット
- 管理がシンプル
- 新しいサービスを柔軟に利用可能
- 段階的な導入が容易
デメリット
- 新しいサービスがデフォルトで許可される
- 想定外のサービス利用のリスク
推奨: ほとんどの組織では、拒否リスト方式から始めることを推奨します。FullAWSAccessをベースに、禁止事項をSCPで追加していきます。
よく使われるSCPパターン
実践的なSCPの使用パターンを紹介します。これらは組み合わせて使用することで、組織のセキュリティ要件を満たすガードレールを構築できます。
パターン1: リージョン制限
特定のリージョンでのみAWSサービスの使用を許可するSCPです。コンプライアンス要件やデータ主権の観点で重要です。
|
|
NotActionで除外しているのは、グローバルサービス(IAM、Route 53、CloudFrontなど)です。これらはリージョンに依存せず、除外しないと正常に動作しません。
パターン2: 特定サービスの禁止
リスクの高いサービスや、組織で使用を禁止しているサービスをブロックします。
|
|
パターン3: ルートユーザーの使用禁止
メンバーアカウントでのルートユーザー使用を禁止し、IAMユーザーまたはロールの使用を強制します。
|
|
パターン4: CloudTrailの保護
監査ログを改ざんや削除から保護するSCPです。
|
|
Conditionを使用して、特定の管理者ロールからの操作は許可しています。
パターン5: S3パブリックアクセスの禁止
S3バケットの意図しないパブリック公開を防止します。
|
|
パターン6: VPCの保護
デフォルトVPCの削除やインターネットゲートウェイの操作を制限します。
|
|
パターン7: 組織離脱の禁止
メンバーアカウントが組織から離脱することを防止します。
|
|
パターン8: 必須タグの強制
リソース作成時に特定のタグを必須とするSCPです。
|
|
パターン9: 高額インスタンスタイプの制限
コスト管理のため、高額なEC2インスタンスタイプの起動を制限します。
|
|
パターン10: 暗号化の強制
EBSボリュームの暗号化を強制するSCPです。
|
|
SCPの作成と適用手順
SCPを作成し、組織に適用する手順を解説します。
マネジメントコンソールでの作成
- AWS Organizationsコンソールを開く
- 左側のナビゲーションで「ポリシー」を選択
- 「サービスコントロールポリシー」を選択
- 「ポリシーを作成」をクリック
- ポリシー名、説明、JSONを入力
- 「ポリシーを作成」をクリック
AWS CLIでの作成
|
|
SCPのアタッチ
作成したSCPをOUまたはアカウントにアタッチします。
|
|
SCPの確認
現在適用されているSCPを確認します。
|
|
SCP設計のベストプラクティス
効果的なSCPを設計するためのベストプラクティスを紹介します。
段階的な導入
SCPは即座に効果を発揮するため、慎重に導入する必要があります。
flowchart LR
S1[Policy Staging OU<br/>でテスト] --> S2[Sandbox OU<br/>に適用]
S2 --> S3[Development OU<br/>に適用]
S3 --> S4[Production OU<br/>に適用]- Policy Staging OUで新しいSCPをテスト
- Sandbox OUで影響範囲を確認
- Development OUで実運用に近い環境でテスト
- Production OUに本番適用
ドライラン的なテスト
SCPをアタッチする前に、CloudTrailログを分析して影響を予測します。
|
|
緊急時の除外ロール
すべてのSCPには、緊急時に使用できる除外ロール(Break Glass Role)を設定することを推奨します。
|
|
命名規則とバージョン管理
SCPには一貫した命名規則を適用し、バージョン管理システムで管理します。
| 命名パターン | 説明 | 例 |
|---|---|---|
| scp-deny-[対象] | 特定のアクションを拒否 | scp-deny-risky-services |
| scp-require-[条件] | 特定の条件を必須化 | scp-require-encryption |
| scp-restrict-[対象] | 対象の範囲を制限 | scp-restrict-regions |
バージョン管理の例(Gitリポジトリ構成)
scp-policies/
├── deny/
│ ├── scp-deny-risky-services.json
│ ├── scp-deny-root-user.json
│ └── scp-deny-leave-organization.json
├── require/
│ ├── scp-require-encryption.json
│ └── scp-require-tags.json
├── restrict/
│ ├── scp-restrict-regions.json
│ └── scp-restrict-instance-types.json
└── README.md
SCPのサイズ制限への対応
SCPには5,120文字のサイズ制限があります。大きなポリシーは分割が必要です。
| 制限項目 | 値 |
|---|---|
| ポリシーの最大サイズ | 5,120文字 |
| ルートまたはOUにアタッチできる最大SCP数 | 5個 |
| アカウントに直接アタッチできる最大SCP数 | 5個 |
対処法
- 複数のSCPに分割する
- 不要な空白を削除してコンパクトにする
- 類似したステートメントをワイルドカードで統合
OU構造との連携
SCPはOU構造と密接に連携させて設計します。
flowchart TB
ROOT[Root<br/>SCP: 基本ガードレール<br/>・組織離脱禁止<br/>・CloudTrail保護]
SEC[Security OU<br/>SCP: 最小限の制限]
INFRA[Infrastructure OU<br/>SCP: ネットワーク操作許可]
WORKLOAD[Workloads OU<br/>SCP: 標準的な制限<br/>・リージョン制限<br/>・高額インスタンス制限]
PROD[Production OU<br/>SCP: 厳格な制限<br/>・変更制限]
DEV[Development OU<br/>SCP: 緩やかな制限]
ROOT --> SEC
ROOT --> INFRA
ROOT --> WORKLOAD
WORKLOAD --> PROD
WORKLOAD --> DEVSCPのトラブルシューティング
SCPに関する問題の診断と解決方法を解説します。
よくある問題と解決策
問題1: 意図しないアクションが拒否される
flowchart TD
A[アクションが拒否された] --> B{SCPが原因か<br/>確認}
B -->|確認方法| C[IAM Policy Simulator<br/>で検証]
C --> D{SCP違反?}
D -->|Yes| E[SCPの見直し]
D -->|No| F[IAMポリシーの確認]確認手順
- CloudTrailでエラーイベントを確認
- IAM Policy Simulatorでシミュレーション
- 継承されているすべてのSCPを確認
- NotActionやConditionの意図しない影響を確認
問題2: グローバルサービスが使用できない
リージョン制限SCPでグローバルサービスを除外し忘れた場合に発生します。IAM、Route 53、CloudFrontなどはNotActionで除外が必要です。
問題3: SCPの変更が反映されない
SCPの変更は通常即座に反映されますが、キャッシュの影響で数分かかる場合があります。数分待ってから再試行してください。
デバッグ用のCloudTrailクエリ
CloudTrail Lakeを使用してSCP違反を分析できます。
|
|
SCPとControl Towerの統合
AWS Control Towerを使用している場合、SCPはガードレールの一部として自動管理されます。
Control Towerのガードレール
Control Towerは、SCPを「予防的ガードレール」として使用します。
| ガードレールタイプ | 実装方法 | 例 |
|---|---|---|
| 予防的(Preventive) | SCP | リージョン制限、CloudTrail保護 |
| 検出的(Detective) | AWS Config Rules | 暗号化されていないS3の検出 |
| プロアクティブ | CloudFormation Hooks | デプロイ時の検証 |
Control TowerのSCPとカスタムSCPの共存
Control Towerが管理するSCPとカスタムSCPは共存できます。ただし、以下の点に注意が必要です。
- Control Towerが管理するSCPは手動で変更しない
- カスタムSCPはControl Towerの管理外のOUに適用
- 競合を避けるため、役割を明確に分離
まとめ
サービスコントロールポリシー(SCP)は、AWS Organizationsにおける強力なセキュリティガードレールです。本記事で解説した内容を振り返ります。
- SCPは許可の上限を設定するフィルターであり、権限を付与するものではない
- 継承ロジックにより、ルートからOUを経由してアカウントに適用される
- 拒否リスト方式から始め、段階的にガードレールを強化することを推奨
- よく使われるパターン(リージョン制限、ルートユーザー禁止、CloudTrail保護など)を組み合わせて使用
- 段階的な導入とPolicy Staging OUでのテストが重要
- 緊急時の除外ロールを必ず設定しておく
SCPを効果的に活用することで、組織全体のセキュリティベースラインを確立し、コンプライアンス要件を満たすことができます。次の記事では、タグポリシーとバックアップポリシーを使用した組織全体のガバナンス強化について解説します。