立ち話

興味があることを書いてます。正確な内容は公式ドキュメントや参考文献を確認してください。ブログに示された意見はすべて個人の見解であり、所属する組織の公式見解ではありません。

自宅インフラを育てる (7) ElasticsearchとKibanaとElastic Agentを使ってIDS(Suricata)のアラートを可視化する

はじめに

前回、Proxmox 上に IDS(Suricata)を構築して攻撃を監視できるようにしました1seekt.hatenablog.com

この環境では、アラートをグラフィカルに表示することができていませんでした。今回は、Elastic Stack 2 を使ってIDSのアラートやリソースの使用率を可視化したので、備忘録を残します。

構築する環境

今回は、前回構築した IDS からログを集約して可視化することを目指します。そのため、前回構築した環境に情報集約/可視化用のVM(図中のElastic VM)を追加し、設定します。

構築する環境の論理構成

ログの集約と可視化のために、Elastic Stack を使います。ログ収集のための Elastic Agent と、それらを中央管理するための Fleet Server をインストールします。以下図はQiita記事3を参考に、今回の環境におけるイメージを示したものです。

Fleet Server と Elastic Agent のイメージ

また、今回インストールする機能とインストールするVMを以下表にまとめます。

使う機能 用途 インストールするVM
Elasticsearch データの検索 Elastic VM
Kibana データの可視化 Elastic VM
Fleet Server (+ Elastic Agent) データの集約 Elastic VM
Filebeat (+ Elastic Agent) データの収集 IDS VM

実現方法

クラスタを用いた実現

1台のProxmoxサーバで実現するにはリソースの限界があったので、Proxmox のクラスタを用いてリソースを分散することで実現しました。

Proxmox のクラスタ

クラスタの設定については、Qiita記事4などが参考になります(ここでは詳細な設定は書きません)。クラスタ設定中に Proxmox サーバにアクセスできなくなる事象が発生したので、そのトラブルシューティングについて付録に書きます。

物理構成

クラスタ構築後の物理構成を以下図に示します。「Proxmoxサーバ (1)」がもともと使用していたProxmoxサーバ、「Proxmoxサーバ (2)」が追加したサーバです。追加したサーバは、20,000円程度のミニPCです。

Home-net は、インターネット接続可能なネットワーク、Internal-net は、外部接続しないネットワークです。

物理構成

また、ネットワーク構成について以下図に示します。この構成にすると、Attacker と Target の間の通信を IDS でキャプチャできます。

ネットワーク構成

環境構築

Elastic VM も IDS VM も Ubuntu22(Server)とします。

Elasticsearch のインストールと設定

Server World記事5を参考にインストールします。

# wget -O - https://artifacts.elastic.co/GPG-KEY-elasticsearch | gpg --dearmor -o /etc/apt/keyrings/elasticsearch-keyring.gpg
# echo "deb [signed-by=/etc/apt/keyrings/elasticsearch-keyring.gpg] https://artifacts.elastic.co/packages/8.x/apt stable main" | tee /etc/apt/sources.list.d/elastic-8.x.list
# apt update
# apt -y install elasticsearch

インストールしたときに Elastic のパスワードが自動生成されるので、メモしておきます。

外部ホストから接続可能にする形で設定ファイル(/etc/elasticsearch/elasticsearch.yml)を編集します。ここでは、Elasticsearch のクラスタを作らない形で設定します6

network.host: 0.0.0.0
discovery.type: single-node

クラスタを作らない場合は、cluster.initial_master_nodesコメントアウトしないと起動時にエラーが出るので、注意します。

インストール確認

以下コマンドで Elasticsearch を起動します。

# systemctl daemon-reload
# systemctl start elasticsearch
# systemctl enable elasticsearch

起動した状態で、Elasticsearch にアクセスできるか確認します。

# curl -u elastic --cacert /etc/elasticsearch/certs/http_ca.crt https://127.0.0.1:9200

パスワードを入力して以下のような出力が得られれば問題なく起動しています。

{
  "name" : "kibana",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "lHm2fMPYSSedysg9mZjMKg",
  "version" : {
    "number" : "8.10.2",
    "build_flavor" : "default",
    "build_type" : "deb",
    "build_hash" : "6d20dd8ce62365be9b1aca96427de4622e970e9e",
    "build_date" : "2023-09-19T08:16:24.564900370Z",
    "build_snapshot" : false,
    "lucene_version" : "9.7.0",
    "minimum_wire_compatibility_version" : "7.17.0",
    "minimum_index_compatibility_version" : "7.0.0"
  },
  "tagline" : "You Know, for Search"
}

