Docker上でWazuh SIEM & XDRを構築:自宅ラボ(HomeLab)向けセキュリティ監視の完全ガイド

HomeLab tutorial - IT technology blog
HomeLab tutorial - IT technology blog

デプロイ手法の比較

自宅ラボ(HomeLab)がいくつかの基本的なコンテナの運用から規模を拡大し、公開WebアプリケーションやNextcloudインスタンス、WireGuardトンネルなどをホストするようになると、単なるsyslogビューアやファイアウォールのグラフだけでは対応しきれなくなります。改ざん検知アラート、SSHブルートフォース攻撃の追跡、自動CVEスキャンなど、実用的なセキュリティシグナルが必要です。Wazuhのような本格的なセキュリティプラットフォームを運用する場合、現実的なアプローチは主に3つあります。

1. ベアメタルまたは専用仮想マシン(VM)へのインストール

UbuntuやDebianのVMにWazuhを直接インストールすると、ハードウェアリソースへの直接アクセスやネイティブなsystemdによる管理が可能になります。しかし、アップグレード作業がすぐに大きな負担となるのが難点です。Indexer、Manager、Dashboardのバージョンを揃えて維持するには、それぞれ固有のストレージパスや権限設定を持つ3つの異なるサービスにまたがってAPTの依存関係を管理しなければなりません。

2. クラウド型SIEMサービス

Datadog Security、Wazuh Cloud、Microsoft SentinelなどのSaaSプラットフォームを利用すれば、バックエンドインフラを保守する手間が省けます。エージェントをデプロイするだけですぐにログの取り込みが始まります。しかし、最大の課題はコストです。ノイズの多いコンテナログを毎日20GB取り込むと、月々の費用が容易に数百ドルに跳ね上がり、個人の環境では維持が難しくなります。

3. Docker Composeによるコンテナスタック

Docker Composeを利用すると、Wazuh Indexer(ストレージと検索)、Wazuh Manager(検知とルール評価)、Wazuh Dashboard(Kibana/OpenSearch UI)という主要コンポーネントすべてを独立したコンテナとしてパッケージ化できます。環境設定ファイル、TLS証明書、永続化データがすべて単一のディレクトリ配下に収まるため、障害復旧時もそのフォルダを丸ごとバックアップするだけで完結します。

DockerでWazuhを動かすメリット・デメリット

ハイパーバイザー上でメモリを割り当てる前に、コンテナ化が大きな効果を発揮する点と、運用上注意が必要な点を把握しておきましょう。

メリット

  • 迅速な立ち上げ: 標準的なYAMLマニフェストを使用することで、3層構造のSIEM環境を10分足らずで起動できます。
  • 容易なアップグレード: docker-compose.yml内のイメージタグを変更して最新レイヤーをプルするだけでバージョンアップが完了し、システムライブラリの競合を回避できます。
  • 分かりやすいストレージ管理: すべてのイベントインデックス、アラート、ステートファイルは、明示的なDockerの名前付きボリューム(named volume)内に集約されます。
  • 移行の手間が最小限: 設定ディレクトリとデータボリュームをrsyncで転送するだけで、新しいミニPCやProxmoxホストへ簡単にSIEMを移行できます。

デメリット

  • 大量のRAM消費: IndexerはOpenSearch上で動作するため、OOM(Out-Of-Memory)によるクラッシュを防ぐだけでも最低4GB〜6GBの専用RAMが必要です。
  • 送信元IPのマスキング: 適切なホストネットワーキングやプロキシヘッダーを設定しない場合、DockerのデフォルトブリッジNATにより、受信するエージェントトラフィックが本来のサブネットではなく172.18.0.1から来ているように見えてしまいます。
  • ホストカーネルの要件: OpenSearchはメモリマッピングを多用するため、ホストOS側でsysctlの設定変更が必須となります。

ハードウェアおよびホスト要件

エンタープライズグレードのSIEMを運用するには、相応のリソースが求められます。5〜15台程度のマシンからログを収集するシングルノードクラスタの場合、以下のハードウェア構成を目安にしてください:

  • ホストOS: Ubuntu Server 22.04 LTS または 24.04 LTS(x86_64アーキテクチャ)。
  • CPU: 4物理コアまたは仮想コア(例:第8世代Intel Core i5、AMD Ryzen 3000シリーズ以降など)。
  • メモリ: 最小8GB。生のインデックス履歴を30日以上保持する場合は16GBを推奨。
  • ディスク: NVMeまたはSATA SSDで100GB以上。回転式HDDやSDカードでのIndexer運用は避けてください。ランダム書き込みのレイテンシによりOpenSearchの処理が停滞します。
  • Docker: Docker Engine 24.0以降およびDocker Compose V2プラグイン(docker-composeではなくdocker compose)。

