予防コントロール
Control Tower のコントロールとは
AWS Control Tower は、マルチアカウント環境にガバナンスルール(コントロール)を適用するサービスである。コントロールには以下の 3 種類がある。
| 種類 | 動作 | 概要 |
|---|---|---|
| 予防(Preventive) | 違反操作をブロック | ポリシーにより、違反する API 操作を事前に拒否する |
| 検出(Detective) | 違反リソースを検出 | AWS Config ルールにより、違反状態のリソースを検出・通知する |
| プロアクティブ(Proactive) | デプロイ時にチェック | CloudFormation Hook により、リソース作成・更新時に違反をブロックする |
本ページでは予防コントロールを扱う。
予防コントロールの概要
予防コントロールは全 69 個(Control Catalog API で確認)あり、実装方式は以下の 3 種類に分かれる。
| 実装方式 | 個数 | 概要 |
|---|---|---|
| SCP(サービスコントロールポリシー) | 56 | 特定の API 操作を禁止する。違反する操作は実行前にブロックされる |
| RCP(リソースコントロールポリシー) | 9 | 個々のリソース設定(バケットポリシー等)に関係なく、リソースへのアクセス条件を一括で強制する(組織外アクセスのブロック、TLS の強制等) |
| Declarative policies(宣言型ポリシー) | 4 | EC2 関連のアカウントレベル設定を強制する(EBS スナップショットのパブリック共有禁止、AMI のパブリック共有禁止等) |
SCP と RCP の主な違い
| SCP | RCP | |
|---|---|---|
| 制御の視点 | 適用した OU 配下のアカウントの IAM プリンシパルに対して、特定の操作を禁止する | 適用した OU 配下のアカウントのリソースへのアクセスに対して、条件に合わないアクセスを拒否する |
| 効果の範囲 | 適用した OU 配下のアカウントのプリンシパルのみ。組織外からのアクセスには効かない | 組織内外を問わず、対象リソースにアクセスする全てのプリンシパル |
| 組織外アクセスの遮断 | できない | できる |
具体例で理解する
S3 バケットのバケットポリシーで、組織外アカウントに GetObject を許可している状態を考える。
SCP の場合:
{
"Effect": "Deny",
"Action": "s3:PutBucketPolicy",
"Resource": "*"
}この SCP は「組織内ユーザーがバケットポリシーを変更する操作」を禁止する。しかし、既に設定済みのバケットポリシーによる組織外からのアクセスは止められない。SCP は組織外プリンシパルのリクエストに対して評価されないためである。
RCP の場合:
{
"Effect": "Deny",
"Action": "s3:*",
"Resource": "*",
"Condition": {
"StringNotEquals": {
"aws:PrincipalOrgID": "o-xxxxxxxxxx"
},
"Bool": {
"aws:PrincipalIsAWSService": "false"
}
}
}この RCP は「組織外プリンシパルからの S3 アクセス」をリソース側で拒否する。バケットポリシーで許可されていても、RCP が上位レイヤーとして拒否する。なお、RCP はバケットポリシー自体を書き換えるわけではない(CT.S3.PV.4 の検証で確認済み)。
一部の SCP・RCP コントロールでは、ExemptedPrincipalArns 等のパラメータにより例外設定が可能。詳細は Controls with parameters を参照。
必須コントロール
ランディングゾーンのセットアップ時に自動適用され、無効化できないコントロール。全 OU 共通のものと Security OU 固有のものがある。
全 OU 共通(15 個・すべて予防/SCP)
| コントロール ID | 概要 |
|---|---|
| AWS-GR_CLOUDTRAIL_CHANGE_PROHIBITED | CloudTrail の設定変更禁止 |
| AWS-GR_CLOUDTRAIL_CLOUDWATCH_LOGS_ENABLED | CloudTrail と CloudWatch Logs の統合維持 |
| AWS-GR_CLOUDTRAIL_ENABLED | 全リージョンで CloudTrail 有効化維持 |
| AWS-GR_CLOUDTRAIL_VALIDATION_ENABLED | CloudTrail ログファイルの整合性検証維持 |
| AWS-GR_CLOUDWATCH_EVENTS_CHANGE_PROHIBITED | Control Tower 管理の CloudWatch Events 変更禁止 |
| AWS-GR_CONFIG_AGGREGATION_AUTHORIZATION_POLICY | Config Aggregation Authorization の削除禁止 |
| AWS-GR_CONFIG_AGGREGATION_CHANGE_PROHIBITED | Config リソースのタグ変更禁止 |
| AWS-GR_CONFIG_CHANGE_PROHIBITED | Config の設定変更禁止 |
| AWS-GR_CONFIG_ENABLED | 全リージョンで Config 有効化維持 |
| AWS-GR_CONFIG_RULE_CHANGE_PROHIBITED | Control Tower 管理の Config Rules 変更禁止 |
| AWS-GR_IAM_ROLE_CHANGE_PROHIBITED | Control Tower / CloudFormation 管理の IAM ロール変更禁止 |
| AWS-GR_LAMBDA_CHANGE_PROHIBITED | Control Tower 管理の Lambda 関数変更禁止 |
| AWS-GR_LOG_GROUP_POLICY | CloudWatch Logs ロググループの変更禁止 |
| AWS-GR_SNS_CHANGE_PROHIBITED | Control Tower 管理の SNS トピック変更禁止 |
| AWS-GR_SNS_SUBSCRIPTION_CHANGE_PROHIBITED | Control Tower 管理の SNS サブスクリプション変更禁止 |
Security OU 固有(8 個・予防 5 + 検出 3)
Security OU(デフォルトでは Audit アカウント・LogArchive アカウントが所属)にのみ適用される。LogArchive アカウントの S3 バケット保護が中心。
| コントロール ID | 種類 | 概要 |
|---|---|---|
| AWS-GR_CT_AUDIT_BUCKET_ENCRYPTION_CHANGES_PROHIBITED | 予防 | LogArchive の S3 バケット暗号化設定変更禁止 |
| AWS-GR_CT_AUDIT_BUCKET_LOGGING_CONFIGURATION_CHANGES_PROHIBITED | 予防 | LogArchive の S3 バケットログ設定変更禁止 |
| AWS-GR_CT_AUDIT_BUCKET_POLICY_CHANGES_PROHIBITED | 予防 | LogArchive の S3 バケットポリシー変更禁止 |
| AWS-GR_CT_AUDIT_BUCKET_LIFECYCLE_CONFIGURATION_CHANGES_PROHIBITED | 予防 | LogArchive の S3 バケットライフサイクル設定変更禁止 |
| AWS-GR_AUDIT_BUCKET_DELETION_PROHIBITED | 予防 | LogArchive の S3 バケット削除禁止 |
| AWS-GR_AUDIT_BUCKET_PUBLIC_READ_PROHIBITED | 検出 | LogArchive の S3 バケットパブリック読み取りアクセス検出 |
| AWS-GR_AUDIT_BUCKET_PUBLIC_WRITE_PROHIBITED | 検出 | LogArchive の S3 バケットパブリック書き込みアクセス検出 |
| AWS-GR_DETECT_CLOUDTRAIL_ENABLED_ON_SHARED_ACCOUNTS | 検出 | Security OU 配下の共有アカウントで CloudTrail が無効になっていないか検出 |
ランディングゾーン 4.0 での変更: 4.0 にアップデートすると、Security OU 固有の予防コントロール 5 個と検出コントロール 2 個(パブリックアクセス検出)は廃止され、以下の 3 つの新しい必須コントロールに置き換えられる。
- CT.S3.PV.8 - Control Tower 管理 S3 バケット(
aws-controltower-access-logs-*、aws-controltower-cloudtrail-*、aws-controltower-logs-*)のバケットレベル操作を一括で禁止。従来の 5 個の個別コントロールを統合 - CT.S3.PV.7 - Config 記録用 S3 バケット(
aws-controltower-config-*)のバケットレベル操作を禁止。4.0 で Config のログ保存先が専用バケットに分離されることに伴う新設 - CT.SNS.PV.1 - 集中ログ用 SNS トピック(
aws-controltower-CentralizedLoggingNotifications*)の変更禁止。4.0 でサービスごとに個別の SNS トピックが作成されることに伴う新設
検証環境
選定の考え方
予防コントロール 69 個の内訳は以下の通り。
- 必須 23 個:ランディングゾーンのセットアップ時に自動適用(うち 3 個はランディングゾーン 4.0 で追加)
- 強く推奨 2 個:ルートユーザーのアクション禁止(AWS-GR_RESTRICT_ROOT_USER)、アクセスキー作成禁止(AWS-GR_RESTRICT_ROOT_USER_ACCESS_KEYS)。ルートアクセス一元管理との関係整理が必要なため、一元管理の検証と合わせて必要に応じて検討する
- 選択的 44 個:以下の通り目的別に分類し、有効化の判断を行った
パブリックアクセスは設定ミスの瞬間にリスクが顕在化するため、リソースポリシー系の予防コントロールは即座に有効化しやすい。VPC BPA(CT.EC2.PV.8)も同じくパブリックアクセスの防止が目的であるが、パブリック IP の付与や IGW 経由のインターネットアクセスは意図した設計である可能性もあり、実環境への投入時には影響評価が必要である(CT.EC2.PV.8 の検証で挙動を確認済み)。データ境界や暗号化も基本的なセキュリティ要件として有効化した。
未検証としたものは、既存ワークロードへの影響評価が必要なもの(ネットワーク構成の制限、S3 の TLS 1.3 強制等)と、ワークロードのセキュリティとは目的が異なるもの(Control Tower 管理基盤の保護、KMS 鍵管理の詳細制御等)である。
| 目的 | 判断 | 個数 | 理由 |
|---|---|---|---|
| パブリックアクセスの防止 | 有効化 | 5 | 設定ミスの瞬間にリスクが顕在化する。検知を待つ猶予がない |
| 有効化 | 1 | CT.APPSYNC.PV.1 を検証済み | |
| 有効化 | 1 | CT.EC2.PV.8 を検証済み | |
| データ境界の構築(組織外アクセス遮断) | 有効化 | 5 | パブリック・クロスアカウントの組織外アクセスを、リソース側から RCP で遮断 |
| 転送中データの暗号化 | 有効化 | 1 | S3 への HTTPS 以外のアクセスを遮断 |
| 保存データの暗号化 | 有効化 | 2 | 基本的なセキュリティ要件 |
| リージョン制限 | 有効化 | 1 | OU 単位で制御可能な CT.MULTISERVICE.PV.1 を検証 |
| 未検証 | 1 | ランディングゾーン全体に適用される AWS-GR_REGION_DENY | |
| ネットワーク制限 | 未検証 | 3 | IGW 作成禁止、VPN 禁止、クロスリージョン禁止。既存ワークロードへの影響評価が必要 |
| KMS 鍵管理の詳細制御 | 未検証 | 6 | 鍵の生成元やグラント制限など、高度な要件向け |
| S3 データ保護(TLS 1.3/SSE-KMS 強制) | 未検証 | 3 | Presigned URL 不可、TLS 1.3 強制等の影響評価が必要 |
| EC2 特殊 API 制限 | 未検証 | 4 | EBS Direct API、VM Import/Export、非推奨 Spot API 等の使用禁止。利用状況の確認が必要 |
| CT/Backup 管理リソース保護 | 未検証 | 6 | Control Tower 自体の管理基盤の保護であり、ワークロードのセキュリティとはテーマが異なる |
| LogArchive S3 バケット保護 | 未検証 | 5 | Security OU 固有の設定であり、同上 |
検証したコントロール一覧
上記の選定に基づき、以下の 14 個のコントロールを実際の AWS アカウントで検証した。すべての記事で統一的な検証観点(有効化前後の挙動・既存環境への影響・エラーメッセージ・CloudTrail 検出の有無)で検証している。
SCP(サービスコントロールポリシー)
| コントロール | 対象サービス | 有効化後の影響 | 既存リソースへの影響 | Security Hub 対応 |
|---|---|---|---|---|
| CT.EC2.PV.1 | EC2 | 未暗号化ボリュームからのスナップショット作成をブロック | 既存スナップショットは維持 | 直接対応なし |
| CT.EC2.PV.2 | EC2 | 未暗号化 EBS ボリュームのアタッチをブロック | 既存アタッチは維持 | EC2.3 を補完 |
| CT.EC2.PV.3 | EC2 | EBS スナップショットのパブリック共有をブロック | 既存のパブリック共有は維持 | EC2.1 を補完 |
| CT.LAMBDA.PV.1 | Lambda | Lambda 関数 URL の AuthType を IAM_AUTH 以外に設定する操作をブロック | 既存の関数 URL は維持 | 直接対応なし |
| CT.LAMBDA.PV.2 | Lambda | Lambda 関数・関数 URL のパブリックアクセス設定をブロック | 既存設定は維持 | Lambda.1 を補完 |
| CT.MULTISERVICE.PV.1 | 複数 | 許可リージョン以外での API 操作をブロック | 既存リソースは維持(操作不可) | 直接対応なし |
RCP(リソースコントロールポリシー)
| コントロール | 対象サービス | 有効化後の影響 | 既存リソースへの影響 | Security Hub 対応 |
|---|---|---|---|---|
| CT.S3.PV.4 | S3 | 組織外プリンシパルからの S3 アクセスをブロック | バケットポリシーは維持 ※ | 直接対応なし |
| CT.S3.PV.5 | S3 | S3 への HTTP(非 TLS)アクセスをブロック | バケットポリシーは維持 ※ | S3.5 の予防版(ただし FAILED は解消されない) |
| CT.KMS.PV.7 | KMS | 組織外プリンシパルからの KMS アクセスをブロック | キーポリシーは維持 ※ | 直接対応なし |
| CT.SECRETSMANAGER.PV.1 | Secrets Manager | 組織外プリンシパルからの Secrets Manager アクセスをブロック | リソースポリシーは維持 ※ | 直接対応なし |
| CT.SQS.PV.1 | SQS | 組織外プリンシパルからの SQS アクセスをブロック | キューポリシーは維持 ※ | 直接対応なし |
| CT.STS.PV.1 | STS | 組織外プリンシパルからの AssumeRole をブロック(AssumeRoleWithSAML / AssumeRoleWithWebIdentity はスコープ外) | 信頼ポリシーは維持 ※ | 直接対応なし |
Declarative policies(宣言型ポリシー)
| コントロール | 対象サービス | 有効化後の影響 | 既存リソースへの影響 | Security Hub 対応 |
|---|---|---|---|---|
| CT.EC2.PV.7 | EC2 | EBS スナップショットのパブリック共有を Block Public Access で禁止 | 既存のパブリック共有スナップショットも他アカウントからアクセス不可になる | EC2.1 が PASSED に変化 |
| CT.EC2.PV.11 | EC2 | AMI のパブリック共有を禁止 | 既存のパブリック共有 AMI も他アカウントからアクセス不可になる | 直接対応なし |
| CT.EC2.PV.8 | EC2 | VPC BPA を block-bidirectional に強制し、除外(Exclusions)の作成も禁止 | IGW / Egress-only IGW 経由の全インターネットアクセスがブロックされる | 直接対応なし(個別リソースの設定をチェックする CSPM コントロールは変化しない見込み) |