コンテンツにスキップ

CT.EC2.PV.1

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

コントロールの説明

暗号化されていない EBS ボリュームからのスナップショット作成を禁止します。

なお、Security Hub CSPM には「未暗号化ボリュームからのスナップショット作成」を直接チェックするコントロールは存在しません([EC2.3] はアタッチ済みボリュームの暗号化チェック、[EC2.7] はデフォルト暗号化設定のチェック)。検知ではなく予防で対策するには、本コントロールまたは同等のカスタム SCP が必要です。

検証環境

検証環境の構成図

本記事のコマンドは、--profile 指定がない場合は Workload アカウントで実行する。事前に export AWS_PROFILE=Workload でデフォルトを設定しておくと便利。

検証の流れ

    flowchart LR
    A[1. 事前準備] --> B[2. 未暗号化EBSから<br>スナップショット作成成功]
    B --> C[3. CT.EC2.PV.1<br>有効化]
    C --> D[4. 既存スナップショット<br>維持を確認]
    C --> E[5. 未暗号化EBSから<br>スナップショット作成拒否]
    C --> F[5. 暗号化EBSから<br>スナップショット作成成功]
    D & E & F --> G[6. CloudTrail<br>で確認]
    G --> H[7. CT.EC2.PV.1<br>無効化]
    H --> I[8. 未暗号化EBSから<br>スナップショット作成成功]
  

結果

  • コントロールの有効化前、未暗号化 EBS ボリュームからスナップショットを正常に作成できることを確認できた。
  • コントロールの有効化後、未暗号化 EBS ボリュームからのスナップショット作成が拒否されることを確認できた。
  • 有効化前に作成済みの未暗号化スナップショットについては、有効化後も削除されず維持されることを確認できた。
  • 暗号化済み EBS ボリュームからのスナップショット作成は、有効化後も問題なく実行できることを確認できた。
  • 拒否時、「explicit deny in a service control policy」というメッセージが表示されるため、SCP による制御であることを確認できた。
  • 拒否されたイベントが CloudTrail に記録されること、および管理アカウントの Organization Trail(CloudWatch Logs)からも確認できることを確認できた。
  • コントロールの無効化後、再び未暗号化ボリュームからのスナップショット作成が可能になることを確認できた。

1. 事前準備

EBS のデフォルト暗号化設定がオフであることを確認する。

aws ec2 get-ebs-encryption-by-default
{
    "EbsEncryptionByDefault": false
}

暗号化なしの EBS ボリュームを作成する。

aws ec2 create-volume \
  --availability-zone ap-northeast-1a \
  --size 1 \
  --volume-type gp3 \
  --no-encrypted \
  --tag-specifications 'ResourceType=volume,Tags=[{Key=Name,Value=ct-ec2-pv1-unencrypted}]' \
  --query '{VolumeId:VolumeId,Encrypted:Encrypted,State:State}'
{
    "VolumeId": "<未暗号化ボリューム ID>",
    "Encrypted": false,
    "State": "creating"
}

ボリュームが利用可能になったことを確認する。

aws ec2 describe-volumes \
  --volume-ids <未暗号化ボリューム ID> \
  --query 'Volumes[0].{VolumeId:VolumeId,Encrypted:Encrypted,State:State}'
{
    "VolumeId": "<未暗号化ボリューム ID>",
    "Encrypted": false,
    "State": "available"
}

2. コントロール有効化前の確認

未暗号化 EBS ボリュームからスナップショットを作成する。

aws ec2 create-snapshot \
  --volume-id <未暗号化ボリューム ID> \
  --description "ct-ec2-pv1-test-before" \
  --tag-specifications 'ResourceType=snapshot,Tags=[{Key=Name,Value=ct-ec2-pv1-before}]' \
  --query '{SnapshotId:SnapshotId,VolumeId:VolumeId,Encrypted:Encrypted,State:State}'
{
    "SnapshotId": "<コントロール有効化前スナップショット ID>",
    "VolumeId": "<未暗号化ボリューム ID>",
    "Encrypted": false,
    "State": "pending"
}

スナップショットが完了したことを確認する。

aws ec2 describe-snapshots \
  --snapshot-ids <コントロール有効化前スナップショット ID> \
  --query 'Snapshots[0].{SnapshotId:SnapshotId,VolumeId:VolumeId,Encrypted:Encrypted,State:State}'
{
    "SnapshotId": "<コントロール有効化前スナップショット ID>",
    "VolumeId": "<未暗号化ボリューム ID>",
    "Encrypted": false,
    "State": "completed"
}

ステップ 4 で「有効化後も既存のスナップショットが維持されるか」を確認するため、このスナップショットは削除せずに残しておく。

3. 対象の予防コントロールを有効化(例外設定なし)

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

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

コントロールを有効化する。

aws controltower enable-control \
  --control-identifier arn:aws:controlcatalog:::control/97hes2glndlye96adkdcdeef4 \
  --target-identifier <OU の ARN> \
  --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."
}

4. 有効化後の挙動確認

有効化前に作成済みの未暗号化スナップショットが、有効化後も維持されていることを確認する。

aws ec2 describe-snapshots \
  --snapshot-ids <コントロール有効化前スナップショット ID> \
  --query 'Snapshots[0].{SnapshotId:SnapshotId,VolumeId:VolumeId,Encrypted:Encrypted,State:State}'
{
    "SnapshotId": "<コントロール有効化前スナップショット ID>",
    "VolumeId": "<未暗号化ボリューム ID>",
    "Encrypted": false,
    "State": "completed"
}

5. 新規操作は制限(拒否)されることの確認

コントロール有効化後、未暗号化 EBS ボリュームからスナップショットの作成を試みる。

aws ec2 create-snapshot \
  --volume-id <未暗号化ボリューム ID> \
  --description "ct-ec2-pv1-test-after"

以下のようなエラーが返り、操作が拒否されることを確認する。

An error occurred (UnauthorizedOperation) when calling the CreateSnapshot operation:
You are not authorized to perform this operation.
User: arn:aws:sts::<Workload のアカウント ID>:assumed-role/<ロール名>/<ユーザー名>
is not authorized to perform: ec2:CreateSnapshot on resource:
arn:aws:ec2:ap-northeast-1:<Workload のアカウント ID>:volume/<未暗号化ボリューム ID>
with an explicit deny in a service control policy

なお、暗号化済みの EBS ボリュームからであれば、問題なくスナップショットを作成できることも合わせて確認する。

aws ec2 create-volume \
  --availability-zone ap-northeast-1a \
  --size 1 \
  --volume-type gp3 \
  --encrypted \
  --tag-specifications 'ResourceType=volume,Tags=[{Key=Name,Value=ct-ec2-pv1-encrypted}]' \
  --query '{VolumeId:VolumeId,Encrypted:Encrypted,State:State}'
{
    "VolumeId": "<暗号化ボリューム ID>",
    "Encrypted": true,
    "State": "creating"
}

ボリュームが利用可能になったことを確認する。

aws ec2 describe-volumes \
  --volume-ids <暗号化ボリューム ID> \
  --query 'Volumes[0].{VolumeId:VolumeId,Encrypted:Encrypted,State:State}'
{
    "VolumeId": "<暗号化ボリューム ID>",
    "Encrypted": true,
    "State": "available"
}

暗号化済みボリュームからスナップショットを作成する。

aws ec2 create-snapshot \
  --volume-id <暗号化ボリューム ID> \
  --description "ct-ec2-pv1-encrypted-test" \
  --query '{SnapshotId:SnapshotId,VolumeId:VolumeId,Encrypted:Encrypted,State:State}'
{
    "SnapshotId": "<暗号化スナップショット ID>",
    "VolumeId": "<暗号化ボリューム ID>",
    "Encrypted": true,
    "State": "pending"
}

スナップショットが完了したことを確認する。

aws ec2 describe-snapshots \
  --snapshot-ids <暗号化スナップショット ID> \
  --query 'Snapshots[0].{SnapshotId:SnapshotId,VolumeId:VolumeId,Encrypted:Encrypted,State:State}'
{
    "SnapshotId": "<暗号化スナップショット ID>",
    "VolumeId": "<暗号化ボリューム ID>",
    "Encrypted": true,
    "State": "completed"
}

