Security OU に対して有効にできないコントロール(CT.MULTISERVICE.PV.1)があったので、有効にできない理由を考えてみた

Security OU に対して有効にできないコントロール(CT.MULTISERVICE.PV.1)があったので、有効にできない理由を考えてみた

Security OU に対して有効にできないコントロールって他にもあるのでしょうか?
Clock Icon2025.04.28

カスタマーサクセス部 運用支援チームのいたくらです。

AWS Control Tower(以降 CT と記載)を利用している場合に、Security OU に対して有効にできないコントロールを発見したので、ブログにまとめてみました。

検証環境について

現在、以下のような Organizations 構成で CT を有効化しています。
Security OU とは、Control Tower のランディングゾーン設定時に「基礎となる OU」として作成されたもので、この OU には Audit アカウントと LogArchive アカウントが含まれています。
8.png

どのコントロールが有効にできなかったのか?

結論から言いますと、[CT.MULTISERVICE.PV.1] 組織単位のリクエストされた AWS リージョンに基づいて AWS へのアクセスを拒否する です。

実際にやってみて、有効にできなかったキャプチャを少しご紹介します。
まず、[CT.MULTISERVICE.PV.1] の「コントロールアクション」から「有効にする」をクリックします。
1-1-1.png

SecurityOU の選択、リージョンアクセスの指定、サービスアクションの追加、除外されるプリンシパルとタグの指定をします。
2-3.png
3.png
4.png
5.png

設定内容を確認し、最後に「コントロールを有効にする」をクリックします。
6-1.png

すると、以下のエラー文が表示されて、コントロールを有効にできませんでした。
「AWS Control Tower は、Security OU 上で選択的コントロール CT.MULTISERVICE.PV.1 を有効にできません。」と表示されています。
7-1.png

有効にできない理由を考えた

AWS Control Tower の公式ドキュメント(What Is AWS Control Tower? - AWS Control Tower)を確認しましたが、この挙動に関する記載は読み取れませんでした。

実際の挙動から、
「ユーザー側で Security OU に対して [CT.MULTISERVICE.PV.1] を有効にできる場合、OU のコントロールから除外される IAM プリンシパルを指定できてしまう(= AWSControlTowerExecution ロールに許可されているアクションを特定の IAM プリンシパルにも付与できる)ため、これを阻止するために有効にできない」
というのが理由かな、と個人的には考えています。

なぜそう考えたのか

Security OU ではなく、Sandbox OU に対して [CT.MULTISERVICE.PV.1] を有効にしたところ、以下の JSON ドキュメントが SCP に追加されました。
※ 有効にする際に、除外されるプリンシパルとして「IAM ユーザー:test-user」を追加しています

追加された JSON ドキュメント内容
    {
      "Condition": {
        "StringNotEquals": {
          "aws:RequestedRegion": [
            "ap-northeast-1",
            "us-east-1"
          ]
        },
        "ArnNotLike": {
          "aws:PrincipalARN": [
            "arn:aws:iam::<管理アカウントのアカウントID>:user/test-user",
            "arn:*:iam::*:role/AWSControlTowerExecution",
            "arn:*:iam::*:role/aws-controltower-ConfigRecorderRole",
            "arn:*:iam::*:role/aws-controltower-ForwardSnsNotificationRole",
            "arn:*:iam::*:role/AWSControlTower_VPCFlowLogsRole"
          ]
        }
      },
      "Resource": "*",
      "Effect": "Deny",
      "NotAction": [
        "a4b:*",
        "access-analyzer:*",
        "account:*",
        "acm:*",
        "activate:*",
        "artifact:*",
        "aws-marketplace-management:*",
        "aws-marketplace:*",
        "aws-portal:*",
        "billing:*",
        "billingconductor:*",
        "budgets:*",
        "ce:*",
        "chatbot:*",
        "chime:*",
        "cloudfront:*",
        "cloudtrail:LookupEvents",
        "compute-optimizer:*",
        "config:*",
        "consoleapp:*",
        "consolidatedbilling:*",
        "cur:*",
        "datapipeline:GetAccountLimits",
        "devicefarm:*",
        "directconnect:*",
        "ec2:DescribeRegions",
        "ec2:DescribeTransitGateways",
        "ec2:DescribeVpnGateways",
        "ecr-public:*",
        "fms:*",
        "freetier:*",
        "globalaccelerator:*",
        "health:*",
        "iam:*",
        "importexport:*",
        "invoicing:*",
        "iq:*",
        "kms:*",
        "license-manager:ListReceivedLicenses",
        "lightsail:Get*",
        "mobileanalytics:*",
        "networkmanager:*",
        "notifications-contacts:*",
        "notifications:*",
        "organizations:*",
        "payments:*",
        "pricing:*",
        "quicksight:DescribeAccountSubscription",
        "resource-explorer-2:*",
        "route53-recovery-cluster:*",
        "route53-recovery-control-config:*",
        "route53-recovery-readiness:*",
        "route53:*",
        "route53domains:*",
        "s3:CreateMultiRegionAccessPoint",
        "s3:DeleteMultiRegionAccessPoint",
        "s3:DescribeMultiRegionAccessPointOperation",
        "s3:GetAccountPublicAccessBlock",
        "s3:GetBucketLocation",
        "s3:GetBucketPolicyStatus",
        "s3:GetBucketPublicAccessBlock",
        "s3:GetMultiRegionAccessPoint",
        "s3:GetMultiRegionAccessPointPolicy",
        "s3:GetMultiRegionAccessPointPolicyStatus",
        "s3:GetStorageLensConfiguration",
        "s3:GetStorageLensDashboard",
        "s3:ListAllMyBuckets",
        "s3:ListMultiRegionAccessPoints",
        "s3:ListStorageLensConfigurations",
        "s3:PutAccountPublicAccessBlock",
        "s3:PutMultiRegionAccessPointPolicy",
        "savingsplans:*",
        "shield:*",
        "sso:*",
        "sts:*",
        "support:*",
        "supportapp:*",
        "supportplans:*",
        "sustainability:*",
        "tag:GetResources",
        "tax:*",
        "trustedadvisor:*",
        "vendor-insights:ListEntitledSecurityProfiles",
        "waf-regional:*",
        "waf:*",
        "wafv2:*"
      ],
      "Sid": "CTMULTISERVICEPV1"
    }

この SCP で実現できる制御は以下です。

  • リージョン制限
    • ap-northeast-1(東京リージョン)と us-east-1(バージニア北部リージョン)以外のリージョンでの AWS サービスの使用を制限する
  • 例外ユーザー/ロール
    • test-user(管理アカウント上に存在する IAM ユーザー)
    • Control Tower 関連の各種 IAM ロール
      • AWSControlTowerExecution
      • aws-controltower-ConfigRecorderRole
      • aws-controltower-ForwardSnsNotificationRole
      • AWSControlTower_VPCFlowLogsRole
  • 許可されるサービス/アクション
    • IAM に関連するアクション
    • グローバルサービス(Route 53, CloudFront 等)
    • 請求関連のサービス(AWS Billing, Cost Explorer 等)
    • セキュリティ関連サービス(WAF, Shield 等)
    • 組織管理関連(AWS Organizations 等)
    • その他、アカウント管理や監視に必要な基本的なサービス

つまり、test-user は AWSControlTowerExecution と同じアクションを許可されています。
(AWSControlTowerExecution って何?と思った方はこちらの公式ドキュメントに説明があるのでご一読ください)

ということは、test-user に対して以下が許可されていることになります。許可されすぎですね。

  • NotAction で指定されていないアクションを実行可能
  • NotAction で指定されているアクションも実行可能
  • すべてのリージョンでアクションを実行可能

となると、Security OU に対してこれが許可されてしまうと、ユーザーが指定した特定 IAM プリンシパルで、Audit アカウントや LogArchive アカウント上でやりたい放題できてしまうことになりそうです。

以上の調査より、有効に出来ない理由は「ユーザー側で Security OU に対して [CT.MULTISERVICE.PV.1] を有効にできる場合、OU のコントロールから除外される IAM プリンシパルを指定できてしまう(= AWSControlTowerExecution ロールに許可されているアクションを特定の IAM プリンシパルにも付与できる)ため、これを阻止するために有効にできない」と予想しています。

おまけ

CloudTrail を確認したところ、当該イベント(EnableControl)について「エラーコード:ValidationException」となっていました。
参考:EnableControl - AWS Control Tower
9.png

このエラーは「不適切な値が入力され、AWS 側で指定された制約を満たしていないために発生するエラー」なので、[CT.MULTISERVICE.PV.1] については「Security OU」の指定ができないように制限されているのではないかな、と予想しています。

あとがき

Security OU に対して有効にできないコントロール : [CT.MULTISERVICE.PV.1] についてのご紹介でした。
Security OU に対してリージョン拒否設定を適用したい場合は、ランディングゾーン設定によるリージョン拒否設定を使用した方が良さそうです。
(ランディングゾーン設定によるリージョン拒否設定は特定 OU ではなく、ランディングゾーン全体に適用されるので注意が必要です)

この記事がどなたかのお役に立てれば幸いです。

アノテーション株式会社について

アノテーション株式会社はクラスメソッドグループのオペレーション専門特化企業です。
サポート・運用・開発保守・情シス・バックオフィスの専門チームが、最新 IT テクノロジー、高い技術力、蓄積されたノウハウをフル活用し、お客様の課題解決を行っています。
当社は様々な職種でメンバーを募集しています。
「オペレーション・エクセレンス」と「らしく働く、らしく生きる」を共に実現するカルチャー・しくみ・働き方にご興味がある方は、アノテーション株式会社 採用サイトをぜひご覧ください。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.