Amazon S3でのアカウントレベルでのブロックパブリックアクセス設定の有効化について

このブログシリーズ 「クラウドセキュリティ 実践集」 では、一般的なセキュリティ課題を取り上げ、「なぜ危険なのか?」 というリスクの解説から、「どうやって直すのか?」 という具体的な修復手順(コンソール、AWS CLI、Terraformなど)まで、分かりやすく解説します。

今回は、Amazon S3においてアカウントレベルでのブロックパブリックアクセス設定が有効になっていない状態について、そのリスクと対策を解説します。

ポリシーの説明

Amazon S3 の Security Hub コントロール – AWS Security Hub

[S3.1] S3 汎用バケットではブロックパブリックアクセスの設定が有効になっている必要があります。

このコントロールは、 Amazon S3 パブリックアクセス設定が S3 汎用バケットのアカウントレベルで設定されているかどうかをチェックします: 1 つ以上のブロックパブリックアクセス設定が false に設定されている場合、このコントロールは失敗します。

リスク

Amazon S3は、ウェブサイトのホスティングからデータアーカイブまで、幅広い用途で利用されるオブジェクトストレージサービスです。しかし、S3バケットへのパブリックアクセス設定は、適切な管理なしに放置されると、以下のような深刻なセキュリティリスクを引き起こします。

  • 意図しないデータ漏洩: 最も一般的なリスクは、設定ミスや不注意により、機密データを含むS3バケットがパブリックアクセス可能になり、意図しない情報漏洩が発生することです。顧客データ、個人情報、企業の機密情報などがインターネット上に公開され、悪意のあるアクターによって容易に取得される可能性があります。
  • SEOインデックス化による露出: パブリックにアクセス可能なS3バケットは、検索エンジンのクローラーによってインデックス化され、検索結果に表示されることがあります。これにより、機密情報がより広範に露出するリスクが高まります。
  • 悪用と改ざん: 攻撃者がパブリックS3バケットに書き込み権限を得た場合、マルウェアのホスティング、フィッシングサイトの構築、ウェブサイトの改ざんなど、不正な目的でバケットを悪用する可能性があります。
  • ブルートフォース攻撃とコスト増: パブリックなS3バケットは、ブルートフォース攻撃や不正なダウンロードの標的となる可能性があります。これにより、帯域幅の消費が増加し、不必要なコストが発生する場合があります。

対策

Amazon S3のアカウントレベルでのブロックパブリックアクセス機能は、新しいバケットや既存のバケットが意図せずパブリックになることを包括的に防止するための非常に強力なセキュリティ機能です。この機能を有効にすることは、S3におけるデータ漏洩リスクを最小限に抑えるための最優先事項と考えるべきです。

アカウントレベルのブロックパブリックアクセス設定は、以下の4つの設定をまとめて管理します。

  1. ブロックパブリックACL (BlockPublicAcls): 新しいオブジェクトやバケットに対してパブリックアクセスを許可するACL (Access Control List) の使用を禁止します。既存のパブリックACLも無効にします。
  2. 無視パブリックACL (IgnorePublicAcls): 既存のバケットやオブジェクトに設定されているパブリックACLを無視し、それらがパブリックアクセスを許可しないようにします。
  3. ブロックパブリックバケットポリシー (BlockPublicPolicy): 新しいバケットポリシーがパブリックアクセスを許可することを禁止します。既存のバケットポリシーがパブリックアクセスを許可している場合、それらを無効にします。
  4. 制限パブリックバケット、クロスアカウントアクセス (RestrictPublicBuckets): パブリックACLまたはパブリックポリシーを通じてパブリックアクセスが許可されているバケットへのアクセスを、バケットの所有者アカウントからのアクセスに限定します。

これらの設定は、S3バケットをパブリックにアクセスさせる必要があるごく一部の例外を除き常にアカウントレベルで有効化しておくべきです。 ウェブサイトホスティングなどの特定のユースケースでパブリックアクセスが必要な場合は、個別のバケットレベルで必要な最小限のパブリックアクセスのみを許可し、かつ他の3つのブロックパブリックアクセス設定を厳密に適用することが推奨されます。

修復方法

AWSコンソールでの修復手順

AWSコンソールを使用して、S3のアカウントレベルでブロックパブリックアクセス設定を有効にします。

  1. S3サービスへ移動: AWSコンソールにログインし、Amazon S3 サービスを開きます。
  2. 「ブロックパブリックアクセス (アカウント設定)」へ移動: 左側のナビゲーションペインで「ブロックパブリックアクセス (アカウント設定)」を選択します。
  3. 設定の編集: 現在の設定が表示されます。「編集」をクリックします。
  4. すべてのブロックパブリックアクセス設定を有効にする:パブリックアクセスをすべてブロック」のチェックボックスをオンにします。これにより、以下の4つの設定がすべて有効になります。
    • パブリック ACL によるアクセスをブロック
    • 任意の ACL からのパブリックアクセスをブロック
    • パブリックバケットポリシーによるアクセスをブロック
    • パブリックとクロスアカウントアクセスのバケットへのアクセスをブロック
    • : これらの設定を有効にすると、既存のパブリックにアクセス可能なバケットも影響を受け、アクセスできなくなる可能性があります。変更を適用する前に、パブリックアクセスが必須なバケットがないか確認し、必要であればバケットレベルでブロックパブリックアクセス設定を調整してください。
  1. 変更の確認と保存: 変更内容を確認し、確認のためにテキストボックスに「confirm」と入力して、「変更を保存」をクリックします。

これにより、AWSアカウント内のすべての既存および新規のS3バケットに対して、パブリックアクセスがデフォルトでブロックされるようになります。

Terraformでの修復手順

TerraformでS3のアカウントレベルでブロックパブリックアクセス設定を有効にするには、aws_s3_account_public_access_block リソースを使用します。

# S3 アカウントレベルのブロックパブリックアクセス設定
resource "aws_s3_account_public_access_block" "account_level_block_public_access" {
  block_public_acls       = true
  block_public_policy     = true
  ignore_public_acls      = true
  restrict_public_buckets = true
}

# (オプション) S3 バケットの例
# アカウントレベルでブロックパブリックアクセスが有効になっている場合、
# これらのバケットもデフォルトでパブリックアクセスがブロックされます。
# バケットレベルでパブリックアクセスブロック設定をオーバーライドすることも可能ですが、
# セキュリティベストプラクティスとしては推奨されません。
/*
resource "aws_s3_bucket" "my_private_bucket" {
  bucket = "my-strictly-private-bucket-12345"
  acl    = "private" # デフォルトでプライベート

  # バケットレベルでブロックパブリックアクセスを明示的に適用することも可能(推奨)
  # aws_s3_bucket_public_access_block リソースと併用
  # public_access_block_configuration {
  #   block_public_acls       = true
  #   block_public_policy     = true
  #   ignore_public_acls      = true
  #   restrict_public_buckets = true
  # }

  tags = {
    Environment = "Production"
  }
}
*/

上記のTerraformコードでは、aws_s3_account_public_access_block リソースを使用して、アカウントレベルのS3ブロックパブリックアクセス設定を有効にしています。

  • block_public_acls = true: 新しいオブジェクトやバケットに対してパブリックアクセスを許可するACLの使用を禁止します。
  • block_public_policy = true: 新しいバケットポリシーがパブリックアクセスを許可することを禁止します。
  • ignore_public_acls = true: 既存のバケットやオブジェクトに設定されているパブリックACLを無視し、それらがパブリックアクセスを許可しないようにします。
  • restrict_public_buckets = true: パブリックACLまたはパブリックポリシーを通じてパブリックアクセスが許可されているバケットへのアクセスを、バケットの所有者アカウントからのアクセスに限定します。

これらの設定をtrueにすることで、アカウント内のすべてのS3バケットに対して強力なパブリックアクセスブロックが適用されます。

最後に

この記事では、S3のアカウントレベルでブロックパブリックアクセス設定を有効にすることの重要性について解説しました。この設定は、S3バケットからの意図しないデータ漏洩を防ぎ、コンプライアンスを遵守し、全体的なセキュリティ体制を強化するための非常に効果的かつ基本的な対策です。

貴社のAWSアカウントでは、S3ブロックパブリックアクセス設定がアカウントレベルで有効になっていますか?一部の例外を除き、この設定は常に有効にしておくべきです。この機会にぜひ設定を確認し、必要であれば直ちに有効化してください。

こちらの内容の検出は弊社が提供するSecurifyのCSPM機能で簡単に検出及び管理する事が可能です。運用が非常にラクに出来る製品になっていますのでぜひ興味がある方はお問い合わせお待ちしております。

最後までお読みいただきありがとうございました。この記事が皆さんの役に立てば幸いです。

この記事をシェアする

クラウドセキュリティ対策実践集一覧へ戻る

貴社の利用状況に合わせた見積もりを作成します。

料金プランを詳しく見る