サーバーログの現実:膨大なログの迷宮から抜け出すには
Linuxサーバーを3〜5台以上運用しているエンジニアなら、一度はヒヤリとした経験があるのではないでしょうか。突如としてCPU使用率が100%に跳ね上がったり、あるいは最悪の場合、ある朝サーバーを確認したらWebソースコードの中に身元不明のWebシェルが仕込まれていたり……。以前の私はログを集約していなかったため、1台ずつSSHでログインしては目を酷使しながらgrepやlastbを叩いていました。しかし現在では、ダッシュボードを一目確認するだけで状況を即座に把握できます。
「パフォーマンス監視」と「セキュリティ監視」を混同しているケースは少なくありません。PrometheusやGrafanaはCPU使用率が99%に達したことを通知してくれますが、誰がSSHポートに総当たり攻撃を仕掛けているかまでは教えてくれません。また、/etc/shadowファイルがどのユーザーによって改ざんされたのか、インストール済みのOpenSSLに深刻なCVE脆弱性が含まれていないかも検知できません。そんな課題を解決するのが、本格的なオープンソースSIEM/XDRソリューションであるWazuhです。
コアアーキテクチャ:Wazuhはどのように脅威を検知するのか
わかりやすく言えば、Wazuhは「手のひらサイズのSOC(セキュリティオペレーションセンター)」のような役割を果たします。システムは連携して動作する以下の4つの主要コンポーネントで構成されています。
- Wazuh Indexer: OpenSearchをベースとした検索・インデックスエンジンです。毎秒数千イベントという高速な処理能力で、すべてのセキュリティアラートやイベントログを安全に保存し、インデックス化します。
- Wazuh Server (Manager): システムの頭脳となるサーバーです。エージェントから送信されたログを受信し、4,000以上のビルトインセキュリティルールと照合、CVEデータベースのスキャン、自動レスポンスのトリガーなどを担います。
- Wazuh Dashboard: 直感的なWebインターフェースです。MITRE ATT&CKフレームワークに準拠した攻撃グラフの可視化、ログ検索、管理対象エンドポイントの一括管理などを行えます。
- Wazuh Agent: 監視対象サーバー(Linux、Windows、macOS、Dockerコンテナなど)に直接導入する軽量デーモン(メモリ消費量は30〜50MB程度)です。システムログの読み取り、ファイル整合性やプロセスの監視を行い、ポート1514(TLS暗号化)経由でManagerへデータを転送します。
実践ガイド:Wazuh All-in-Oneクラスタの構築手順
1. ハードウェア要件と環境準備
中小規模の環境(エージェント数50台未満)であれば、Manager、Indexer、Dashboardを同一マシン上に集約する「All-in-One」構成が最もコスト効率に優れています。推奨されるスペックは以下の通りです。
- OS: Ubuntu 22.04 LTS または Debian 12(クリーンインストール環境推奨)。
- 標準スペック: 最低 4 vCPU、8GB RAM、50GB以上のNVMe SSD。特にWazuh Indexer(JVM)だけで最低4GBのHeapメモリを確保します。
- メモリが少ない場合(4GB〜6GB): 最低4GBのSwap領域作成が必須です。Swapがない場合、起動直後にLinuxカーネルのOOM-killerによってIndexerプロセスが強制終了されてしまいます。
# サービス停止(OOM)防止のため緊急で4GBのSwapを作成
sudo fallocate -l 4G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
2. 公式スクリプトによるWazuh All-in-Oneのインストール
OpenSearchの各パッケージやSSL/TLS証明書を個別に手動導入すると、バージョンの不整合や設定ミスが起きやすくなります。最も安全で確実な方法は、公式の自動インストールスクリプトを使用することです。スクリプトがクラスタ用の内部TLS証明書も自動生成してくれます。
# 最新バージョンのインストールスクリプトをダウンロード
curl -sO https://packages.wazuh.com/4.9/wazuh-install.sh
# All-in-Oneモード(-a)でインストールを実行
sudo bash ./wazuh-install.sh -a
インストールには通常5〜10分程度かかります。完了すると、ターミナル上にadminユーザーと自動生成された強力なランダムパスワードが出力されます。このパスワードは必ず安全な場所に保存してください。万が一ターミナルを閉じてしまった場合でも、バックアップアーカイブから以下のコマンドで確認可能です。
# 管理者パスワードの保存を忘れた場合にバックアップから抽出
sudo tar -O -xvf wazuh-install-files.tar wazuh-install-files/wazuh-passwords.txt
ブラウザを開き、https://<WazuhサーバーのIP> にアクセスします。自己署名SSL証明書の警告が表示されたらそのまま続行し、Dashboardにログインします。
3. クライアントサーバーへのAgent接続
サーバー側の準備が整いました。続いて、保護対象のクライアントサーバーを管理センターへ接続します。
- Dashboard左側のメニューを開き、Server management > Endpoints Summary へ移動して、Deploy new agent ボタンをクリックします。
- クライアントマシンのOS(例: Ubuntu/Debian)を選択し、Wazuh Serverの固定IPアドレスを入力します。
- 必要なコマンド一式が自動生成されますので、それをクライアントマシンのターミナルに貼り付けて実行します。
# GPGキーを取得して公式リポジトリを追加
wget -qO - https://packages.wazuh.com/key/GPG-KEY-WAZUH | sudo gpg --dearmor -o /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 -a /etc/apt/sources.list.d/wazuh.list
sudo apt-get update
# エージェントをインストールし、ManagerのIPを指定(実際のWazuhサーバーIPに置き換えてください)
sudo WAZUH_MANAGER='192.168.1.100' apt-get install wazuh-agent -y
# サービスの有効化と起動
sudo systemctl daemon-reload
sudo systemctl enable --now wazuh-agent
Dashboardを再読み込み(F5)すると、10秒も経たないうちに Endpoints のステータスが緑色の Active に変わります。
4. FIM(ファイル整合性監視)の有効化:コードの1行まで監視
FIMはWazuhにおける最も強力な機能の一つです。ファイルのSHA256チェックサム、権限、内容の変更を常時監視します。攻撃者が/var/www/配下にバックドアを設置したり、/etc/passwdを書き換えたりした瞬間に、即座にアラートが発報されます。
設定を行うには、クライアントマシン上の /var/ossec/etc/ossec.conf を開き、監視対象の重要ディレクトリを <syscheck> ブロック内に追加します。
<syscheck>
<!-- 6時間ごとに定期スキャンを実行 -->
<frequency>21600</frequency>
<!-- リアルタイム監視を有効化し、変更内容(diff)を詳細に記録 -->
<directories realtime="yes" check_all="yes" report_changes="yes">/etc,/usr/bin,/usr/sbin</directories>
<directories realtime="yes" check_all="yes" report_changes="yes">/var/www</directories>
<!-- アラートの過多を防ぐためフレームワークのログやキャッシュディレクトリを除外 -->
<ignore>/var/www/*/storage/logs</ignore>
<ignore>/var/www/*/runtime/logs</ignore>
<ignore>/var/www/*/var/cache</ignore>
</syscheck>
ここで指定している report_changes="yes" オプションは非常に強力です。git diff のように、ファイル内で追加・削除・変更されたテキスト行をWeb UI上でそのまま差分表示してくれます。設定変更後はエージェントを再起動して反映させます。
# 設定変更後にエージェントを再起動
sudo systemctl restart wazuh-agent
5. CVE脆弱性の自動検知(Vulnerability Detection)
セキュリティ情報を手作業でチェックし続ける代わりに、Wazuh Managerがクライアントマシン上のパッケージ一覧と米国立脆弱性データベース(NVD)、Canonical、Debian、RedHatなどのセキュリティアドバイザリを自動的に照合してくれます。
Wazuh 4.8以降、このモジュールは大幅に最適化されました。Wazuh Server 側で /var/ossec/etc/ossec.conf を開き、機能が有効化されていることを確認します。
<vulnerability-detection>
<enabled>yes</enabled>
<index-status>yes</index-status>
<feed-update-interval>60m</feed-update-interval>
</vulnerability-detection>
Dashboardから対象のエージェントを選択し、Vulnerability タブをクリックします。すると、該当する全CVEの一覧がCVSSスコアとともに表示されます。危険度がLowからCriticalまで明確に分類されるため、推測に頼ることなく、どのパッケージに対して今すぐ apt upgrade を適用すべきかを的確に判断できます。
6. 実践防御:Active ResponseによるSSHブルートフォース攻撃IPの自動遮断
単に検知するだけでは不十分です。Wazuhを「自動防御シールド」として機能させましょう。たとえば、同一IPアドレスからSSHパスワードの試行失敗が8回連続で発生した場合(ルールID 5712または5720がトリガー)、Wazuh Serverからエージェントへ指示を出し、ファイアウォールでそのIPを即座にドロップ(遮断)します。
Wazuh Server の /var/ossec/etc/ossec.conf に以下のブロックを追加します。
<active-response>
<command>firewall-drop</command>
<location>local</location>
<rules_id>5712, 5720</rules_id>
<timeout>600</timeout> <!-- 該当IPを10分間一時的にブロック -->
</active-response>
ファイルを保存し、sudo systemctl restart wazuh-manager でサーバーを再起動します。これ以降、ボットネットによる自動スキャン攻撃はネットワーク層で即座に遮断され、深夜にログ監視で張り付く必要もなくなります。
運用のヒントと推奨プラクティス
手作業のSSHログインから集中ログ監視へと移行することは、インフラ運用において大きなターニングポイントになります。Wazuhを導入すれば、高額な商用SIEM製品に匹敵する堅牢な監視体制を、ライセンス料ゼロで手に入れることができます。
システムの初期構築が完了したら、次はWebhookを連携してTelegramやSlackに通知を送る設定を行いましょう。アラートレベルを「Level 10以上」にフィルタリングしておけば、重要なインシデント発生時のみスマートフォンに即座に通知が届くため、常にPC画面を凝視し続ける必要がなくなります。