実装手順ガイド

ここからは、ホストの設定、証明書の生成、スタックの起動、そして最初のエージェントの登録手順を説明します。

ステップ1:ホストの仮想メモリ制限の調整

ホストのメモリマップカウントが低すぎると、Wazuh Indexerの起動に失敗します。Linuxディストリビューションのデフォルト値は通常65530に制限されているため、最低でも262144まで引き上げます。

# 現在の上限値を確認
cat /proc/sys/vm/max_map_count

# 必要な上限値を恒久的に適用
echo "vm.max_map_count=262144" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p

ステップ2:Wazuh公式Dockerリポジトリのクローン

Wazuhリポジトリから公式のシングルノード用デプロイテンプレートを取得します:

git clone https://github.com/wazuh/wazuh-docker.git -b v4.9.0 --depth=1
cd wazuh-docker/single-node

ステップ3:内部用TLS証明書の生成

Manager、Indexer、Dashboard間の通信は、暗号化されたmTLSによって保護されます。Wazuhの証明書ジェネレータコンテナを使用して、すべての内部コンポーネント用の自己署名証明書を発行します:

docker compose -f generate-indexer-certs.yml run --rm generator

次に進む前に、証明書とキーがディスクに出力されたことを確認します:

ls -la config/wazuh_indexer_ssl_certs/

ステップ4:クラスタの起動

バックグラウンド(デタッチモード)で主要3コンテナを起動します:

docker compose up -d

起動ログを確認します。OpenSearchの初期化にはおよそ60〜90秒かかります:

docker compose logs -f wazuh.indexer

ログにクラスタの状態が「green」と表示されたら、ブラウザで以下のアドレスにアクセスします:

https://<DockerホストのIPアドレス>:443

自己署名証明書の警告が表示されたら承認して続行します。デフォルトの認証情報であるユーザー名admin、パスワードSecretPasswordでログインしてください。ログイン後は速やかにServer management > Security > Internal usersから変更するか、コンテナ起動前にローカルの環境変数ファイルで認証情報を更新してください。

ステップ5:クライアントへのWazuhエージェントのインストール

続いて、SIEMの監視対象を設定します。社内DNSサーバー、Dockerノード、リバースプロキシなど、監視したい別のLinuxホストに軽量エージェントをインストールします。

対象マシンにSSH接続し、署名鍵をインポートしてリポジトリを設定します:

# リポジトリキーのインポート
curl -s https://packages.wazuh.com/key/GPG-KEY-WAZUH | sudo gpg --no-default-keyring --keyring gnupg-ring:/usr/share/keyrings/wazuh.gpg --import && sudo chmod 644 /usr/share/keyrings/wazuh.gpg
echo "deb [signed-by=/usr/share/keyrings/wazuh.gpg] https://packages.wazuh.com/4.x/apt/ stable main" | sudo tee /etc/apt/sources.list.d/wazuh.list
sudo apt update

# Wazuh ManagerホストのIPアドレスを指定してエージェントをインストール
sudo WAZUH_MANAGER="192.168.1.100" apt install wazuh-agent

エージェントのデーモンを有効化し、起動します:

sudo systemctl daemon-reload
sudo systemctl enable wazuh-agent
sudo systemctl start wazuh-agent

ステップ6:ログ取り込みとセキュリティテレメトリの確認

Wazuh Dashboardに戻ります。30〜60秒ほどで、Endpoints Summaryに対象クライアントがActiveとして表示されるはずです。

エージェントは直ちにローカルホストのセキュリティ状態のレポートを開始します:

  • ファイル整合性監視(FIM): /etc/passwdや/etc/sudoersなどの機密ファイル、あるいはシステムバイナリに変更があった場合、リアルタイムでアラートを生成します。
  • 脆弱性監査: インストール済みパッケージのバージョンを、NVD(米国国立脆弱性データベース)やベンダーのセキュリティ情報などの既知のCVEフィードと照合・チェックします。
  • 脅威ハンティング & ルートキット検出: 不審なプロセス、プロミスキャスモードのネットワークインターフェース、不正なリッスンポートなどを検知してフラグを立てます。

これで、ホスト環境を汚すことなくDocker上でクリーンに動作する、自宅ラボを保護するための本格的なSIEM/XDRハブの構築が完了しました。

Share: