ForgeVision Engineer Blog

フォージビジョン エンジニア ブログ

EC2.182 Amazon EBS Snapshots should not be publicly accessible の対処方法

EBS ボリューム

AWS グループの尾谷です。
フォージビジョン・AWS 内製化支援サービスのマネージャをしております。

Security Hub CSPM で以下コントロールが追加されて、お客様の環境にて大量検出したため、対処方法をまとめました。

このブログで学べること

  • Security Hub CSPM とは?
  • なぜ EBS スナップショットのパブリックアクセスが問題なのか?
  • 効率的な是正方法

本ブログの最後に、AWS Organizations の宣言型ポリシーを用いて、OU 配下の複数アカウントに一括適用する効率的な対処方法もまとめております。   適用を検討ください。

Security Hub CSPM とは?

Security Hub CSPM は、AWS Security Hub に備わっている CSPM(Cloud Security Posture Management)機能です。
AWS 環境が セキュリティのベストプラクティスやコンプライアンス基準に準拠しているかを自動で評価します。
問題があれば コントロール(例:EC2.182)として検出・可視化し、改善対応につなげることができます。

新しく追加されたコントロール

本ブログ記事で取り扱うコントロール「EC2.182」は、2025/12/08 に追加された新しいコントロールです。

2025/12/24 現時点で、日本語版の Security Hub ユーザーガイド のコントロール一覧に、EC2.182 が掲載されていません。
そのため、英語ドキュメント を参照する必要があります。

以下、英語ドキュメントを抜粋し日本語化しました。


[EC2.182] Amazon EBSスナップショットは公開アクセス不可

カテゴリ: 保護 > 安全なネットワーク構成 > 公開されていないリソース
重大度:
リソースタイプ: AWS::EC2::SnapshotBlockPublicAccess
AWS Config ルール: ebs-snapshot-block-public-access
スケジュールの種類: 変更がトリガーされました
パラメータ: なし

このコントロールは、Amazon EBS スナップショットのすべての共有をブロックするために「パブリックアクセスのブロック」が有効になっているかどうかを確認します。すべての Amazon EBS スナップショットのすべての共有をブロックするために「パブリックアクセスのブロック」が有効になっていない場合、このコントロールは失敗します。

Amazon EBS スナップショットの公開共有を防ぐには、スナップショットへのパブリックアクセスをブロックする機能を有効にできます。リージョンでスナップショットへのパブリックアクセスをブロックする機能を有効にすると、そのリージョン内でスナップショットを公開しようとする試みはすべて自動的にブロックされます。これにより、スナップショットのセキュリティが向上し、スナップショットデータが不正アクセスや意図しないアクセスから保護されます。

修復 スナップショットへのパブリックアクセスのブロックを有効にするには、 Amazon EBS ユーザーガイドの「Amazon EBS スナップショットへのパブリックアクセスのブロック設定」を参照してください。「パブリックアクセスをブロック」では、「すべてのパブリックアクセスをブロック」を選択します。


AWS マネジメントコンソールで確認

「まずは目視確認!」
ということで、コントロールの検証に失敗しているアカウントの一つにサインインして、EC2 管理画面で確認してみました。

EC2 管理画面 -> [設定] -> [データ保護とセキュリティ] タブ と画面遷移すると、[EBS スナップショットのパブリックアクセスをブロック] が パブリックアクセス: ブロックされていませんになっていました。

EBS スナップショットのパブリックアクセスをブロック

EBS スナップショットのパブリックアクセスをブロックする機能は 2023 年に追加された機能で、すべてのスナップショットを一括でブロックする機能と、現在共有されているスナップショットには影響を与えずに、今後の共有をブロックする機能の二つのオプションを有します。

aws.amazon.com

[管理] ボタンをクリックして、パブリックアクセスをブロックのチェックボックスにチェックを入れると二つのオプションが表示されます。

新しい公開共有をブロックのオプションボタンをクリックすると、公開されているスナップショットの有無を教えてくれるのは親切です。

複数リージョンで一括してブロックしたい

EC2 はリージョナルサービスであり、本機能もリージョンごとに設定する必要があります。
マネジメントコンソールで一つ一つ開いて確認するのは効率的ではありません。