Kibana のインストール

Server World記事7を参考にインストールします。

SSL証明書を作成してからインストールします。ここでは、自己署名を用いる場合の手順をまとめます8

# nano /etc/ssl/openssl.cnf

末尾に以下を追加します。

[vis]
subjectAltName = DNS:vis.pve.uranus

ただし、セクション名([vis])は任意で、= の後は、DNS:[自分のホスト名] とします。

証明書作成のために以下コマンドを実行します。

# cd /etc/ssl/private
# openssl genrsa -aes128 2048 > server.key
# openssl rsa -in server.key -out server.key
# openssl req -utf8 -new -key server.key -out server.csr
# openssl x509 -in server.csr -out server.crt -req -signkey server.key -extfile /etc/ssl/openssl.cnf -extensions [セクション名] -days 3650
# chmod 600 server.key

証明書作成後、Kibana をインストールします。

# apt -y install kibana
# cp /etc/ssl/private/{server.crt,server.key} /etc/kibana/
# chown kibana:kibana /etc/kibana/{server.crt,server.key}

インストール後は Kibana 用のトークンを発行し、Kibanaをセットアップします。

# /usr/share/elasticsearch/bin/elasticsearch-create-enrollment-token -s kibana
# /usr/share/kibana/bin/kibana-setup --enrollment-token \
[生成されたトークン]

また、Kibana の設定ファイル(/etc/kibana/kibana.yml)を以下のように編集します。

server.host: "0.0.0.0"
server.publicBaseUrl: "https://[hostname]:5601/"
server.name: "[hostname]"
server.ssl.enabled: true
server.ssl.certificate: /etc/kibana/server.crt
server.ssl.key: /etc/kibana/server.key

インストール確認

Kibana を起動し、http[s]://[IPアドレス]:5601 にアクセスします。

# systemctl enable kibana
# systemctl start kibana

Kibana

Fleet Server のインストール

qiita.com

Qiita記事を参考にインストールします。

Kibana で、Home > Management > Fleet に進み、Add Fleet Server に進みます。Fleet Server host に、http[s]://[IPアドレス]:8220 を指定します。Fleet Server をインストールするコマンドが表示されるので、このコマンドを(今回は Elastic VM で)実行してインストールします。

Fleet Server のインストール

Elastic Agent のインストール

Kibana で、Home > Add integration に進み、Suricata と検索して、Add Suricata に進みます。

Add Suricata Integration

このとき、② で New hosts を選択し、Save and Continue すると、Fleet に Agent policy が追加されます。追加された状態で、Home > Management > Fleet に進み、Add agent に進みます。① で agent policy を選択し、② で Enroll in Fleet を選択すると、③ にインストールコマンドが表示されるので、このコマンドを(今回は IDS VM)で実行します。

ただし、証明書のエラーが出るので、--insecure オプションを追加して実行します9

$ sudo ./elastic-agent install --insecure --url=[Fleet url] --enrollment-token=[token]

Add agent

動作確認

Fleet Server および Elastic Agent をインストール後、Kibana の画面でホストの監視ができています。

ホストの監視

また、Suricata のアラートの監視もできるようになりました。

Kibana を使った Suricata のアラートの監視

Kibana 上でアラートの管理

まとめ

今回は、Proxmox サーバのノードを増やして、Elastic Stack を使って IDS アラートを監視する基盤を作ってみました。今回詰まった部分は ChatGPT に質問しながら進めました。

今後は NAS を導入したいです。

付録:Proxmox サーバにアクセスできなくなったことに関するトラブルシューティング

事象

クラスタ設定中、Proxmox サーバ(uranus)にリモートからアクセスできなくなり、以下のようなログが出ていました。

r8169 0000:02:00.0 enp2s0: rtl_chipcmd_cond == 1 (loop: 100, delay: 100).
r8169 0000:02:00.0 enp2s0: rtl_ephyar_cond == 1 (loop: 100, delay: 10).
r8169 0000:02:00.0 enp2s0: rtl_eriar_cond == 1 (loop: 100, delay: 100).

原因と解決策

カーネルのバージョンの問題らしいです10

/etc/apt/sources.list

deb http://download.proxmox.com/debian/pve bullseye pve-no-subscription

を追加し、以下コマンドを実行すると解決しました。

# apt update
# apt install pve-kernel-5.15.108-1-pve
# proxmox-boot-tool kernel pin 5.15.108-1-pve
# reboot