コンテンツにスキップ

CT.MULTISERVICE.PV.1

検証日: 2026-03-22 / リージョン: ap-northeast-1

コントロールの説明

OU 単位で許可リージョンを指定し、それ以外のリージョンでの AWS API 操作を拒否します。

本コントロールは SCP により、AllowedRegions パラメータで指定したリージョン以外への API コールをブロックします。ただし、SCP テンプレートの NotAction で例外として定義されているサービス・アクションは、許可リージョン外でも操作可能です。例外には IAM、STS、CloudFront、Route 53、AWS Organizations、AWS Config、S3 の一部アクション(GetBucketLocationListAllMyBuckets 等)など多数のグローバルサービスが含まれます。完全な一覧は AWS 公式ドキュメントの SCP テンプレートを参照してください。本記事では IAM と STS の 2 つについて実機で動作を確認しています。

パラメータは以下の 3 つです。

  • AllowedRegions(必須): 操作を許可するリージョンのリスト
  • ExemptedPrincipalARNs(任意): リージョン拒否の対象外にする IAM プリンシパル。上記の NotAction 例外はサービス単位の例外ですが、こちらは特定のロール等が行うすべての操作(NotAction に含まれないサービスも含む)をリージョン拒否から除外します
  • ExemptedActions(任意): リージョン拒否の対象外にする API アクション

AWS Control Tower にはリージョン拒否コントロールが 2 種類あります。1 つは Landing Zone 全体に一律適用されるもの(GRREGIONDENY、Landing Zone 設定画面から有効化)で、もう 1 つが本コントロール(CT.MULTISERVICE.PV.1)です。本コントロールは OU ごとに異なる許可リージョンを設定できます。また、AllowedRegions には Landing Zone のガバナンスリージョン以外も指定可能です。逆に、ガバナンスリージョンであっても AllowedRegions に含めなければ拒否されます。

本コントロール(リージョン拒否)に直接対応する Security Hub CSPM コントロールは確認できませんでした。

検証の流れ

    flowchart LR
    A[1. 事前確認<br>3 リージョンで<br>describe-vpcs] --> B[2. CT.MULTISERVICE.PV.1<br>有効化]
    B --> C[3. 拒否確認<br>3 リージョンで<br>describe-vpcs]
    B --> D[4. グローバルサービス<br>例外確認]
    C & D --> E[5. CloudTrail<br>で確認]
    E --> F[6. CloudWatch Logs<br>で確認]
    F --> G[7. CT.MULTISERVICE.PV.1<br>無効化]
    G --> H[8. 復旧確認<br>3 リージョンで<br>describe-vpcs]
  

結果

  • コントロールの有効化前、Workload アカウントから ap-northeast-1、ap-southeast-1、us-east-1 の 3 リージョンすべてで describe-vpcs が成功することを確認できた。
  • コントロールの有効化後(AllowedRegions: ["ap-northeast-1"])、ap-northeast-1 のみ成功し、ap-southeast-1 と us-east-1 は explicit deny in a service control policy で拒否されることを確認できた。ap-southeast-1 は Landing Zone のガバナンスリージョンだが、AllowedRegions に含めなければ拒否される。
  • グローバルサービス(IAM、STS)は許可リージョン外(us-east-1)でも正常に動作することを確認できた。
  • 拒否されたイベントが CloudTrail に記録されること、および管理アカウントの Organization Trail(CloudWatch Logs)からも確認できることを確認できた。
  • コントロールの無効化後、3 リージョンすべてで再び describe-vpcs が成功することを確認できた。

1. 事前確認

Workload アカウントから 3 つのリージョンで describe-vpcs を実行し、すべてアクセス可能であることを確認する。

ap-northeast-1(許可リージョンに指定予定):

aws ec2 describe-vpcs \
  --region ap-northeast-1 \
  --query "Vpcs[].VpcId"
[
    "<VPC ID>"
]

ap-southeast-1(Landing Zone のガバナンスリージョンだが、AllowedRegions に含めない):

aws ec2 describe-vpcs \
  --region ap-southeast-1 \
  --query "Vpcs[].VpcId"
[
    "<VPC ID>"
]

us-east-1:

aws ec2 describe-vpcs \
  --region us-east-1 \
  --query "Vpcs[].VpcId"
[
    "<VPC ID>"
]

3 リージョンすべてでアクセスできることを確認した。

2. 対象の予防コントロールを有効化

Control Tower の管理アカウントで、対象の OU にコントロールが有効になっていないことを確認する。

aws controltower list-enabled-controls \
  --target-identifier <OU の ARN> \
  --profile Master
{
    "enabledControls": []
}

コントロールを有効化する。--parametersAllowedRegionsap-northeast-1 のみを指定する。

aws controltower enable-control \
  --control-identifier arn:aws:controlcatalog:::control/ka8e3pkqefnjsxuyc26ji580 \
  --target-identifier <OU の ARN> \
  --parameters '[{"key":"AllowedRegions","value":["ap-northeast-1"]}]' \
  --profile Master
{
    "arn": "arn:aws:controltower:ap-northeast-1:<管理アカウント ID>:enabledcontrol/<enabledcontrol ID>",
    "operationIdentifier": "<オペレーション ID>"
}

有効化が完了するまで待機する。

aws controltower get-control-operation \
  --operation-identifier <オペレーション ID> \
  --query 'controlOperation.{operationType:operationType,status:status,statusMessage:statusMessage}' \
  --profile Master
{
    "operationType": "ENABLE_CONTROL",
    "status": "SUCCEEDED",
    "statusMessage": "Operation was successful."
}
get-control-operationSUCCEEDED を返した後も、SCP の実際の適用には数分のラグがある場合があります。ステップ 3 で拒否されない場合は、数分待ってから再試行してください。

3. 拒否確認

ステップ 1 と同じ 3 リージョンで describe-vpcs を実行し、許可リージョン以外が拒否されることを確認する。

ap-northeast-1(AllowedRegions に含まれる):

aws ec2 describe-vpcs \
  --region ap-northeast-1 \
  --query "Vpcs[].VpcId"
[
    "<VPC ID>"
]

ap-southeast-1(Landing Zone のガバナンスリージョンだが AllowedRegions に含めていない):

aws ec2 describe-vpcs \
  --region ap-southeast-1 \
  --query "Vpcs[].VpcId"
An error occurred (UnauthorizedOperation) when calling the DescribeVpcs operation:
You are not authorized to perform this operation.
User: arn:aws:sts::<Workload のアカウント ID>:assumed-role/<ロール名>/<セッション名>
is not authorized to perform: ec2:DescribeVpcs
with an explicit deny in a service control policy:
arn:aws:organizations::<管理アカウント ID>:policy/<組織 ID>/service_control_policy/<ポリシー ID>

us-east-1:

aws ec2 describe-vpcs \
  --region us-east-1 \
  --query "Vpcs[].VpcId"
An error occurred (UnauthorizedOperation) when calling the DescribeVpcs operation:
You are not authorized to perform this operation.
User: arn:aws:sts::<Workload のアカウント ID>:assumed-role/<ロール名>/<セッション名>
is not authorized to perform: ec2:DescribeVpcs
with an explicit deny in a service control policy:
arn:aws:organizations::<管理アカウント ID>:policy/<組織 ID>/service_control_policy/<ポリシー ID>

ap-northeast-1 のみ成功し、ap-southeast-1 と us-east-1 は拒否された。ガバナンスリージョンであっても AllowedRegions に含めなければ拒否される。

4. グローバルサービスの例外確認

SCP テンプレートの NotAction で例外として定義されているグローバルサービスが、許可リージョン外でも動作することを確認する。

IAM(us-east-1 で実行):

aws iam list-roles \
  --region us-east-1 \
  --query "Roles[0].RoleName" \
  --output text
<ロール名>

STS(us-east-1 で実行):

aws sts get-caller-identity \
  --region us-east-1
{
    "UserId": "<ユーザー ID>",
    "Account": "<Workload のアカウント ID>",
    "Arn": "arn:aws:sts::<Workload のアカウント ID>:assumed-role/<ロール名>/<セッション名>"
}

IAM と STS は許可リージョン外でも正常に動作した。

5. CloudTrail での確認

拒否されたイベントが CloudTrail に記録されていることを確認する。

aws cloudtrail lookup-events \
  --lookup-attributes AttributeKey=EventName,AttributeValue=DescribeVpcs \
  --start-time <検索開始時刻> \
  --end-time <検索終了時刻> \
  --region us-east-1 \
  --query 'Events[].CloudTrailEvent' \
  --output text | jq 'select(.errorCode != null) | {eventName, errorCode, errorMessage, awsRegion}'
{
  "eventName": "DescribeVpcs",
  "errorCode": "Client.UnauthorizedOperation",
  "errorMessage": "You are not authorized to perform this operation. User: arn:aws:sts::<Workload のアカウント ID>:assumed-role/<ロール名>/<セッション名> is not authorized to perform: ec2:DescribeVpcs with an explicit deny in a service control policy: arn:aws:organizations::<管理アカウント ID>:policy/<組織 ID>/service_control_policy/<ポリシー ID>",
  "awsRegion": "us-east-1"
}

errorMessageexplicit deny in a service control policy と記録されており、SCP による拒否であることがわかる。

6. CloudWatch Logs での確認

管理アカウントの Organization Trail(CloudWatch Logs)からも同じイベントを確認する。

aws logs start-query \
  --log-group-name "aws-controltower/CloudTrailLogs" \
  --start-time $(date -d '<検索開始時刻>' +%s) \
  --end-time $(date -d '<検索終了時刻>' +%s) \
  --query-string 'fields @timestamp, eventName, errorCode, errorMessage, awsRegion
    | filter eventName = "DescribeVpcs" and errorCode = "Client.UnauthorizedOperation"
    | sort @timestamp asc' \
  --profile Master
{
    "queryId": "<クエリ ID>"
}
aws logs get-query-results \
  --query-id <クエリ ID> \
  --query '{results:results,status:status}' \
  --profile Master
{
    "results": [
        [
            {"field": "@timestamp", "value": "<タイムスタンプ>"},
            {"field": "eventName", "value": "DescribeVpcs"},
            {"field": "errorCode", "value": "Client.UnauthorizedOperation"},
            {"field": "errorMessage", "value": "You are not authorized to perform this operation. User: arn:aws:sts::<Workload のアカウント ID>:assumed-role/<ロール名>/<セッション名> is not authorized to perform: ec2:DescribeVpcs with an explicit deny in a service control policy: arn:aws:organizations::<管理アカウント ID>:policy/<組織 ID>/service_control_policy/<ポリシー ID>"},
            {"field": "awsRegion", "value": "ap-southeast-1"},
            {"field": "@ptr", "value": "<ログポインタ>"}
        ],
        [
            {"field": "@timestamp", "value": "<タイムスタンプ>"},
            {"field": "eventName", "value": "DescribeVpcs"},
            {"field": "errorCode", "value": "Client.UnauthorizedOperation"},
            {"field": "errorMessage", "value": "You are not authorized to perform this operation. User: arn:aws:sts::<Workload のアカウント ID>:assumed-role/<ロール名>/<セッション名> is not authorized to perform: ec2:DescribeVpcs with an explicit deny in a service control policy: arn:aws:organizations::<管理アカウント ID>:policy/<組織 ID>/service_control_policy/<ポリシー ID>"},
            {"field": "awsRegion", "value": "us-east-1"},
            {"field": "@ptr", "value": "<ログポインタ>"}
        ]
    ],
    "status": "Complete"
}

ap-southeast-1 と us-east-1 の 2 件の拒否イベントが記録されていることを確認できた。

7. 対象の予防コントロールを無効化

検証完了後、コントロールを無効化する。

aws controltower disable-control \
  --control-identifier arn:aws:controlcatalog:::control/ka8e3pkqefnjsxuyc26ji580 \
  --target-identifier <OU の ARN> \
  --profile Master
{
    "operationIdentifier": "<オペレーション ID>"
}
aws controltower get-control-operation \
  --operation-identifier <オペレーション ID> \
  --query 'controlOperation.{operationType:operationType,status:status,statusMessage:statusMessage}' \
  --profile Master
{
    "operationType": "DISABLE_CONTROL",
    "status": "SUCCEEDED",
    "statusMessage": "Operation was successful."
}

8. 制限解除の確認

コントロール無効化後、ステップ 1 と同じ 3 リージョンで describe-vpcs を実行し、すべてアクセス可能に戻ったことを確認する。

ap-northeast-1:

aws ec2 describe-vpcs \
  --region ap-northeast-1 \
  --query "Vpcs[].VpcId"
[
    "<VPC ID>"
]

ap-southeast-1:

aws ec2 describe-vpcs \
  --region ap-southeast-1 \
  --query "Vpcs[].VpcId"
[
    "<VPC ID>"
]

us-east-1:

aws ec2 describe-vpcs \
  --region us-east-1 \
  --query "Vpcs[].VpcId"
[
    "<VPC ID>"
]

3 リージョンすべてでアクセスが復旧した。

Amazonアソシエイトリンク