K8sにWazuhをインストールしてセキュアな環境を作る


みなさんこんにちは。
今回はK8sにWazuhというセキュリティソフトをインストールしてセキュアな環境を構築していきたいと思います。

## Wazuhとは

Wazuhとは、OSSのエンドポイントやサーバー、ネットワークなど複数のレイヤから脅威を検出し、分析して自動対処するソフトウェアです。
今回は、我らがデジタル創作サークルUniProjectのネットワークを監視するため、こちらのソフトをインストールします。

https://wazuh.com/

## コンポーネント

Wazuhには4つのコンポーネントがあります。

### Wazuh indexer

ログなどから異常な文字列がないかを探してくれるものです。
結構メモリ食い虫でした。

### Wazuh server

agentから受信したデータを分析します。
何かしらのマルウェアが見つかったりすると警告を出してくれたりします。
中枢ですね。

なお、これはagentから直にデータを受け取るため、負荷が比較的大きいです。
ワーカーを増やしてクラスタを組んだりすることもできます。

### Wazuh dashboard

そのままですね。Webダッシュボードです。

### Wazuh agents

Linuxのみならず、Windows, macOS, Solaris, AIXにインストールできる常駐型のエージェントです。
これがWazuh serverに対してデータを送信しています。

![アーキテクチャ](https://documentation.wazuh.com/current/_images/wazuh-components-and-data-flow1.png)

> 引用元: <https://documentation.wazuh.com/current/getting-started/components/>

## Kustomizeでインストール

では、インストールしてみましょう。
まずはダウンロードしてきます。

```sh
git clone https://github.com/wazuh/wazuh-kubernetes.git -b v4.9.2 --depth=1
cd wazuh-kubernetes
```

次に、SSL証明書を生成します。

```
wazuh/certs/dashboard_http/generate_certs.sh
wazuh/certs/indexer_cluster/generate_certs.sh
```

### ストレージの設定

ここが一番厄介なところですね。
今回はこの記事を参考に、NFSのProvisionerを作成し、そちらを使用しました。

https://qiita.com/Esfahan/items/68e2d97545091cb6d0ac

`envs/local-env/storage-class.yaml`を編集し、microk8sのhostpathになっているところを、`provisioner: nfs-prov`に書き換えます。

### インストール

さて、kustomizeでインストールします。

`kubectl apply -k envs/local-env/`

これでもうすでに動いているはずです。

## ユーザー関連の設定

まずはPodの中に入ります。

```sh
kubectl exec -it wazuh-indexer-0 -n wazuh -- /bin/bash
```

以下のコマンドで、新しく設定するパスワードを打ち込み、ハッシュを取得します。

```sh
export JAVA_HOME=/usr/share/wazuh-indexer/jdk
bash /usr/share/wazuh-indexer/plugins/opensearch-security/tools/hash.sh
```

次に、Podから出て、`wazuh/indexer_stack/wazuh-indexer/indexer_conf/internal_users.yml`を編集します。

```diff-yaml
admin:
+    hash: "$2y$12$K/SpwjtB.wOHJ/Nc6GVRDuc1h0rM1DfvziFRNPtk27P.c4yDr9njO"
    reserved: true
    backend_roles:
    - "admin"
    description: "Demo admin user"
...
kibanaserver:
+    hash: "$2a$12$4AcgAt3xwOWadA5s5blL6ev39OXDNhmOesEoo33eZtrq2N0YrU3H."
    reserved: true
    description: "Demo kibanaserver user"
```

さて、お次はsecretです。

```yaml:wazuh/secrets/indexer-cred-secret.yaml
...
apiVersion: v1
kind: Secret
metadata:
    name: indexer-cred
data:
    username: YWRtaW4=              # string "admin" base64 encoded
    password: U2VjcmV0UGFzc3dvcmQ=  # 新しいPWのbase64エンコードに変える
...
```

```yaml:wazuh/secrets/dashboard-cred-secret.yaml
...
apiVersion: v1
kind: Secret
metadata:
    name: dashboard-cred
data:
    username: a2liYW5hc2VydmVy  # string "kibanaserver" base64 encoded
    password: a2liYW5hc2VydmVy  # 新しいPWのbase64エンコードに変える
```

これで、もう一度デプロイしなおします。

```sh
kubectl apply -k envs/local-env/
```

ここで、Pod側で作業をします。

```shell
kubectl exec -it wazuh-indexer-0 -n wazuh -- /bin/bash
export INSTALLATION_DIR=/usr/share/wazuh-indexer
CACERT=$INSTALLATION_DIR/certs/root-ca.pem
KEY=$INSTALLATION_DIR/certs/admin-key.pem
CERT=$INSTALLATION_DIR/certs/admin.pem
export JAVA_HOME=/usr/share/wazuh-indexer/jdk
bash /usr/share/wazuh-indexer/plugins/opensearch-security/tools/securityadmin.sh -cd /usr/share/wazuh-indexer/opensearch-security/ -nhnv -cacert  $CACERT -cert $CERT -key $KEY -p 9200 -icl -h $NODE_NAME
```

最後に、Podを全て削除し再起動させます。

```shell
kubectl delete -n wazuh pod/wazuh-manager-master-0 pod/wazuh-manager-worker-0 pod/wazuh-manager-worker-1
```

## ダッシュボードにアクセスしてみる

サービスを探してアクセスしてみます。

ログイン情報は先ほど設定したものですね。

![wazuh-home.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3342262/03654f89-fc04-da58-6a29-f80fa56a727b.png)

こんなのが出てくれば成功です！

## agentを入れてみる

さて、agentを入れてみましょう。

Endopoint SummaryのDeploy new agentから行えます。
ここで、好きなOS、環境を選択します。

![wazuh-agent-deploy.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3342262/bb024f83-3a46-3c2c-2c3b-c266eae502e2.png)

Assign a server addressには、マスターのサービスのIPを入れます。
Agent nameは表示名です。
そうすると、下にコマンドが出てくるので、それをコピペして実行します。

これで、agent一覧に出てくれば成功です！！
あとは、ぽんぽん出てくる脆弱性を眺めて「こんな多かったんだぁ」とまったりしてください。

お疲れ様でした！