Google CloudにWazuhサーバーを構築する

## はじめに
会社でEDRを導入しようとしていくつかのソリューションを比較検討する中で、Open Sourceで構築できるサービスがないかも探してみたところ、Wazuhというサービスがあることを知りました。
検証環境をGoogle Cloud上に構成したので、備忘も兼ねて手順を残します。なお、Google Cloudを使った理由は、会社で使用しているメインのクラウドであることと、自身の勉強のためです。

本記事はGoogle Cloudを扱ったことがある人向けです。Google Cloud初めて触るという場合は、Udemyの以下の講座などで勉強するとよいと思います。

https://www.udemy.com/course/google-cloud-platform-jp/

https://www.udemy.com/course/google-cloud-i/

上のコースは初めてGoogle Cloudを触る人向け、多少触ったことがあるけど理解深めたい場合は下のコースの方が扱う範囲が広くて深いのでオススメです。


## Wazuhとは
一言で言うと、Open SourceのXDR/SIEMソリューションです。

https://wazuh.com/

機能自体はOSSとして無料で使用できるものの、無料とは思えないほど高機能であり、例えば以下のようなことができます。

- ログデータの分析
- 侵入とマルウェアの検出
- ファイルの整合性監視
- 構成評価
- 脆弱性の検出
- 規制コンプライアンスのサポート

Wazuhは以下の4つのコンポーネントから構成されます。

- Agent
- Indexer
- Server
- Dashboard

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2127100/33f1b2c4-9461-ac1f-436e-5741a0caac4f.png)


**Wazuh Agent**はラップトップ、デスクトップ、サーバー、クラウドインスタンス、仮想マシンなどのエンドポイントにインストールされ、脅威の防御、検知、および応答機能を提供します。

**Wazuh Indexer**は拡張性の高い全文検索および分析エンジンで、Elastic Searchで構成されています。Wazuhサーバーによって生成されたアラートにインデックスを付け、保存する役割です。

**Wazuh Server**はエージェントから受信したデータを分析します。脅威インテリジェンスを使用して、よく知られている侵害の指標（IOC）を探すために、デコーダとルールを介してそれを処理します。1台のサーバーで数百、数千のエージェントからのデータを分析でき、クラスタとしてセットアップすれば水平方向に拡張することも可能です。また、エージェントの管理にも使用され、必要に応じてリモートで設定やアップグレードを行う。

**Wazuh Dashboard**はデータの可視化と分析のためのウェブユーザーインターフェイスで、Kibanaで構成されています。セキュリティイベント、規制コンプライアンス（PCI DSS、GDPR、CIS、HIPAA、NIST 800-53など）、検出された脆弱なアプリケーション、ファイル整合性監視データ、構成評価結果、クラウドインフラ監視イベントなど、すぐに使えるダッシュボードが用意されています。また、Wazuhの構成を管理し、その状態を監視するためにも使用されます。


## Wazuhサーバー構築
Google Cloud上にVMインスタンスを作成し、そこでWazuhを動かすことにします。Wazuhはdockerイメージも公式が用意しているので、Cloud Runとかで作成してもよいかもしれません（検証では試さなかった）。
なお、AWS上にVMインスタンスで構築する場合は公式のVMイメージが用意されているので、それをデプロイすればサクッと環境構築できるようです。

### 前提
今回はサクッと検証するためにVMインスタンス自体に外部IPを持たせます。本番運用する場合は、専用のVPCネットワークを構築してVMインスタンスやロードバランサを囲うサブネットを構築すべきでしょう。
また、single-nodeとmulti-nodeで構築可能ですが、今回はsingle-nodeです。

### VPCネットワーク
VMインスタンスで利用するネットワークを用意します。既存のものを利用しても構いませんが、今回は専用で作りました。

| | |
|---|---|
| **ネットワーク名** | wazuh-network |
| **サブネット作成モード** | 自動 |
| **動的ルーティングモード** | リージョン |
| **MTU** | 1460 |

次にWazuhの通信に必要なファイアウォールルールを追加します。こちらは既存ネットワークを使う場合も必要です。以下の3つを追加します。

- Indexerとの通信

| | |
|---|---|
| **ルール名** | wazuh-indexer-communication |
| **ネットワーク** | wazuh-network |
| **トラフィックの方向** | 上り |
| **送信元IPv4範囲** | 0.0.0.0/0 |
| **プロトコル** | TCP |
| **ポート** | 9200 |

- AgentからServerへのコミュニケーション

| | |
|---|---|
| **ルール名** | wazuh-agent-communication |
| **ネットワーク** | wazuh-network |
| **トラフィックの方向** | 上り |
| **送信元IPv4範囲** | 0.0.0.0/0 |
| **プロトコル** | TCP |
| **ポート** | 1514 |

- ServerへAgentインストールしたエンドポイントをEnrollmentする

| | |
|---|---|
| **ルール名** | wazuh-agent-enrollment |
| **ネットワーク** | wazuh-network |
| **トラフィックの方向** | 上り |
| **送信元IPv4範囲** | 0.0.0.0/0 |
| **プロトコル** | TCP |
| **ポート** |1515 |



### Compute Engine
Wazuhを構築するVMインスタンスを作成します。必要スペックは下図の通りですが、検証目的なので最小エージェント数で見積もればよいでしょう。90日も動かさないのでストレージも最小限で十分です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2127100/4c9f28c0-3fbc-bed3-3840-31ab394cfed5.png)

以下の構成としました。

| | |
|---|---|
| **インスタンス名** | wazuh-test |
| **リージョン** | asia-northeast1 |
| **ゾーン** | asia-northeast1-b |
| **マシン構成** | 汎用、Series N2D、カスタムマシン（4 vCPU、8 GB） |
| **ブートディスク** | CentOS 7、20GB |
| **アクセススコープ** | デフォルト |
| **ファイアウォール** | HTTP, HTTPSトラフィックを許可 |
| **IPv4アドレス** | 内部外部共にエフェメラル |

VMインスタンスが準備できたらSSHし、各コンポーネントをインストールしていきます。

### Wazuh Indexerのインストール
基本的には以下の手順で順番に進めていけばOKです。

https://documentation.wazuh.com/current/installation-guide/wazuh-indexer/step-by-step.html

ただし、Google CloudのCentOS 7にはOpenSSLがインストールされていないので、まずはそちらが必要です。[Update OpenSSL to 3.0 on CentOS7](https://dev.to/nikolastojilj12/update-openssl-to-3-0-on-centos7-150o) などを参考に、最新のOpenSSLをインストールしましょう。

注意事項として、証明書作成時に使う `config.yml` と、Indexerの設定変更をする `/etc/wazuh-indexer/opensearch.yml` において、IP addressの値はVMの内部IPにする必要があります。また、single-nodeであってもCluster initializationの手順を実施しないとWazuh Serverのインストールを進められなくなります。

### Wazuh Serverのインストール
基本的には以下の手順で順番に進めていけばOKです。

https://documentation.wazuh.com/current/installation-guide/wazuh-server/step-by-step.html

ここでの注意事項としては、Filebeatの設定ファイル `/etc/filebeat/filebeat.yml` においてindexer nodeのIPアドレスは内部IPとなります。ここを外部IPにすると `filebeat test output` でエラーが発生します。

### Wazuh Dashuboardのインストール
以下の手順で順番に進めていけばOKです。特に詰まるポイントはないと思います。

https://documentation.wazuh.com/current/installation-guide/wazuh-dashboard/step-by-step.html

Dashboardを起動することでVMの外部IPでWazuhのダッシュボードにアクセスできるようになりますが、Dashboardのインストール手順にも記載のあるように、最低限デフォルト認証情報は変更しておきましょう。
変更後のパスワードでログインすれば、以下のようにWazuh Dashboardへアクセスできます。Wazuhの世界へようこそ！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2127100/b9bed483-3e32-ccc7-53ee-3643c4424141.png)


## おわりに
これはクイックに検証用環境を作成する方法なので、本番環境で動かす場合はもっとセキュリティを意識した構成が必要となるでしょう。
Wazuhはとてつもなく機能が豊富なので使いこなすのは大変ですが、色々可能性を感じるので色々と機能を触ってみたいですね。