[アップデート] EBS スナップショットのパブリック共有をアカウントレベルでブロックする機能が追加されました。

2023.11.10

こんにちは、AWS事業本部の平木です!

Amazon マシンイメージ(以下、AMI)のブロックパブリックアクセスの機能が追加されてから記憶が新しいですが、EBS スナップショットでもパブリック共有をブロックする機能(Block public access for EBS snapshots)が追加されました。

AMI のブロックパブリックアクセスに関してのブログは以下をご参照ください。

3行まとめ

忙しい人向けにこの機能を3行でまとめました。

  • 有効化させると EBS スナップショットのパブリック共有機能をブロックすることができます。
  • ブロックの方法を2種類から選択でき、Block all sharing を有効化させる場合、既存のパブリック共有された EBS スナップショットはプライベート扱いになり、パブリックからアクセスできなくなります。
  • EBS-backed AMI がパブリック共有の場合は、AMI の設定が優先されます。

詳細が気になった方は続きをご確認ください。

Block public access for EBS snapshots

今回追加された、Block public access for EBS snapshots の機能についてご説明します。

この機能は文字通り、EBS スナップショットのパブリック共有を禁止させる機能です。
この機能を有効化させることで、有効化させたリージョン内にある EBS スナップショットをパブリックへの共有させないようにできます。

EBS スナップショットのブロックパブリックアクセスには2種類指定可能で、

  • Block all sharing
    • 全ての EBS スナップショットをパブリック共有にすることをブロックできます。
    • 既にパブリック共有されていた EBS スナップショットはプライベートとして扱われ、公開されなくなります。
  • Block new sharing
    • これから新規で EBS スナップショットをパブリック共有にすることをブロックできます。
    • 既にパブリック共有されていただ EBS スナップショットは引き続きパブリックに共有できます。

それぞれ見ていくと、

Block all sharing は、
有効化前にパブリックだった場合は、有効化後に参照不可になり、
有効化前にプライベートだった場合は、有効化後にパブリックへの変更ができなくなります。

Block new sharing は、
有効化前にパブリックだった場合は、有効化後も引き続き参照でき、
有効化前にプライベートだった場合は、有効化後にパブリックへの変更ができなくなります。

有効化の方法

マネジメントコンソールの場合

EC2 のコンソール画面のダッシュボードから、「Data protection and security」を押下します。

下までスクロールすると、Block public access for EBS snapshots の項目があるので「Manage」を押下します。 デフォルトでは、Not blocked (無効)となっていました。

① Block public access の左側にチェックを入れると、下の項目が現れるので、 ②ブロックしたい項目を選びます。 今回は、Block all public sharing を選択してみました。

③問題なければ「Update」を押下します。

Public access の項目が、「All sharing blocked」または「New sharing blocked」になっていれば有効化完了です。

この状態で EBS スナップショットの共有オプションを変更しようとすると、 パブリックが選択できないようになっていることが分かります。

AWS CLI の場合

CLI のバージョンは最新にして実行してください。

現在の状態を確認するには、get-snapshot-block-public-access-stateを使用して下記コマンドを実行します。

aws ec2 get-snapshot-block-public-access-state

有効化するには、enable-snapshot-block-public-access を使用して下記コマンドを実行します。

aws ec2 enable-snapshot-block-public-access --state {block-all-sharing または block-new-sharing}

無効化するには、disable-snapshot-block-public-access を使用して下記コマンドを実行します。

aws ec2 disable-snapshot-block-public-access

実際に現在の状態を確認しつつ、有効化と無効化してみるとこのような感じでした。

# 現在の状態の確認
[cloudshell-user@ip-10-4-78-227 ~]$ aws ec2 get-snapshot-block-public-access-state
{
    "State": "unblocked"
}
# ブロックパブリックアクセスの有効化(block-all-sharing)
[cloudshell-user@ip-10-4-78-227 ~]$ aws ec2 enable-snapshot-block-public-access --state block-all-sharing
{
    "State": "block-all-sharing"
}
# 現在の状態の確認
[cloudshell-user@ip-10-4-78-227 ~]$ aws ec2 get-snapshot-block-public-access-state
{
    "State": "block-all-sharing"
}
# ブロックパブリックアクセスの無効化
[cloudshell-user@ip-10-4-78-227 ~]$ aws ec2 disable-snapshot-block-public-access
{
    "State": "unblocked"
}
# 現在の状態の確認
[cloudshell-user@ip-10-4-78-227 ~]$ aws ec2 get-snapshot-block-public-access-state
{
    "State": "unblocked"
}
[cloudshell-user@ip-10-4-78-227 ~]$

ブロックパブリックアクセスが有効化された状態で CLI でパブリック共有に切り替えようとしたところ下記のようにエラーが起き、パブリック共有の設定に変えられないことが確認できました。

[cloudshell-user@ip-10-4-78-227 ~]$ aws ec2 modify-snapshot-attribute \
>     --snapshot-id snap-1234567890abcdef0 \
>     --attribute createVolumePermission \
>     --operation-type add \
>     --group-names all

An error occurred (OperationNotPermitted) when calling the ModifySnapshotAttribute operation: Public snapshot sharing is not allowed because Block Public Access is enabled for this account
[cloudshell-user@ip-10-4-78-227 ~]$

考慮すべきこと

  • ブロックパブリックアクセスを有効化しても、プライベートスナップショットの共有は使用できる
  • リージョン毎の設定のため、全てのリージョンでブロックしたい場合はそれぞれのリージョンで有効化する必要があります。
    • 全リージョン有効化する参考コマンドは後述します。
  • EBS スナップショットのパブリック共有をブロックしても、EBS-backed AMI がパブリック共有を有効化していた場合にはパブリック共有されます。

全リージョン有効化するコマンドは下記ようなもので実現できます。

aws ec2 describe-regions --query "Regions[].[RegionName]" --output text \
| while read region; do
  echo "### Enable snapshot block public access in ${region}"
  aws ec2 enable-snapshot-block-public-access \
  --region ${region} \
  --state {block-all-sharing または block-new-sharing}
done

Appendix

SCP でブロックパブリックアクセスを無効化できないようにしてみる

Organizations 環境の場合、 SCP で無効化できないようにすることが可能です。

具体的には、DisableSnapshotBlockPublicAccess を拒否することで可能です。

ポリシーの例は下記です。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Statement1",
      "Effect": "Deny",
      "Action": [
        "ec2:DisableSnapshotBlockPublicAccess"
      ],
      "Resource": "*"
    }
  ]
}

実際に無効化しようとしたところエラーになり無効化できないことが確認できました。

先日アップデートされました、 AMI のブロックパブリックアクセスの無効化も SCP で制御する場合の下記ブログは下記をご覧ください。

AMI のブロックパブリックアクセスと、EBS スナップショットのブロックパブリックアクセスの無効化をできないようにする SCP の例は下記です。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Statement1",
      "Effect": "Deny",
      "Action": [
        "ec2:DisableImageBlockPublicAccess",
        "ec2:DisableSnapshotBlockPublicAccess"
      ],
      "Resource": "*"
    }
  ]
}

参考

おわりに

今回は、EBS スナップショットのブロックパブリックアクセスについてご紹介しました!

AMI のブロックパブリックアクセスAMI の無効化の機能追加に次いで、EBS スナップショットのブロックパブリックアクセスの機能が追加されました。

次は、RDS のスナップショットのパブリック共有のブロックとかも来るのかな?なんて予想しちゃいました。

この記事がどなたかの役に立てば嬉しいです。