| Security

中堅・中小企業こそOSSで統合監視:Wazuhで作る低コストSOC/XDR基盤

「セキュリティ対策、これ以上どうしろと言うんだ」

経営層からは「コストを抑えろ」と言われ、現場からは「PCが重い」と文句を言われ、監査法人からは「ログのモニタリング体制はどうなっていますか」と詰められる。これが、多くの中堅・中小企業(SMB)のIT管理者が置かれている過酷な現実ではないでしょうか。

CrowdStrikeやSentinelOneといった商用のEDR(Endpoint Detection and Response)や、SplunkのようなSIEM(Security Information and Event Management)は、確かに素晴らしい製品です。しかし、ライセンス費用だけで年間数百万円、さらに運用するためのSOC(Security Operation Center)を外部委託すれば月額数十万円が飛んでいきます。

「うちはそんな予算出ないよ」で終わらせてはいけません。予算がないなら、OSS(オープンソースソフトウェア)で戦う術があります。

本記事では、世界で最も利用されているOSSのXDR/SIEMプラットフォームである 「Wazuh」を活用し、 ライセンスコストほぼゼロで、エンタープライズレベルのセキュリティ監視基盤(簡易SOC)を構築する方法を解説します。


なぜ今、Wazuhなのか?

かつてOSSのセキュリティツールといえば、「設定が難しい」「GUIが貧弱」「誤検知が多い」というのが相場でした。しかし、Wazuhはその常識を過去のものにしています。

1. SIEMとXDRの「いいとこ取り」

Wazuhは、ログを集約・分析する SIEM機能と、エンドポイント(PCやサーバー)の挙動を監視・対処する XDR機能を統合しています。 Elastic Stack (Elasticsearch, Kibana) をベースに開発されており、検索パフォーマンスや可視化能力は折り紙付きです。

2. エージェントが超有能

各端末にインストールするWazuh Agentは非常に軽量ですが、以下の機能を単体でこなします:

  • ファイル改ざん検知 (FIM): 重要ファイルが書き換えられたら即座に発報。
  • 設定診断 (SCA): 「パスワードポリシーが甘い」「不要なサービスが動いている」などの設定不備を自動監査。
  • 脆弱性検知: インストールされているソフトのバージョンをCVEデータベースと照合し、危険な脆弱性をリストアップ。
  • 詳細ログ収集: WindowsイベントログやLinuxのSyslogを吸い上げ、サーバーへ転送。

3. コンプライアンス対応の可視化

PCI DSS, GDPR, NIST, HIPAAなどのセキュリティ基準に対応したダッシュボードが標準で用意されています。「コンプライアンス要件満たしてますか?」という監査対応の際、この画面を見せるだけで説明の手間が激減します。


Wazuhのアーキテクチャと仕組み

Wazuhは単なる「ログ収集サーバー」ではありません。その裏側では、高度な技術要素が連携して動いています。

コンポーネントの役割

  1. Wazuh Agent: エンドポイント(PC/サーバー)で動作する軽量プログラム。ログ収集、コマンド実行、ファイル監視、インベントリ収集を行います。収集したデータを暗号化してManagerへ送ります。
  2. Wazuh Server (Manager): Agentから送られてきたデータを復号し、数千以上の「デコーダー」と「ルール」に基づいて解析します。「これはSSHの失敗だ」「これは攻撃の予兆だ」と判断する頭脳です。
  3. Wazuh Indexer: 解析されたアラートデータを高速に検索・保存するためのデータベース(OpenSearchベース)。数億件のログから一瞬で目的のデータを抽出します。
  4. Wazuh Dashboard: データを可視化するWeb UI(OpenSearch Dashboardsベース)。運用者が普段見る画面です。

データの流れ

  1. 発生: ユーザーがPCで不正なファイルをダウンロード。
  2. 検知: Agentがファイル作成イベントを検知し、ハッシュ値を取得。
  3. 転送: Agentが暗号化チャネルを通じてManagerへ送信。
  4. 分析: ManagerがVirusTotalと連携(オプション)し、ハッシュ値が黒であると判定。
  5. 発報: アラートレベル12(High)としてインデックス化。
  6. 通知: Slackやメールへ通知が飛ぶ。

この一連の流れが、OSSだけで完結するのです。


導入前のサイジングガイド(推奨スペック)

