CT.MULTISERVICE.PV.1
コントロールの説明
OU 単位で許可リージョンを指定し、それ以外のリージョンでの AWS API 操作を拒否します。
本コントロールは SCP により、AllowedRegions パラメータで指定したリージョン以外への API コールをブロックします。ただし、SCP テンプレートの NotAction で例外として定義されているサービス・アクションは、許可リージョン外でも操作可能です。例外には IAM、STS、CloudFront、Route 53、AWS Organizations、AWS Config、S3 の一部アクション(GetBucketLocation、ListAllMyBuckets 等)など多数のグローバルサービスが含まれます。完全な一覧は 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 に含めなければ拒否されます。
検証の流れ
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": []
}コントロールを有効化する。--parameters で AllowedRegions に ap-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-operation が SUCCEEDED を返した後も、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"
}errorMessage に explicit 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 リージョンすべてでアクセスが復旧した。