「AWS Organizationsに、まずどのSCPを入れればいい?」——最低限のガードレールを、コピペできるSCP/RCPのJSON雛形付きで整理します。監査/検知の保護・root禁止・リージョン制限から、TLS必須・組織境界のRCP、そして既存ワークロードを壊さない適用順序まで。

01まず、どのSCPを入れる?

AWS Organizationsの仕組みと設計で「Root・OUにガードレール(SCP/RCP)を敷く」と書きました。では具体的にどれを、どのJSONで入れればいいのか——コピペできる雛形付きで、最低限のセットを示します。

この記事のポリシーは、AWS公式ドキュメントと公式サンプル(aws-samples/Control Tower)由来です。${Account} / [PrivilegedRole] / o-xxxxxxxxxx などはプレースホルダなので自環境の値へ置換してください。

現場のコツ:大前提:SCP/RCPは"許可を与えない"。あくまで上限(ガードレール)で、実際の許可はIAM側が必要。実効権限は「SCP ∩ RCP ∩ IDポリシー」の論理積です。そして管理アカウントには効きません

02前提 — 評価モデルとDenyリスト戦略

雛形を貼る前に、これだけは押さえます。ここを誤ると事故ります。

03① 監査・検知を止めさせない(最初に入れる)

最初に入れるべきはこれ。誰の業務も止めず、いざという時の証跡と検知を守ります。CloudTrail・Config・GuardDuty・Security Hub の停止/削除/改変を禁止(運用ロールだけ例外)。

{
  "Version": "2012-10-17",
  "Statement": [{
    "Sid": "ProtectSecurityServices",
    "Effect": "Deny",
    "Action": [
      "cloudtrail:StopLogging", "cloudtrail:DeleteTrail", "cloudtrail:UpdateTrail",
      "config:StopConfigurationRecorder", "config:DeleteConfigurationRecorder",
      "config:DeleteDeliveryChannel",
      "guardduty:DeleteDetector", "guardduty:DisassociateFromMasterAccount",
      "securityhub:DisableSecurityHub", "securityhub:DisassociateFromMasterAccount"
    ],
    "Resource": "*",
    "Condition": {
      "ArnNotLike": { "aws:PrincipalArn": "arn:aws:iam::*:role/[SecurityAdminRole]" }
    }
  }]
}
公式サンプル(aws-samples/service-control-policy-examples)はサービスごとに分かれ、上記よりアクションが網羅的です。Macie / IAM Identity Center / Access Analyzer 保護の例も同リポジトリにあります。組織トレイル・Config集約を使う場合は Resource を絞るとより堅牢。

04② rootユーザーの利用を禁止

メンバーアカウントの root による操作を全面禁止(監査ログ改ざん等の最終手段を封じる)。

{
  "Version": "2012-10-17",
  "Statement": [{
    "Sid": "DenyRootUser",
    "Effect": "Deny",
    "Action": "*",
    "Resource": "*",
    "Condition": {
      "StringLike": { "aws:PrincipalArn": "arn:aws:iam::*:root" }
    }
  }]
}
現場のコツ:緊急用に最小限だけ残すなら、Action:"*"NotAction:["s3:GetBucketPolicy","s3:PutBucketPolicy","s3:DeleteBucketPolicy"] に変えます。ただし2026年の本命は「rootを縛る」より「rootを消す」——Centralized Root Access でメンバーの root 資格情報(パスワード/アクセスキー/MFA)を中央から削除し、必要時のみ短期の sts:AssumeRoot を使う。SCPは多層防御として併用します。

05③ 組織離脱・アカウント閉鎖を禁止

メンバーアカウントが勝手に組織を抜ける/閉鎖されるのを防ぎます(短く、影響も読みやすい)。

{
  "Version": "2012-10-17",
  "Statement": [{
    "Sid": "DenyLeaveAndClose",
    "Effect": "Deny",
    "Action": [
      "organizations:LeaveOrganization",
      "account:CloseAccount"
    ],
    "Resource": "*"
  }]
}
2026年7月以降にコンソールで作成した組織は、この離脱/閉鎖拒否SCPが自動付与されます(CLI/CloudFormation作成分や旧組織は手動)。account:CloseAccount は AWS Account Management のアクションです。

06④ リージョンを制限する

許可リージョン外の操作をDeny。攻撃対象・コンプラ面で効きますが、グローバルサービスを壊さない除外が肝。下は要点版で、aws:RequestedRegion の配列に許可リージョンを入れます。

{
  "Version": "2012-10-17",
  "Statement": [{
    "Sid": "DenyOutsideAllowedRegions",
    "Effect": "Deny",
    "NotAction": [
      "iam:*", "organizations:*", "sts:*", "cloudfront:*", "route53:*",
      "support:*", "globalaccelerator:*", "waf:*", "wafv2:*",
      "budgets:*", "ce:*", "health:*", "account:*"
    ],
    "Resource": "*",
    "Condition": {
      "StringNotEquals": {
        "aws:RequestedRegion": [ "ap-northeast-1", "us-east-1" ]
      },
      "ArnNotLike": {
        "aws:PrincipalArn": "arn:aws:iam::*:role/AWSControlTowerExecution"
      }
    }
  }]
}
実運用はこの要点版で満足せず、Control Towerの「Region deny」コントロールの完全な除外リスト(AWSが網羅メンテ)をベースにしてください。グローバルサービスの正確な除外はもっと多いです。us-east-1(IAM/CloudFront/Route53のエンドポイント)とホームリージョンは必ず許可に含める——含めないとグローバル操作が壊れます。5,120文字上限にも注意。

07⑤ 危険な設定変更を禁止

暗号化の無効化・パブリック化・ログ削除といった"取り返しのつかない緩和"を禁止します(運用ロールだけ例外)。

{
  "Version": "2012-10-17",
  "Statement": [{
    "Sid": "DenyDangerousChanges",
    "Effect": "Deny",
    "Action": [
      "ec2:DisableEbsEncryptionByDefault",
      "ec2:DeleteFlowLogs",
      "s3:PutAccountPublicAccessBlock",
      "s3:PutBucketPublicAccessBlock"
    ],
    "Resource": "*",
    "Condition": {
      "ArnNotLike": { "aws:PrincipalArn": "arn:aws:iam::*:role/[PrivilegedRole]" }
    }
  }]
}
あわせて、Control Tower/IAMで作成したセキュリティ用ロールへの変更・削除を禁止するSCP(対象ロールARNへの iam:UpdateRole/DeleteRole/PutRolePolicy/AttachRolePolicy 等をDeny)も定番です。

08RCP — TLS必須と「組織の外から触らせない」

SCPが"組織内プリンシパル"を縛るのに対し、RCP(2024/11新設)はリソース側の上限で、組織外からのアクセスも止められます(データ境界)。社外ベンダーの越境アクセスはSCPでは止まりません。

TLS必須(暗号化されていない通信を拒否):

{
  "Version": "2012-10-17",
  "Statement": [{
    "Sid": "EnforceTLS",
    "Effect": "Deny",
    "Principal": "*",
    "Action": [ "s3:*", "sts:*", "kms:*", "sqs:*", "secretsmanager:*" ],
    "Resource": "*",
    "Condition": {
      "BoolIfExists": { "aws:SecureTransport": "false" }
    }
  }]
}

組織境界(自組織のプリンシパル以外を拒否・AWSサービスは除外):

{
  "Version": "2012-10-17",
  "Statement": [{
    "Sid": "EnforceOrgPerimeter",
    "Effect": "Deny",
    "Principal": "*",
    "Action": [ "s3:*", "sts:*", "kms:*", "sqs:*", "secretsmanager:*" ],
    "Resource": "*",
    "Condition": {
      "StringNotEqualsIfExists": { "aws:PrincipalOrgID": "o-xxxxxxxxxx" },
      "Bool": { "aws:PrincipalIsAWSService": "false" }
    }
  }]
}
RCPは「対応サービスのみ」効きます。GA当初は S3/STS/KMS/SQS/Secrets Manager の5つで、現在は DynamoDB・ECR・CloudWatch Logs・Cognito・OpenSearch Serverless 等へ拡大中。TLS必須RCPを書いても未対応サービスには効かない点に注意(最新は公式の対応サービス一覧を確認)。BoolIfExists / ...IfExists はサービス統合の誤爆を防ぐための書き方です。

09宣言的ポリシー — 設定を"恒久的に"固定する

宣言的ポリシー(2024新)は、SCP/RCPと違いサービスのコントロールプレーンで強制され、コンソール/CLI/SDK/新API追加後も維持されます。構文は @@assign を使う独自形式(現状は主にEC2系)。