「とりあえず入れる」でも動きますが、ログデータは意外とディスクを食います。SMB環境での現実的なサイジング目安です。

管理台数 CPU メモリ ディスク (ログ保持期間90日想定)
~25台 4 Core 8 GB 100 GB SSD
~100台 8 Core 16 GB 500 GB SSD
~500台 16 Core 32 GB 2 TB SSD (要クラスタ構成検討)

※ Wazuh Indexer(OpenSearch)はJavaベースのため、メモリを多く消費します。最低でも8GBないと、頻繁にOOM Killer(メモリ不足による強制終了)の餌食になります。ケチらずにメモリは積みましょう。


Wazuh構築完全ガイド (Docker Compose版)

本来、Wazuhの構築はIndexer, Server, Dashboardという3つのコンポーネントをセットアップする必要があり複雑ですが、Docker Composeを使えば一撃です。 今回は、SMB環境(管理対象50〜100台程度想定)で現実的に運用できる「シングルノード構成」を紹介します。

前提環境:

  • OS: Ubuntu 22.04 LTS / Debian 11 / RHEL 9 (またはWSL2上のUbuntu)
  • メモリ: 最低 6GB (8GB以上推奨)
  • Docker & Docker Compose: インストール済みであること

1. リポジトリのクローンと証明書生成

まず、Wazuh公式のDockerリポジトリを取得します。

git clone https://github.com/wazuh/wazuh-docker.git -b v4.7.2
cd wazuh-docker/single-node

※ バージョン v4.7.2 は執筆時点の安定版です。最新版はGitHubを確認してください。

SSL証明書を自動生成します。

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

これで config/wazuh_indexer_ssl_certs ディレクトリに証明書が作成されます。

2. docker-compose.yml の調整 (重要)

デフォルトの設定でも動きますが、実運用を見据えて docker-compose.yml を少し調整することをお勧めします。特にデータの永続化とメモリ制限は重要です。

version: '3'

services:
  wazuh.manager:
    image: wazuh/wazuh-manager:4.7.2
    hostname: wazuh.manager
    restart: always
    ports:
      - "1514:1514"  # エージェント通信用
      - "1515:1515"  # エージェント登録用
      - "514:514/udp" # Syslog受信用
      - "55000:55000" # API
    environment:
      - INDEXER_URL=https://wazuh.indexer:9200
      - INDEXER_USERNAME=admin
      - INDEXER_PASSWORD=SecretPassword123! # ★必ず変更
    volumes:
      - wazuh_api_configuration:/var/ossec/api/configuration
      - wazuh_etc:/var/ossec/etc
      - wazuh_logs:/var/ossec/logs # ★ログの永続化
      - wazuh_queue:/var/ossec/queue
    depends_on:
      - wazuh.indexer

  wazuh.indexer:
    image: wazuh/wazuh-indexer:4.7.2
    hostname: wazuh.indexer
    restart: always
    environment:
      - "OPENSEARCH_JAVA_OPTS=-Xms2g -Xmx2g" # メモリ割当(サーバー搭載量に合わせて調整)
      - "discovery.type=single-node"
    volumes:
      - wazuh-indexer-data:/var/lib/wazuh-indexer
    ulimits:
      memlock:
        soft: -1
        hard: -1
      nofile:
        soft: 65536
        hard: 65536

  wazuh.dashboard:
    image: wazuh/wazuh-dashboard:4.7.2
    hostname: wazuh.dashboard
    restart: always
    ports:
      - "443:5601" # ブラウザアクセス用
    environment:
      - INDEXER_URL=https://wazuh.indexer:9200
      - OPENSEARCH_HOSTS=https://wazuh.indexer:9200
    depends_on:
      - wazuh.indexer

volumes:
  wazuh_api_configuration:
  wazuh_etc:
  wazuh_logs:
  wazuh_queue:
  wazuh-indexer-data:

# ネットワーク設定などは環境に合わせて適宜追加

3. 起動

docker-compose up -d

起動完了まで2〜3分かかります。 ブラウザで https://<サーバーのIP> にアクセスし、ログイン画面が表示されれば成功です。 初期ユーザーは admin、パスワードは SecretPassword123! (ymlで指定したもの) です。


エージェントの展開:これがなければ始まらない

サーバーが建っただけでは何も監視できません。PCやサーバーに「Wazuh Agent」を入れましょう。

エージェントの追加手順

