すべての解説
深刻度:重大設定ミス

公開されたデータベースバックアップ:/backup.sqlにアクセスできるとどうなるか

データベースのバックアップ(.sqlファイル、圧縮ダンプ、データベースのzipアーカイブ)は、Webからアクセス可能なディレクトリに直接作成され、そのまま放置されることがあります。/backup.sqlや/dump.sqlへのリクエストが1回成功するだけで、攻撃者はアプリケーションロジックに触れることなく、すべてのテーブルのすべての行を手に入れます。

これは何か

バックアップスクリプト、ホスティングのコントロールパネル、手動のエクスポートツールは、backup.sql、dump.sql、database.sql、db.sql.gz、backup.zipといった推測しやすい名前でダンプファイルを書き出すことがよくあります。これらがWebルート内に置かれ、サーバーが明示的にブロックしていない場合、普通のダウンロード可能なファイルになります。攻撃者は、到達できるすべてのホストに対してこうした一般的な名前を何十個もリクエストする自動スキャンを実行しています。

AppSafeは/backup.sql、/dump.sql、/database.sql、/db.sql.gzなどの最も一般的なパスをチェックし、SQLダンプやアーカイブに見える内容で200レスポンスを返すものを報告します。このチェックはプレーンテキストのSQLと圧縮形式の両方を検出します。

なぜ重要か

SQLダンプには、取得時点のすべてのテーブルのすべての行が含まれます。ユーザーアカウント、パスワードハッシュ、メールアドレス、個人情報、セッショントークン、支払い履歴、アプリケーション内部の状態などです。ダンプのダウンロードはHTTPリクエスト1回で済み、アプリケーションログには痕跡が残りません。Webサーバーは他の静的ファイルと同じように配信するからです。

流出したAPIキーと違い、流出したデータベースはローテーションできません。誰かがusersテーブルのコピーを手に入れた時点で、そのユーザーにとって侵害は永続的です。ダンプの内容によっては、GDPR、CCPA、HIPAAに基づく侵害通知が義務付けられ、影響を受けたすべてのユーザーへの通知という運用コストも発生します。

直し方

バックアップをWebルートの外に移す

正しい対策は、Webサーバーが到達できないディレクトリにバックアップファイルを書き出すことです。/var/www/のサブディレクトリではなく、/var/backups/のようなパスや、非公開ACLのオブジェクトストレージバケットを使ってください。cronジョブやバックアップスクリプトを見直し、出力先のパスを更新します。

nginxで一般的なバックアップ拡張子をブロックする

多層防御の一環として、ファイルの保存場所にかかわらず、SQLファイルや一般的なアーカイブ拡張子へのリクエストをサーバーレベルで拒否します。

location ~* \.(sql|sql\.gz|bak|dump|tar|tar\.gz|tar\.bz2|zip)$ {
  deny all;
  return 404;
}
Webルートにあるダンプファイルを削除する

公開されたファイルを見つけたら、すぐに削除してください。次に、なぜそこに置かれたのかを調査し、それを配置したスクリプトや手順を修正して、次回の定期実行で再び現れないようにします。

パスが404を返すことを確認する

クリーンアップ後、一般的なパスがブロックされていることを確認します。

for path in /backup.sql /dump.sql /database.sql /db.sql.gz; do
  code=$(curl -so /dev/null -w "%{http_code}" "https://yourdomain.com$path")
  echo "$path → $code"
done
# Every line must print 404

FAQ

攻撃者はなぜ私のサイトで/backup.sqlを試すことを知っているのですか?

あなたを狙い撃ちしているわけではありません。自動スキャナーは何百万ものホストに対して、一般的なバックアップ名を何十個も絶えずリクエストしています。存在するファイルは200を返し、あなたが確認しようと思う前にダウンロードされてしまいます。

ファイルが置かれていたのは1時間だけでした。もう被害は出ていますか?

その可能性はあります。自動スキャンは24時間稼働しており、ファイルは出現から数分以内に見つかることがよくあります。アクセスログがあれば、そのパスがリクエストされたかを確認してください。リクエストされていたら、侵害が確定したものとして扱ってください。

ファイルを移動する代わりにパスワードで保護するだけではだめですか?

単一ファイルへのBasic認証は脆弱で、設定ミスも起こりやすい方法です。正しい答えは、Webからアクセス可能な場所からファイルを完全に取り除くことです。バックアップはHTTPサーバーが到達できない場所に置くべきです。

あなたのアプリは大丈夫ですか?

AppSafeなら、この問題を含む数十項目を1回の無料スキャンでチェックできます。

アプリを無料でスキャン