IMDSv2 を強制(v1を塞ぐ):

{
  "ec2_attributes": {
    "instance_metadata_defaults": {
      "http_tokens": { "@@assign": "required" },
      "http_put_response_hop_limit": { "@@assign": "2" }
    }
  }
}

VPCのパブリックアクセスをブロック

{
  "ec2_attributes": {
    "vpc_block_public_access": {
      "internet_gateway_block": { "mode": { "@@assign": "block_ingress" } }
    }
  }
}
http_tokens_enforced を有効化する場合は、IMDSv1利用の棚卸しを先に(未対応のまま強制すると起動失敗)。EBS既定暗号化は宣言的ポリシーの対象外なので、アカウント設定の有効化+⑤のSCP(ec2:DisableEbsEncryptionByDefault 拒否)で担保します。EBSスナップショットやAMIのパブリック共有ブロックも宣言的ポリシーで固定できます。

10Control Towerを使うなら、多くは標準装備

自前で全部書く前に。AWS Control Tower を使うと、これらの多くが必須/推奨コントロールとして自動適用されます(管理アカウント除く)。

本記事のガードレールControl Towerでの対応
監査・検知の保護CloudTrail/Config変更禁止は必須コントロール(LZ4.0で組織トレイル化に伴い一部置換)
リージョン制限Region deny コントロール(選択・網羅リストをAWSがメンテ)
root中央root管理(ランディングゾーン機能)+root MFA検知
S3/VPCパブリックブロック必須/強く推奨コントロール
RCP(TLS/境界)RCPベースの configurable managed controls(2024/11〜)
IAMロール保護Control Tower作成ロールの変更禁止(必須)
注意:Landing Zone 4.0 でCloudTrailが組織トレイルへ移行し、旧来のCloudTrail保護系の必須SCPは廃止・置換されました。GuardDuty/Security Hubの保護はCT標準必須には含まれないため、③のSCPや各サービスの委任管理者側で担保します。

11壊さない適用順序

最後に、既存ワークロードを壊さないための順序です。ここが実務のいちばんの肝。

現場のコツ:SCPは"設定"ではなく"事故りやすい変更"です。いきなり Deny * を本番OUに付けない。ポリシーの点検には「貼るだけ診断」ツール(IAM最小権限・リソースポリシー公開診断)も使えます。

12まとめ — 監査保護から、段階的に

最低限は①監査・検知の保護/②root禁止/③離脱防止の3点セット。ここまでは影響が小さく、すぐ入れられます。そのうえで④リージョン制限/⑤危険設定禁止/RCP/宣言的ポリシーを、検証しながら段階的に。Control Towerを使えば多くが標準で入ります。

EMWは、マルチアカウントのガードレール設計・SCP/RCPの棚卸し・段階適用を、既存構成を壊さない形でお手伝いします。仕組みの全体像はAWS Organizationsの仕組みと設計もどうぞ。

13よくある質問(FAQ)

SCPを付けたら権限が増えますか?

増えません。SCP/RCPは上限(ガードレール)で、許可はIAMポリシー側で別途必要です。実効権限は「SCP ∩ RCP ∩ IDポリシー」の論理積になります。

最初にどれを入れるべきですか?

監査・検知の保護(CloudTrail/Config/GuardDuty/Security Hubの停止・削除を禁止するSCP)です。誰の業務も止めず、いざという時の証跡を守れます。次にroot禁止・離脱防止、その後に検証してからリージョン制限・危険設定を段階適用します。

管理アカウントにSCPは効きますか?

効きません。SCPもRCPも管理アカウントのプリンシパル/リソースには適用されないため、管理アカウントにはワークロードを置かず、別途IAM・監視で守ります。

いきなり本番OUに付けても大丈夫ですか?

危険です。特にリージョン制限や広いDenyは既存ワークロードを壊します。Policy Staging OUや別組織で検証し、CloudTrailで対象アクションの実利用を棚卸ししてから、狭いOUへ段階適用してください。FullAWSAccessは絶対に外さないこと。

マルチアカウントのガードレール設計・SCP/RCPの棚卸し・段階適用でお困りなら、既存構成を壊さない形で一緒に整えます。

相談する
← ブログ一覧へ戻る