はじめに
前回、Proxmox 上に IDS(Suricata)を構築して攻撃を監視できるようにしました1。 seekt.hatenablog.com
この環境では、アラートをグラフィカルに表示することができていませんでした。今回は、Elastic Stack 2 を使ってIDSのアラートやリソースの使用率を可視化したので、備忘録を残します。
構築する環境
今回は、前回構築した IDS からログを集約して可視化することを目指します。そのため、前回構築した環境に情報集約/可視化用のVM(図中のElastic VM)を追加し、設定します。
ログの集約と可視化のために、Elastic Stack を使います。ログ収集のための Elastic Agent と、それらを中央管理するための Fleet Server をインストールします。以下図はQiita記事3を参考に、今回の環境におけるイメージを示したものです。
また、今回インストールする機能とインストールするVMを以下表にまとめます。
使う機能 | 用途 | インストールするVM |
---|---|---|
Elasticsearch | データの検索 | Elastic VM |
Kibana | データの可視化 | Elastic VM |
Fleet Server (+ Elastic Agent) | データの集約 | Elastic VM |
Filebeat (+ Elastic Agent) | データの収集 | IDS VM |
実現方法
クラスタを用いた実現
1台の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
Fleet Server のインストール
Qiita記事を参考にインストールします。
Kibana で、Home > Management > Fleet に進み、Add Fleet Server に進みます。Fleet Server host に、http[s]://[IPアドレス]:8220
を指定します。Fleet Server をインストールするコマンドが表示されるので、このコマンドを(今回は Elastic VM で)実行してインストールします。
Elastic Agent のインストール
Kibana で、Home > Add integration に進み、Suricata と検索して、Add Suricata に進みます。
このとき、② で 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]
動作確認
Fleet Server および Elastic Agent をインストール後、Kibana の画面でホストの監視ができています。
また、Suricata のアラートの監視もできるようになりました。
まとめ
今回は、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).
原因と解決策
/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
- 自宅インフラを育てる (6) Proxmoxサーバ上に攻撃と監視をするための環境を構築する - 立ち話↩
- Elastic Stack = Elasticsearch、Kibana、Beats、Logstash | Elastic↩
- [v8.5版] ElasticsearchとKibanaとElastic Agentの最速インストール手順 (試用環境として) - Qiita↩
- Proxmox VEのクラスタ化とマイグレーションをやってみるの巻 - Qiita↩
- Ubuntu 22.04 LTS : Elastic Stack 8 : Elasticsearch インストール : Server World↩
- Elasticsearchへ外部ホストから接続可能にする方法 | ジコログ↩
- Ubuntu 22.04 LTS : Elastic Stack 8 : Kibana インストール : Server World↩
- Ubuntu 22.04 LTS : SSL 証明書を作成する (自己署名) : Server World↩
- fleet-server: x509: certificate signed by unknown authority · Issue #2042 · elastic/elastic-agent · GitHub↩
- System hanging after upgrade...NIC driver? | Proxmox Support Forum↩