そこで、AWS CLI を用いて、全リージョンに適用してみました。
個人の検証環境にてコマンドを投入すると、17 リージョンが返りました。

~ $ aws ec2 describe-regions --query 'Regions[].RegionName' --output table
--------------------
|  DescribeRegions |
+------------------+
|  ap-south-1      |
|  eu-north-1      |
|  eu-west-3       |
|  eu-west-2       |
|  eu-west-1       |
|  ap-northeast-3  |
|  ap-northeast-2  |
|  ap-northeast-1  |
|  ca-central-1    |
|  sa-east-1       |
|  ap-southeast-1  |
|  ap-southeast-2  |
|  eu-central-1    |
|  us-east-1       |
|  us-east-2       |
|  us-west-1       |
|  us-west-2       |
+------------------+
~ $ 

これを応用して、すべてのリージョンに適用するスクリプトを作りました!   (KIRO が)

~ $ cat << 'EOF' > blockpublicaccess.sh
> #!/bin/bash
> 
> echo "すべてのリージョンでスナップショットのパブリックアクセスをブロック中..."
> 
> # 全リージョンを取得
> REGIONS=$(aws ec2 describe-regions --query 'Regions[].RegionName' --output text)
> 
> # 各リージョンで実行
> for region in $REGIONS; do
>     echo "処理中: $region"
>     
>     aws ec2 enable-snapshot-block-public-access \
>         --state block-all-sharing \
>         --region $region
>     
>     if [ $? -eq 0 ]; then
>         echo "✓ $region: 完了"
>     else
>         echo "✗ $region: 失敗"
>     fi
> done
> 
> echo "全リージョンでの処理が完了しました"
> EOF

早速、実行権限を付与して実行してみました。

~ $ ls -l
total 7
-rw-r--r--. 1 cloudshell-user cloudshell-user 624 Dec 24 12:10 blockpublicaccess.sh
~ $ 
~ $ chmod +x blockpublicaccess.sh 
~ $ 
~ $ ./blockpublicaccess.sh 
すべてのリージョンでスナップショットのパブリックアクセスをブロック中...
処理中: ap-south-1
{
    "State": "block-all-sharing"
}
✓ ap-south-1: 完了
...
(中略)
...
✓ us-west-1: 完了
処理中: us-west-2
{
    "State": "block-all-sharing"
}
✓ us-west-2: 完了
全リージョンでの処理が完了しました
~ $ 

リージョンを切り替えていくつか確認しましたが、「スナップショットブロックパブリックアクセス」はすべて有効化されていました。

Organizations 全体に適用する方法

Organizations 配下の全アカウントの全リージョンに適用するのは、AWS CLI を使ったとしても手間です。
CloudFormation StackSets を使うのかな?と思って、ドキュメントを調べたら、AWS Organizations の宣言型ポリシーに機能がありました。

docs.aws.amazon.com

スクリーンショットを取得しましたので、方法をまとめます。

  1. AWS Organizations 管理アカウントにサインインし、ナビゲーションペインからポリシーを選択。
  2. EC2 の宣言型ポリシーを選択・クリックし、[EC2 の宜言型ポリシーを有効にする] ボタンをクリック。
  3. [ポリシーを作成] ボタンをクリックします。
  4. 任意のポリシー名を指定し、タグにて「スナップショットブロックパブリックアクセス」を選択します。
  5. オプションを選択。ここでは「すべてのパブリック共有をブロック」 を選択しました。
  6. 作成したポリシーのチェックボックスにチェックを入れて、対象 OU に適用しました。

いくつかアカウントを確認しましたが、すべてのアカウントで、各リージョンにブロックが適用されていました。

ブロックされていました

注意点

非常にレアなケースだと思いますが、パブリック共有する必要のあるスナップショットが存在する場合、本機能を有効にするとサービス障害が発生します。

パブリック共有されたスナップショットが存在する場合、Security Hub CSPM で「EC2.1 EBS snapshots should not be publicly restorable」のコントロール検証に失敗するはずなので、そこでチェックするか、AWS CLI で各リージョンの共有スナップショットを列挙するなどして、十分にチェックした方が良いと感じました。

以上です。