ダッシュボード左メニューから Agents > Deploy new agent をクリックします。 ウィザード形式でコマンドを自動生成してくれます。

  1. Operating system: Windows / Linux / macOS を選択。
  2. Architecture: 64bit / 32bit などを選択。
  3. Wazuh server address: 構築したサーバーのIPアドレスまたはドメインを入力。
  4. Group: 必要に応じてグループ分け(例: server-group, workstation-group)。

画面下に表示されたコマンドを、対象のマシンで実行するだけです。

Windowsの場合 (PowerShell管理者権限):

Invoke-WebRequest -Uri https://packages.wazuh.com/4.x/windows/wazuh-agent-4.7.2-1.msi -OutFile ${env:tmp}\wazuh-agent.msi; msiexec.exe /i ${env:tmp}\wazuh-agent.msi /q WAZUH_MANAGER='192.168.1.100' WAZUH_REGISTRATION_SERVER='192.168.1.100'
NET START WazuhSvc

完了すると、数分でダッシュボードの Agents 一覧にマシンが表示されます。「Active」になっていれば接続成功です。


実践活用シナリオ:明日から使える検知ルール

ここからが本番です。単に「ログが集まりました」では意味がありません。具体的な脅威をどう検知するか、実践的なシナリオを見ていきましょう。

シナリオ1: 重要な設定ファイルの改ざん検知 (FIM)

ランサムウェアや攻撃者は、バックドアを仕掛けるためにシステムファイルを書き換えます。WazuhのFile Integrity Monitoring (FIM) は標準で有効になっていますが、監視対象をカスタマイズすることで真価を発揮します。

設定場所: 各エージェント(または一括配布設定)の ossec.conf

<syscheck>
  <!-- 監視頻度(デフォルトは12時間だが、テスト用に短くしても良い) -->
  <frequency>43200</frequency>

  <!-- Webサーバーのドキュメントルートをリアルタイム監視 -->
  <directories whodata="yes" realtime="yes">/var/www/html</directories>
  
  <!-- 重要設定ファイル(変更されるはずがないファイル) -->
  <directories check_all="yes">/etc/passwd</directories>
  <directories check_all="yes">/etc/shadow</directories>
</syscheck>

whodata="yes" オプションを有効にする(要Auditd連携)と、「誰が(どのユーザーが)」書き換えたかまで特定できます。これがOSSでできるのは驚異的です。

シナリオ2: 脆弱性の可視化 (Vulnerability Detector)

「社内のPC、Chromeのバージョン古くない?」 これを調べるために全台回る必要はありません。Wazuhサーバー側で設定を有効にするだけで、Agentが集めたパッケージ情報をCVEデータベースと突き合わせてくれます。

設定場所: サーバー側の ossec.conf

<vulnerability-detector>
  <enabled>yes</enabled>
  <interval>5m</interval>
  <min_full_scan_interval>6h</min_full_scan_interval>
  <run_on_start>yes</run_on_start>
  
  <!-- 各OSのプロバイダを有効化 -->
  <provider name="canonical">
    <enabled>yes</enabled>
    <os>focal</os>
    <os>jammy</os>
  </provider>
  
  <provider name="msu">
    <enabled>yes</enabled>
  </provider>
  
  <provider name="nvd">
    <enabled>yes</enabled>
  </provider>
</vulnerability-detector>

設定を反映(docker-compose restart)してしばらく待つと、ダッシュボードの Vulnerability Detection メニューに、社内の端末にある脆弱性がズラリと表示されます。「Critical」な脆弱性が残っている端末が一目瞭然になるため、パッチ適用の優先順位付けが劇的に楽になります。

シナリオ3: 管理外のUSBメモリ接続検知

情報漏洩の温床となるUSBメモリ。Windowsのイベントログを監視することで、USBが挿された瞬間にアラートを上げることが可能です。

Wazuhの標準ルールセットにはUSB接続の検知ルールが含まれていますが、より明確にアラートを上げるには local_rules.xml に以下のようなルールを追加します。

<group name="pnp_devices,">
  <rule id="100001" level="7">
    <if_sid>60100</if_sid> <!-- 標準のレジストリ監視イベントID -->
    <field name="win.eventdata.imagePath">USBSTOR</field>
    <description>USB Storage Device Connected: $(win.system.computer)</description>
    <options>no_full_log</options>
  </rule>
</group>

これにより、従業員が勝手にUSBメモリを挿した瞬間、管理者へ通知を飛ばす運用が可能になります。


運用のアドバイス:通知地獄にならないために

SIEM導入の最大の失敗パターンは、「アラート通知を全ONにしてしまい、メールが大量に来て無視するようになる(オオカミ少年化)」です。

  1. Level 12以上のみ通知: 最初は、Wazuhのアラートレベル「High (12以上)」のみをSlackやメールに通知するように設定しましょう。
  2. ホワイトリストの活用: 業務上必要な夜間バッチ処理などで誤検知する場合、そのルールIDとホスト名の組み合わせを除外設定(ruleset/rules/local_rules.xml)に追加してミュートします。
  3. 週次レビュー: ダッシュボードの「Security events」を週に1回見る時間をカレンダーに入れます。重大ではないが気になる傾向(例えば、特定のユーザーだけログイン失敗が多いなど)がないかを確認します。

Slackへの通知設定:メールは見ないあなたへ

Wazuhはデフォルトでメール通知に対応していますが、今どきの現場ではSlackやTeamsへ通知したいでしょう。Wazuhは標準でSlack連携機能を持っています。

1. Slack Webhook URLの取得

Slack側で Incoming Webhook アプリを追加し、通知先チャンネルのWebhook URL (https://hooks.slack.com/services/...) を取得しておきます。

2. ossec.conf の編集

Wazuhサーバー(Manager)の ossec.conf に以下を追記します。全体設定(<ossec_config>)の中に記述してください。

<integration>
  <name>slack</name>
  <hook_url>https://hooks.slack.com/services/YOUR/WEBHOOK/URL</hook_url>
  <level>10</level>  <!-- レベル10以上のアラートのみ通知 -->
  <alert_format>json</alert_format>
</integration>

3. 日本語での通知メッセージカスタマイズ(上級編)

標準の通知は英語でJSONダンプが送られてくるため、少々見づらいです。 より親切な通知(「緊急!〇〇さんのPCでウイルス検知!」など)を行いたい場合は、Pythonスクリプトによるカスタムインテグレーションを作成するのが一般的です。 Wazuhは /var/ossec/integrations/ 配下にスクリプトを配置することで、アラート発生時に任意のプログラムをキックできます。


まとめ:防御の自給自足を始めよう

セキュリティ予算が潤沢な大企業であれば、すべてをお金で解決するのも一つの正解です。しかし、我々SMBにはその選択肢はありません。だからといって「やらない」という選択肢もまた、ランサムウェアの餌食になることを意味します。

Wazuhは、「無料だから機能が低い」というツールではありません。むしろ、使いこなせれば商用製品以上に柔軟で強力な武器になります。 まずは余っているPCや安価なVPSにDockerを入れて、小さく始めてみてください。自社のネットワークで何が起きているかが「見える」ようになる体験は、一度味わうと手放せなくなるはずです。


AIに相談するためのプロンプト(テンプレート)

Wazuhを導入したものの、「このログ、どういう意味?」「この誤検知、どうやって消すの?」と迷ったときに、AI(ChatGPT/Claude/Gemini)へ的確に質問するためのプロンプトです。

あなたはWazuhとElasticsearchに精通したセキュリティエンジニアです。
現在運用中のWazuhManagerにおいて、意図しないアラートが発生しており、調整を行いたいです。

# 状況
*   特定の正常な業務アプリケーション(App名: HogeBackup)が、定期実行のたびに「異常なファイルアクセス」として検知されてしまいます。
*   検知されているルールID: 554 (File added to the system)

# ログサンプル (JSON)
{
  "timestamp": "2024-01-24T10:00:00.000+0000",
  "rule": {
    "level": 7,
    "description": "File added to the system.",
    "id": "554"
  },
  "agent": {
    "id": "001",
    "name": "FileServer01"
  },
  "syscheck": {
    "path": "/backup/daily/data.zip",
    "event": "added"
  }
}

# 依頼事項
1.  このアラートがなぜ発報されたのか、ログの内容から技術的な根拠を解説してください。
2.  この特定のパス(/backup/配下)に対して、このルールID(554)の発報を抑制するための `local_rules.xml` の記述例(overwriteまたはexclusion設定)を作成してください。
3.  設定を反映させるために必要なコマンド手順を教えてください。