Dockerで構築する軽量なペネトレーションテスト環境 (DVWA & Metasploitable)

Security tutorial - IT technology blog
Security tutorial - IT technology blog

午前3時15分の呼び出し音

半年前、私のサーバーがわずか1時間で14,200回ものSSHブルートフォース攻撃を受けました。午前3時15分、失敗したログインログが次々と流れるのを眺めながら、インフラに対する見方が変わりました。システムを構築する方法は知っていても、それがどうやって壊されるのかを理解していないことに気づいたのです。本番環境を破壊したり法に触れたりすることなく、早急に「攻撃者のマインドセット」を身につける必要がありました。

問題は、理論を読むことと実際にエクスプロイトを実行することの間のギャップです。公開されているWebサイトへのテストは、法的なトラブルへの直行便です。一方で、Metasploitable 2やWindows Serverなどの重い仮想マシン(VM)を使った従来のラボ構築は、リソースを大量に消費します。私はSQLインジェクションを学ぶよりも、VirtualBoxのブリッジアダプターの設定に時間を費やしていました。それは非常にストレスの溜まる作業でした。

なぜ従来のセキュリティラボはモチベーションを削ぐのか

環境構築の摩擦は、学習者にとって最大の障害です。現代の開発チームではコンテナを使用して迅速に動いています。しかし、多くのセキュリティチュートリアルはいまだに、初心者に対して5GBもの巨大な.vmdkファイルをダウンロードさせ、壊れやすいホストオンリーネットワークを設定するよう勧めています。

これらのレガシーなラボには、3つの致命的な欠点があります:

  • リソースの重さ: 3つのVMを実行すると16GBのRAMを簡単に使い果たし、ノートPCのファンはジェットエンジンのような音を立てます。
  • 構成のドリフト: VMを一度「破壊」してしまうと、クリーンな状態にリセットするのに5分かかります。これでは、クリエイティブなフローが途切れてしまいます。
  • 隔離のリスク: VMブリッジの設定を一つ間違えるだけで、意図的に脆弱にしたターゲットを自宅のWi-Fiや公開インターネットにさらしてしまう危険があります。

サンドボックス戦略の比較

最適な方法を見つける前に、3つのセキュリティサンドボックス構築手法を評価しました。

1. 重いVMアプローチ (VMware/VirtualBox)

これは古典的な方法です。Metasploitable2とKali Linuxを立ち上げます。OSレベルの隔離は優れていますが、動作が遅すぎます。2ヶ月後、私はあの10分かかる起動時間を避けるために、練習をサボるようになっていました。

2. クラウドベースのラボ (AWS/Azure)

VPSを借りるのは賢明に思えますが、利用規約(ToS)を読むまではそうでした。ほとんどのクラウドプロバイダーは「設計上の脆弱性」を持つソフトウェアを厳格に禁止しています。もしボットがあなたのインスタンスを見つけてDDoS攻撃の踏み台に利用したら、アカウントは即座に停止されます。さらに、時間ごとのコストもかかり続けます。

3. コンテナ化アプローチ (Docker)

ここが私の行き着いた場所です。Dockerを使えば、Damn Vulnerable Web App (DVWA) とMetasploitable環境を5秒以内に立ち上げることができます。アイドル状態のリソース消費はごくわずかです。構成を壊しても、docker-compose down && upを実行するだけですぐに再開できます。

解決策:ポータブルなDocker-Composeラボ

6ヶ月間、社内トレーニングでこれを使用してきた結果、Dockerが最も効率的な道であることが証明されました。私たちは2つの主要なターゲットに焦点を当てています。DVWAはXSSやCSRFなどのWeb特有の脆弱性を扱い、コンテナ化されたMetasploitableはVSFTPDのバックドアやBind shell攻撃などのネットワーク層のエクスプロイトを扱います。

ステップ1:ネットワークの隔離

ラボを専用のDockerネットワーク内に閉じ込めておきます。これにより、コンテナ同士の通信を確保しつつ、ホストのローカルサービスからは遠ざけることができます。

# ラボ専用のネットワークを作成
docker network create pentest-lab

ステップ2:ラボの定義

Infrastructure as Code(IaC)は学習の再現性を高めます。乱雑な一行コマンドの代わりに、docker-compose.ymlファイルを使用します。これは私がジュニアエンジニアのオンボーディングで使用しているのと全く同じ設定です:

version: '3'
services:
  dvwa:
    image: vulnerables/web-dvwa
    ports:
      - "8081:80"
    networks:
      - pentest-lab
    restart: always

  metasploitable:
    image: tleemcjr/metasploitable2
    ports:
      - "8082:80"
      - "4444:4444"
    networks:
      - pentest-lab
    # 安全性:Metasploitableは設計上、脆弱です。
    # ホストのファイアウォールで、これらのポートをWANからブロックしていることを確認してください。

networks:
  pentest-lab:
    external: true

ステップ3:起動と攻撃

これをローカルのLinuxワークステーション、または専用のノートPCで実行してください。Webに公開してはいけません。

docker-compose up -d

DVWAは http://localhost:8081 (User: admin / Pass: password) で動作します。Metasploitable의 Webサービスは http://localhost:8082 です。

現場で得た教訓

コンテナのスナップショット的な性質はゲームチェンジャーです。以前、コマンドインジェクションのテストを失敗させ、コンテナ内の /var/www/html を誤って削除してしまったことがあります。VMならロールバックや再インストールが必要ですが、Dockerなら数秒でコンテナを再生成するだけでした。

以下の3つの現実を覚えておいてください:

  • エフェメラル(一時的)なデータ: Dockerコンテナはデフォルトで状態を保存しません。私はむしろこれを好んでいます。環境をリセットするたびに、エクスプロイトを確実に動作させるためのスクリプト化を強制されるからです。
  • ネットワークの制限: ARPスプーフィングなど、一部の深いレベルの攻撃は、標準のDockerブリッジでは困難です。そのような特殊なケースでは、依然としてVMが必要になるかもしれません。しかし、Webやサービスに対するテストの90%において、Dockerの方が優れています。
  • ラボはリスクである: このラボは意図的にセキュアではありません。公開サーバー上でこれを実行してはいけません。私は自分の環境を厳格なローカルファイアウォールの背後に置き、作業が終わった瞬間にプロセスを終了させています。

継続は複雑さに勝る

セキュリティを学ぶ上で重要なのは、高価なセットアップではありません。「継続すること」です。数秒で起動するラボがあれば、練習への心理的障壁が取り除かれます。SSHブルートフォース攻撃を再現する場合でも、新しいAPIを保護する場合でも、このDocker環境はあなたの安全で合法的な遊び場となります。VMの設定に悩むのはやめて、脆弱性のハンティングを始めましょう。

Share: