LinuxサーバーにおけるWazuh SIEM構築・設定ガイド:セキュリティ監視と脆弱性検知

Monitoring tutorial - IT technology blog
Monitoring tutorial - IT technology blog

サーバーログの現実:膨大なログの迷宮から抜け出すには

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接続

サーバー側の準備が整いました。続いて、保護対象のクライアントサーバーを管理センターへ接続します。

  1. Dashboard左側のメニューを開き、Server management > Endpoints Summary へ移動して、Deploy new agent ボタンをクリックします。
  2. クライアントマシンのOS(例: Ubuntu/Debian)を選択し、Wazuh Serverの固定IPアドレスを入力します。
  3. 必要なコマンド一式が自動生成されますので、それをクライアントマシンのターミナルに貼り付けて実行します。
# 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画面を凝視し続ける必要がなくなります。

Share: