ストレージの保護: ダングリング バケットの乗っ取りを防ぐためのベスト プラクティス
Raman Bansal
Senior Software Engineer
Maksim Shudrak
Information Security Engineer
※この投稿は米国時間 2025 年 8 月 8 日に、Google Cloud blog に投稿されたものの抄訳です。
ストレージ バケットは、クラウド内のデータが保存される場所です。デジタルの不動産にたとえると、バケットはインターネット上の土地のようなものです。引っ越して特定のバケットが不要になった場合、古いアドレスがまだ一般公開されていれば、他の人がその「土地」を再利用できます。
これがダングリング バケット攻撃の根幹となる考え方です。ストレージ バケットを削除しても、アプリケーション コード、モバイルアプリ、公開ドキュメントにそのバケットへの参照が残っている場合に発生します。攻撃者は、自分のプロジェクトで同じバケット名を簡単に要求できます。これにより、古いアドレスが事実上ハイジャックされ、公式には使用されなくなったバケットをまだ利用しているユーザーに、マルウェアを配信したり、データを盗んだりする可能性があります。
幸いなことに、次の 4 つのステップで、アプリケーションとユーザーをこの脅威から保護できます。
まず、安全な廃止計画を実装する
バケットを削除する際は、慎重に行ってください。慎重な廃止プロセスが重要です。gcloud storage rm を入力する前に、次の手順を行います。
ステップ 1: 監査と学習
削除する前に、バケットにアクセスしているユーザーとリソースを把握します。ログを使用して、最近のトラフィックを確認します。古いバージョンのアプリ、サードパーティ サービス、ユーザーからのアクティブなトラフィック リクエストを確認したら、調査します。実行可能コード、ML モデル、動的ウェブ コンテンツ(JavaScript など)、機密性の高い構成ファイルをプルしようとするリクエストには特に注意してください。
リクエスト元のユーザー エージェントを確認すると、ボット、データ クローラ、スキャナからのリクエストが多数あることがわかります。これらのリクエストは基本的にバックグラウンド ノイズであり、システムが正しく機能するためにバケットがアクティブに必要とされていることを示すものではありません。これらはアプリケーションやユーザーからの正規のトラフィックではないため、危険ではなく、無視してかまいません。
ステップ 2: 確信をもって削除
自動化されたプロセスやユーザー アクティビティの多くは毎日発生するわけではないため、バケットを削除する前に少なくとも 1 週間待つことが重要です。少なくとも 1 週間待つことで、以下を含むアクティビティの完全なサイクルを観察したという確信が高まります。
- 週次レポート: 週次スケジュールでレポートを生成し、データバックアップを実行するスクリプト。
- バッチジョブ: 週末や特定の曜日にのみ実行される自動化されたタスク。
- アクセス頻度が低いユーザー: バケットのデータに依存する機能を週に 1 回しか使用しないユーザー。
正当なトラフィックが 1 週間以上バケットにアクセスしていないことを確認し、すべてのレガシーコードを更新したら、バケットの削除に進むことができます。Google Cloud プロジェクトを削除すると、すべての Google Cloud Storage バケットを含む、そのプロジェクトに関連付けられたすべてのリソースが事実上削除されます。
ダングリング バケットを参照するコードを見つけて修正する
将来の問題を防ぐことも重要ですが、環境内にダングリング バケットへの参照がすでに存在する可能性があります。ここでは、それらを特定して修正する計画を立てます。
ステップ 3: 事前特定
ログの分析: これは最も強力なツールの一つです。ストレージ URL で「404 見つかりません
」エラーが繰り返し発生していることを示すサーバーログとアプリケーション ログについて、Cloud Logging データをクエリします。たとえば、存在しない同じバケット名に対するリクエストが大量に失敗している場合は、重大な危険信号です(これを修正するには、ステップ 3 に進み、ステップ 4 に進むことをおすすめします)。
コードベースとドキュメントをスキャンする: すべてのプライベートおよびオープンソースのコード リポジトリ(古いものやアーカイブされたものを含む)、構成、ドキュメントを包括的にスキャンして、使用されなくなった可能性のあるストレージ バケット名の参照がないか確認します。それらを見つける方法の一つは、次のパターンを探すことです。
gs://{bucket-name}
storage.googleapis.com/{bucket-name
}
{bucket-name}.storage.googleapis.com
commondatastorage.googleapis.com/{bucket_name}
{bucket_name}.
commondatastorage.googleapis.com
バケットがまだ存在するかどうかは、https://storage.googleapis.com/{your-bucket-name}
をクエリすることで確認できます。レスポンス NoSuchBucket
が表示された場合は、ダングリング バケット参照を特定したことを意味します。
バケットが存在する場合(NoSuchBucket
エラーが表示されない場合)、そのバケットが実際に組織に属していることを確認する必要があります。脅威アクターがすでにそのバケットを使用している可能性があるからです。
所有権を確認する最も簡単な方法は、バケットの Identity and Access Management(IAM)権限を読み取ってみることです。
gcloud storage buckets get-iam-policy gs://{bucket-name}
のようなコマンドを実行して、Access Denied
または 403 Forbidden
エラーが表示された場合は、バケットが他のユーザーによって使用されていることを示しています。バケットが存在することは証明されますが、アカウントにはバケットを管理する権限がありません。これは、バケットが乗っ取られたことを示しています。この参照はリスクとして扱われ、削除されるべきです。
便宜上、指定されたファイル内の未解決の参照を検索できるスクリプトを以下に示します。
このスクリプトと推奨事項で検出できるのはハードコードされた参照のみで、実行時に動的に生成された参照は検出できないのでご注意ください。また、コードベースにパターンに従っていないバケット名がハードコードされている場合もありますが、Google Cloud Storage クライアントで使用されています。
ステップ 4: 回収して保護する
自分やクライアントにセキュリティ リスクをもたらす可能性のあるダングリング バケット名を見つけた場合は、迅速に対応してください。
所有していないダングリング バケットの場合:
前のステップで利用可能なすべてのデータを使用して、ダングリング バケットを見つけ、コードまたはドキュメント内のハードコードされた参照を削除します。修正をユーザーにデプロイして、問題を完全に解決します。
所有しているダングリング バケットの場合:
- 名前を再利用: 管理している安全なプロジェクトに、まったく同じ名前の新しいストレージ バケットを作成します。これにより、攻撃者がそのドメインを使用することを防ぎます。
- ロックダウン: 回収したバケットに制限の厳しい IAM ポリシーを適用します。
allUsers
とallAuthenticatedUsers
のすべてのアクセスを拒否し、均一なバケットレベルのアクセスを有効にします。公開アクセスの防止コントロールを有効にして、バケットをプライベートな「シンクホール」にします。
これらのプラクティスを開発ライフサイクルと運用手順に組み込むことで、ダングリング バケットの乗っ取りを効果的に防ぐことができます。クラウド環境の保護は継続的なプロセスであり、これらの手順により、お客様とユーザーの保護が強力に強化されます。
ストレージ バケットの管理について詳しくは、こちらのドキュメントをご覧ください。
-シニア ソフトウェア エンジニア、Raman Bansal
-情報セキュリティ エンジニア、Maksim Shudrak