6. CloudTrail での確認

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

Workload アカウントの CloudTrail イベント履歴から確認する。

aws cloudtrail lookup-events \
  --lookup-attributes AttributeKey=EventName,AttributeValue=CreateSnapshot \
  --start-time <検索開始時刻> \
  --end-time <検索終了時刻> \
  --query 'Events[].CloudTrailEvent' \
  --output text | jq 'select(.errorCode != null) | {eventName, errorCode, errorMessage}'
{
  "eventName": "CreateSnapshot",
  "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:CreateSnapshot on resource: arn:aws:ec2:ap-northeast-1:<Workload のアカウント ID>:volume/<未暗号化ボリューム ID> with an explicit deny in a service control policy: arn:aws:organizations::<管理アカウント ID>:policy/<組織 ID>/service_control_policy/<ポリシー ID>. Encoded authorization failure message: ..."
}

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

管理アカウントの Organization Trail(CloudWatch Logs)からも同じイベントを確認できる。将来的に CloudWatch Logs のサブスクリプションフィルタで SCP 拒否イベントを監視する際に活用できる。

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
    | filter eventName = "CreateSnapshot" and errorCode like /UnauthorizedOperation|AccessDenied/
    | sort @timestamp asc' \
  --profile Master
{
    "queryId": "<クエリ ID>"
}

上記で返された queryId を指定して結果を取得する。

aws logs get-query-results --query-id <クエリ ID> \
  --query '{results:results,status:status}' \
  --profile Master
{
    "results": [
        [
            {"field": "@timestamp", "value": "2026-03-14 12:22:11.727"},
            {"field": "eventName", "value": "CreateSnapshot"},
            {"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:CreateSnapshot on resource: arn:aws:ec2:ap-northeast-1:<Workload のアカウント ID>:volume/<未暗号化ボリューム ID> with an explicit deny in a service control policy: arn:aws:organizations::<管理アカウント ID>:policy/<組織 ID>/service_control_policy/<ポリシー ID>. Encoded authorization failure message: ..."},
            {"field": "@ptr", "value": "..."}
        ]
    ],
    "status": "Complete"
}

管理アカウントの CloudWatch Logs にも同じ拒否イベントが記録されていることを確認できた。

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

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

aws controltower disable-control \
  --control-identifier arn:aws:controlcatalog:::control/97hes2glndlye96adkdcdeef4 \
  --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. 制限解除の確認

コントロール無効化後、再び未暗号化 EBS ボリュームからスナップショットの作成を試みる。

aws ec2 create-snapshot \
  --volume-id <未暗号化ボリューム ID> \
  --description "ct-ec2-pv1-test-after-disable" \
  --query '{SnapshotId:SnapshotId,VolumeId:VolumeId,Encrypted:Encrypted,State:State}'

スナップショットが正常に作成され、制限が解除されたことを確認する。

{
    "SnapshotId": "<コントロール無効化後スナップショット ID>",
    "VolumeId": "<未暗号化ボリューム ID>",
    "Encrypted": false,
    "State": "pending"
}

スナップショットが完了したことを確認する。

aws ec2 describe-snapshots \
  --snapshot-ids <コントロール無効化後スナップショット ID> \
  --query 'Snapshots[0].{SnapshotId:SnapshotId,VolumeId:VolumeId,Encrypted:Encrypted,State:State}'
{
    "SnapshotId": "<コントロール無効化後スナップショット ID>",
    "VolumeId": "<未暗号化ボリューム ID>",
    "Encrypted": false,
    "State": "completed"
}

9. クリーンアップ

検証で作成したリソースをすべて削除する。

# スナップショットを削除
aws ec2 delete-snapshot --snapshot-id <コントロール有効化前スナップショット ID>
aws ec2 delete-snapshot --snapshot-id <暗号化スナップショット ID>
aws ec2 delete-snapshot --snapshot-id <コントロール無効化後スナップショット ID>

# EBS ボリュームを削除
aws ec2 delete-volume --volume-id <未暗号化ボリューム ID>
aws ec2 delete-volume --volume-id <暗号化ボリューム ID>

Amazonアソシエイトリンク