SJ blog
security
A

信頼度ランク

S 公式ソース確認済み
A 成功実績多数・失敗例少数
B 賛否両論
C 動作未確認・セキュリティリスク高
Z 個人所感

AWS Organizations SCPの仕組みと設計 — OU階層・デフォルト動作・落とし穴

Service Control Policiesの評価ロジック、OU階層での継承、管理アカウントへの非適用、よく使うSCP設計パターン(リージョン制限・ルートアクション禁止・S3保護)を解説。

一言結論

SCPは管理アカウントには適用されずIAMポリシーにAllow権限を付与することもないため、アカウント全体のガードレールとして機能させるにはDenyベースのパターンを理解し管理アカウント自体の利用を最小限にする設計が前提となる。

SCPとは何か

Service Control Policies(SCP)はAWS Organizationsの機能で、メンバーアカウント内のIAMエンティティが使える最大権限を制限するポリシーだ。SCPはアカウント全体のガードレール(guardrail)として機能する。

SCPで覚えるべき最重要事項:

  • 管理アカウント(Management Account)にはSCPが適用されない
  • SCPはAllowを付与しない(最大権限を絞るだけ)
  • IAMポリシーでAllowされていてもSCPでDenyなら使えない

デフォルトSCP「FullAWSAccess」

Organizations有効化時、全OUとアカウントに FullAWSAccess というSCPがデフォルトで適用される。これはすべてのアクションを許可するSCPだ。

// FullAWSAccess(デフォルト)
{
  "Statement": [{
    "Effect": "Allow",
    "Action": "*",
    "Resource": "*"
  }]
}

このデフォルトSCPを削除すると、そのOU/アカウントへの全アクセスが遮断される(暗黙的Deny)。意図しない全アクセス禁止になるため慎重に扱う。

OU階層での継承

Root
├── FullAWSAccess (SCP)
├── OU: Production
│   ├── DenyDeleteS3 (SCP)    ← ここで追加
│   ├── Account: Prod-App     ← DenyDeleteS3が有効
│   └── Account: Prod-DB      ← DenyDeleteS3が有効
└── OU: Development
    └── Account: Dev           ← DenyDeleteS3は無効

SCPはOU階層で継承される。親OUのSCPは子OUとその配下アカウントすべてに適用される。

よく使うSCPパターン

パターン1: リージョン制限

{
  "Statement": [{
    "Sid": "DenyNonApRegions",
    "Effect": "Deny",
    "NotAction": [
      "iam:*",
      "organizations:*",
      "route53:*",
      "budgets:*",
      "waf:*",
      "cloudfront:*",
      "sts:GetCallerIdentity",
      "support:*",
      "trustedadvisor:*"
    ],
    "Resource": "*",
    "Condition": {
      "StringNotEquals": {
        "aws:RequestedRegion": [
          "ap-northeast-1",
          "ap-northeast-3"
        ]
      }
    }
  }]
}

NotAction を使いグローバルサービス(IAM, CloudFront等)はリージョン制限から除外する。

パターン2: S3パブリックアクセスブロック必須

{
  "Statement": [{
    "Sid": "DenyPublicS3",
    "Effect": "Deny",
    "Action": [
      "s3:PutBucketPublicAccessBlock",
      "s3:DeletePublicAccessBlock"
    ],
    "Resource": "*",
    "Condition": {
      "StringNotEquals": {
        "s3:PublicAccessBlockConfiguration/BlockPublicAcls": "true"
      }
    }
  }]
}

パターン3: 重要リソースの保護

{
  "Statement": [
    {
      "Sid": "ProtectCloudTrail",
      "Effect": "Deny",
      "Action": [
        "cloudtrail:StopLogging",
        "cloudtrail:DeleteTrail",
        "cloudtrail:UpdateTrail"
      ],
      "Resource": "*"
    },
    {
      "Sid": "ProtectGuardDuty",
      "Effect": "Deny",
      "Action": [
        "guardduty:DeleteDetector",
        "guardduty:DisassociateFromMasterAccount"
      ],
      "Resource": "*"
    },
    {
      "Sid": "ProtectSecurityHub",
      "Effect": "Deny",
      "Action": "securityhub:DisableSecurityHub",
      "Resource": "*"
    }
  ]
}

パターン4: rootユーザーのアクション制限

{
  "Statement": [{
    "Sid": "DenyRootActions",
    "Effect": "Deny",
    "Action": "*",
    "Resource": "*",
    "Condition": {
      "StringLike": {
        "aws:PrincipalArn": "arn:aws:iam::*:root"
      }
    }
  }]
}

SCP適用の確認

# アカウントに適用されているSCPの一覧
aws organizations list-policies-for-target \
  --target-id 123456789012 \
  --filter SERVICE_CONTROL_POLICY

# 特定SCPの詳細
aws organizations describe-policy \
  --policy-id p-xxxxxxxxxxxx

SCPとIAMポリシーの関係整理

有効な権限 = SCP(Allow) ∩ IAMポリシー(Allow) - Deny(どちらか)

ケース1: SCP Allow + IAM Allow → アクセス可
ケース2: SCP Deny  + IAM Allow → アクセス不可
ケース3: SCP Allow + IAM なし  → アクセス不可(IAMは付与必要)
ケース4: SCP なし(Deny扱い)  → アクセス不可

管理アカウントの扱いに注意

管理アカウントはSCPが適用されない。このため:

  • 管理アカウントでは制限のかからない操作が実行可能
  • 管理アカウントには業務リソースを置かないことがベストプラクティス
  • 管理アカウントは組織管理専用にする

まとめ

SCPはOrganizations全体のセキュリティ基盤だ。リージョン制限・セキュリティサービス保護・ルートユーザー制限を標準SCPとして全OUに適用することが推奨される。管理アカウントへの非適用という制限を把握した上で、管理アカウント自体を最小利用することが重要だ。