前提条件
1.Suricata
SURICATA IDS/IPSはネットワーク上の通信を監視し、不審なトラフィックを検知するオープンソースのIDSです。基本的な仕組みはシグネチャ型であるため、あらかじめ設定した不正な通信を検知できます。また、Suricataは検知だけでなく防御も行えることが特徴です。
2.Elastic Stack,Kibana,Filebeat
Elastic Stackをインストール&設定して、Kibana,Filebeatを使用してSURICATAのログを可視化&検索できるようにする
今回はSuricata IDS と ElasticStack を 次のサーバーにインストールします
・1台目サーバー Suricata IDS & Filebeat : Slackware15.0 IPアドレス(192.168.11.83)
・2台目サーバー Elasticsearch & kibana : Slackware15.0 IPアドレス(192.168.11.85)
1台目サーバー : Suricata インストール
1.Rust等必須パッケージのインストール
Slackware15では標準で1.58がインストールされるのでRust 1.75をインストールします
# curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
実行すると、インストールオプションを尋ねるメニューが表示されます。
1) Proceed with standard installation (default - just press enter))
2) Customize installation
3) Cancel installation
>デフォルトである 1 を入力
# source "$HOME/.cargo/env"
# rustup toolchain install 1.75
# rustup default 1.75
バージョン確認
# rustc --version
rustc 1.75.0 (82e1608df 2023-12-21)
# cargo --version
cargo 1.75.0 (1d8b05cdd 2023-11-20)
# slackpkg install libnfnetlink
# slackpkg install libnetfilter_queue
2.Suricata のインストールと設定
2.1 ダウンロード
# wget https://www.openinfosecfoundation.org/download/suricata-8.0.6.tar.gz
# tar -xvzf suricata-8.0.6.tar.gz
# cd suricata-8.0.6
2.2 インストール
必要なオプションを指定してconfigureを実行
# ./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var --enable-nfqueue
コンパイル
# make
インストール実行
# make install-full
バージョンチェック
# suricata -V
This is Suricata version 8.0.6 RELEASE
2.3 Suricataがネットワークパケットを検査するインターフェースとIPアドレス
# ip --brief add
lo UNKNOWN 127.0.0.1/8 ::1/128
eth0 UP 192.168.11.83/24 fe80::20c:29ff:fe31:b405/64
2.4 設定ファイルを編集
# vi /etc/suricata/suricata.yaml
18行目 : コメントアウトしてその下に追加(varsセクションで、ネットワークを定義する)
#HOME_NET: "[192.168.0.0/16,10.0.0.0/8,172.16.0.0/12]"
HOME_NET: "[192.168.11.0/24]"
158行目あたり : 変更
community-id: false → community-id: true
661行目あたり : af-packetセクションのインターフェース名を設定
af-packet:
- interface: eth0
2.5 Suricataのルール更新
# suricata-update
2.6 Suricataの起動
起動スクリプトの作成
# vi /etc/rc.d/rc.suricata
#!/bin/sh
#
# /etc/rc.d/rc.suricata
#
# Suricata Start/Stop Scripts for Slackware 15.0
#
# Network Interface to Use
INTERFACE="eth0"
# Configuring Various Paths (Please adjust according to your environment)
SURICATA_BIN="/usr/bin/suricata"
SURICATA_CONF="/etc/suricata/suricata.yaml"
PID_FILE="/var/run/suricata.pid"
# Option Settings
OPTIONS="-D -c $SURICATA_CONF --af-packet=$INTERFACE --pidfile $PID_FILE"
suricata_start() {
if [ -s $PID_FILE ]; then
if ps -p $(cat $PID_FILE) > /dev/null 2>&1; then
echo "Suricata is already running."
return
fi
fi
if [ -x $SURICATA_BIN ]; then
echo "Starting Suricata ($INTERFACE)..."
$SURICATA_BIN $OPTIONS
else
echo "Error: $SURICATA_BIN cannot be found, or you do not have permission to run it."
fi
}
suricata_stop() {
if [ -s $PID_FILE ]; then
PID=$(cat $PID_FILE)
echo "Suricata を停止中 (PID: $PID)..."
kill $PID
#Wait a moment until it comes to a complete stop
while ps -p $PID > /dev/null 2>&1; do sleep 1; done
rm -f $PID_FILE
else
echo "Suricata is not running (the PID file cannot be found)."
fi
}
suricata_restart() {
suricata_stop
sleep 1
suricata_start
}
suricata_status() {
if [ -s $PID_FILE ]; then
PID=$(cat $PID_FILE)
if ps -p $PID > /dev/null 2>&1; then
echo "Suricata is running (PID: $PID)。"
else
echo "Suricata has stopped, but the old PID file remains."
fi
else
echo "Suricata is stopped."
fi
}
case "$1" in
'start')
suricata_start
;;
'stop')
suricata_stop
;;
'restart')
suricata_restart
;;
'status')
suricata_status
;;
*)
echo "How to Use: $0 {start|stop|restart|status}"
exit 1
esac
# chmod +x /etc/rc.d/rc.suricata
# /etc/rc.d/rc.suricata start
統計情報を確認するには、stats.log ファイルを確認します(デフォルトで8秒ごとに更新)
# tail -f /var/log/suricata/stats.log
より高度な出力であるEVE JSONは、以下のコマンドで生成することができる
# tail -f /var/log/suricata/eve.json
2.7 ルールセットを追加
Suricata には suricata-update というツールがあり、外部プロバイダーからルールセットを取得することができます。以下のように実行すると、SURICATAサーバーの最新のルールセットをダウンロードできます
# suricata-update -o /var/lib/suricata/rules
-------------------------------------------------------------
17/9/2026 -- 12:19:44 - <Info> -- Ignoring file f625293e2432dbf07497d06349de6f0b/rules/emerging-deleted.rules
17/9/2026 -- 12:19:45 - <Info> -- Loaded 68724 rules.
17/9/2026 -- 12:19:46 - <Info> -- Disabled 15 rules.
17/9/2026 -- 12:19:46 - <Info> -- Enabled 0 rules.
17/9/2026 -- 12:19:46 - <Info> -- Modified 0 rules.
17/9/2026 -- 12:19:46 - <Info> -- Dropped 0 rules.
17/9/2026 -- 12:19:46 - <Info> -- Enabled 136 rules for flowbit dependencies.
17/9/2026 -- 12:19:46 - <Info> -- Backing up current rules.
17/9/2026 -- 12:19:46 - <Info> -- Writing rules to /var/lib/suricata/rules/suricata.rules: total: 68724; enabled: 52770; added: 68724; removed 0; modified: 0
17/9/2026 -- 12:19:46 - <Info> -- Writing /var/lib/suricata/rules/classification.config
17/9/2026 -- 12:19:46 - <Info> -- Testing with suricata -T.
17/9/2026 -- 12:20:15 - <Info> -- Done.
suricata-updateが無料のEmerging Threats ET Open Rulesを取得し、Suricataの/etc/suricata/rules/suricata.rulesファイルに保存したことを示しています。また、処理されたルールの数を示し、この例では68724が追加され、そのうち52770が有効になりました。
2.8 ルール・セット・プロバイダーの追加
既定のプロバイダー リストを一覧表示
# suricata-update list-sources
Name: abuse.ch/feodotracker
Vendor: Abuse.ch
Summary: Abuse.ch Feodo Tracker Botnet C2 IP ruleset
License: CC0-1.0
Name: abuse.ch/sslbl-blacklist
Vendor: Abuse.ch
Summary: Abuse.ch SSL Blacklist
License: CC0-1.0
Replaces: sslbl/ssl-fp-blacklist
Name: abuse.ch/sslbl-c2
Vendor: Abuse.ch
Summary: Abuse.ch Suricata Botnet C2 IP Ruleset
License: CC0-1.0
Name: abuse.ch/sslbl-ja3
Vendor: Abuse.ch
Summary: Abuse.ch Suricata JA3 Fingerprint Ruleset
License: CC0-1.0
Replaces: sslbl/ja3-fingerprints
Name: abuse.ch/urlhaus
Vendor: abuse.ch
Summary: Abuse.ch URLhaus Suricata Rules
License: CC0-1.0
Name: aleksibovellan/nmap
Vendor: aleksibovellan
Summary: Suricata IDS/IPS Detection Rules Against NMAP Scans
License: MIT
Name: et/open
Vendor: Proofpoint
Summary: Emerging Threats Open Ruleset
License: MIT
Name: et/pro
Vendor: Proofpoint
Summary: Emerging Threats Pro Ruleset
License: Commercial
Replaces: et/open
Parameters: secret-code
Subscription: https://www.proofpoint.com/us/threat-insight/et-pro-ruleset
Name: etnetera/aggressive
Vendor: Etnetera a.s.
Summary: Etnetera aggressive IP blacklist
License: MIT
Name: oisf/trafficid
Vendor: OISF
Summary: Suricata Traffic ID ruleset
License: MIT
Name: pawpatrules
Vendor: pawpatrules
Summary: PAW Patrules is a collection of rules for IDPS / NSM Suricata engine
License: CC-BY-SA-4.0
Name: ptrules/open
Vendor: Positive Technologies
Summary: Positive Technologies Open Ruleset
License: Custom
Name: scwx/enhanced
Vendor: Secureworks
Summary: Secureworks suricata-enhanced ruleset
License: Commercial
Parameters: secret-code
Subscription: https://www.secureworks.com/contact/ (Please reference CTU Countermeasures)
Name: scwx/malware
Vendor: Secureworks
Summary: Secureworks suricata-malware ruleset
License: Commercial
Parameters: secret-code
Subscription: https://www.secureworks.com/contact/ (Please reference CTU Countermeasures)
Name: scwx/security
Vendor: Secureworks
Summary: Secureworks suricata-security ruleset
License: Commercial
Parameters: secret-code
Subscription: https://www.secureworks.com/contact/ (Please reference CTU Countermeasures)
Name: stamus/lateral
Vendor: Stamus Networks
Summary: Lateral movement rules
License: GPL-3.0-only
Name: stamus/nrd-14-open
Vendor: Stamus Networks
Summary: Newly Registered Domains Open only - 14 day list, complete
License: Commercial
Parameters: secret-code
Subscription: https://www.stamus-networks.com/stamus-labs/subscribe-to-threat-intel-feed
Name: stamus/nrd-30-open
Vendor: Stamus Networks
Summary: Newly Registered Domains Open only - 30 day list, complete
License: Commercial
Parameters: secret-code
Subscription: https://www.stamus-networks.com/stamus-labs/subscribe-to-threat-intel-feed
Name: stamus/nrd-entropy-14-open
Vendor: Stamus Networks
Summary: Newly Registered Domains Open only - 14 day list, high entropy
License: Commercial
Parameters: secret-code
Subscription: https://www.stamus-networks.com/stamus-labs/subscribe-to-threat-intel-feed
Name: stamus/nrd-entropy-30-open
Vendor: Stamus Networks
Summary: Newly Registered Domains Open only - 30 day list, high entropy
License: Commercial
Parameters: secret-code
Subscription: https://www.stamus-networks.com/stamus-labs/subscribe-to-threat-intel-feed
Name: stamus/nrd-phishing-14-open
Vendor: Stamus Networks
Summary: Newly Registered Domains Open only - 14 day list, phishing
License: Commercial
Parameters: secret-code
Subscription: https://www.stamus-networks.com/stamus-labs/subscribe-to-threat-intel-feed
Name: stamus/nrd-phishing-30-open
Vendor: Stamus Networks
Summary: Newly Registered Domains Open only - 30 day list, phishing
License: Commercial
Parameters: secret-code
Subscription: https://www.stamus-networks.com/stamus-labs/subscribe-to-threat-intel-feed
Name: tgreen/hunting
Vendor: tgreen
Summary: Threat hunting rules
License: GPLv3
例としてtgreen/hunting ルールセットを含める場合
# suricata-update enable-source tgreen/hunting
19/9/2026 -- 09:43:26 - <Info> -- Using data-directory /var/lib/suricata.
19/9/2026 -- 09:43:26 - <Info> -- Using Suricata configuration /etc/suricata/suricata.yaml
19/9/2026 -- 09:43:26 - <Info> -- Using /usr/share/suricata/rules for Suricata provided rules.
19/9/2026 -- 09:43:26 - <Info> -- Found Suricata version 8.0.6 at /usr/bin/suricata.
19/9/2026 -- 09:43:26 - <Warning> -- Source index does not exist, will use bundled one.
19/9/2026 -- 09:43:26 - <Warning> -- Please run suricata-update update-sources.
19/9/2026 -- 09:43:26 - <Info> -- Creating directory /var/lib/suricata/update/sources
19/9/2026 -- 09:43:26 - <Info> -- Enabling default source et/open
19/9/2026 -- 09:43:26 - <Info> -- Source tgreen/hunting enabled
アップデートを実行
# suricata-update update-sources
3.Suricata 構成のテスト
3.1 設定ファイルのテスト
# suricata -T -c /etc/suricata/suricata.yaml -v
Notice: suricata: This is Suricata version 8.0.6 RELEASE running in SYSTEM mode
Info: cpu: CPUs/cores online: 2
Info: suricata: Running suricata under test mode
Info: suricata: Setting engine mode to IDS mode by default
Info: exception-policy: master exception-policy set to: auto
Info: suricata: Preparing unexpected signal handling
Info: logopenfile: fast output device (regular) initialized: fast.log
Info: logopenfile: eve-log output device (regular) initialized: eve.json
Info: logopenfile: stats output device (regular) initialized: stats.log
Info: detect: 1 rule files processed. 52823 rules successfully loaded, 0 rules failed, 0 rules skipped
Info: threshold-config: Threshold config parsed: 0 rule(s) found
Info: detect: 52828 signatures processed. 1229 are IP-only rules, 4534 are inspecting packet payload, 46829 inspect application layer, 110 are decoder event only
Notice: suricata: Configuration provided was successfully loaded. Exiting.
Suricata service再起動
# /etc/rc.d/rc.suricata restart
ログファイルを確認
# tail -f /var/log/suricata/suricata.log
[16572 - Suricata-Main] 2026-09-19 09:45:25 Info: logopenfile: fast output device (regular) initialized: fast.log
[16572 - Suricata-Main] 2026-09-19 09:45:25 Info: logopenfile: eve-log output device (regular) initialized: eve.json
[16572 - Suricata-Main] 2026-09-19 09:45:25 Info: logopenfile: stats output device (regular) initialized: stats.log
[16572 - Suricata-Main] 2026-09-19 09:45:27 Info: detect: 1 rule files processed. 52823 rules successfully loaded, 0 rules failed, 0 rules skipped
[16572 - Suricata-Main] 2026-09-19 09:45:27 Info: threshold-config: Threshold config parsed: 0 rule(s) found
[16572 - Suricata-Main] 2026-09-19 09:45:27 Info: detect: 52828 signatures processed. 1229 are IP-only rules, 4534 are inspecting packet payload, 46829 inspect application layer, 110 are decoder event only
[16572 - Suricata-Main] 2026-09-19 09:45:31 Info: unix-manager: unix socket '/var/run/suricata/suricata-command.socket'
[16572 - Suricata-Main] 2026-09-19 09:45:31 Info: runmodes: eth0: creating 2 threads
[16574 - W#01-eth0] 2026-09-19 09:45:31 Info: ioctl: eth0: MTU 1500
[16572 - Suricata-Main] 2026-09-19 09:45:32 Notice: threads: Threads created -> W: 2 FM: 1 FR: 1 Engine started.
4.Suricata Custom Rulesを作成し、テストする
4.1 カスタマールールを含むファイルを作成
# vi /var/lib/suricata/rules/local.rules
下記内容を記載
alert icmp any any -> any any (msg:"ICMP Ping"; sid:100001; rev:1;)
4.2 設定ファイルを編集(新しいルールのパスを定義)
# vi /etc/suricata/suricata.yaml
# 2333行目あたりに追記
default-rule-path: /var/lib/suricata/rules
rule-files:
- suricata.rules
- local.rules
4.3 設定ファイルのテスト
# suricata -T -c /etc/suricata/suricata.yaml -v
Notice: suricata: This is Suricata version 8.0.6 RELEASE running in SYSTEM mode
Info: cpu: CPUs/cores online: 2
Info: suricata: Running suricata under test mode
Info: suricata: Setting engine mode to IDS mode by default
Info: exception-policy: master exception-policy set to: auto
Info: suricata: Preparing unexpected signal handling
Info: logopenfile: fast output device (regular) initialized: fast.log
Info: logopenfile: eve-log output device (regular) initialized: eve.json
Info: logopenfile: stats output device (regular) initialized: stats.log
Info: detect: 2 rule files processed. 52824 rules successfully loaded, 0 rules failed, 0 rules skipped
Info: threshold-config: Threshold config parsed: 0 rule(s) found
Info: detect: 52829 signatures processed. 1230 are IP-only rules, 4534 are inspecting packet payload, 46829 inspect application layer, 110 are decoder event only
Notice: suricata: Configuration provided was successfully loaded. Exiting.
Suricat service再起動
# /etc/rc.d/rc.suricata restart
4.4 Custom Rulesの適用テスト
同一ローカルネットワーク上の別のデバイスでpingを実行し、ログに記録されたかどうかを確認する
# cat /var/log/suricata/fast.log
09/19/2026-09:48:54.822402 [**] [1:100000:1] ICMP Ping [**] [Classification: (null)] [Priority: 3] {ICMP} 192.168.11.14:8 -> 192.168.11.83:0
09/19/2026-09:48:54.822426 [**] [1:100000:1] ICMP Ping [**] [Classification: (null)] [Priority: 3] {ICMP} 192.168.11.83:0 -> 192.168.11.14:0
JSON形式のログを取得するには、システムにjqをインストールする
# wget -O /usr/local/bin/jq https://github.com/jqlang/jq/releases/download/jq-1.8.2/jq-linux-amd64
# chmod +x /usr/local/bin/jq
# jq --version
jq-1.8.2
下記コマンドを実行し、同一ローカルネットワーク上の別のデバイスでpingを実行する
# tail -f /var/log/suricata/eve.json | jq 'select(.event_type=="alert")'
pingを実行するとコンソールに下記のように表示される
{
"timestamp": "2026-09-19T10:19:57.095039+0900",
"flow_id": 1533994348757840,
"in_iface": "eth0",
"event_type": "alert",
"src_ip": "192.168.11.83",
"dest_ip": "192.168.11.14",
"proto": "ICMP",
"ip_v": 4,
"icmp_type": 0,
"icmp_code": 0,
"pkt_src": "wire/pcap",
"community_id": "1:K09ijpWpwrp7sSrxOGACqhHkilo=",
"alert": {
"action": "allowed",
"gid": 1,
"signature_id": 100001,
"rev": 1,
"signature": "ICMP Ping",
"category": "",
"severity": 3
},
5.SURICATAを再設定し、IPSモードで再起動する
SURICATAはデフォルトではIDSモードで動作し、積極的にネットワークトラフィックをブロックすることはありません。IPSモードに切り替えるには、SURICATAのデフォルト設定を変更する必要がある。
5.1 nfqueueモードの有効化
# vi /etc/rc.d/rc.suricata
下記のとおり変更する
#OPTIONS="-D -c $SURICATA_CONF --af-packet=$INTERFACE --pidfile $PID_FILE"
OPTIONS="-D -q 0 -c $SURICATA_CONF --pidfile $PID_FILE"
設定をリロードして、suricataを再起動
# /etc/rc.d/rc.suricata restart
5.2 Suricataにトラフィックを送信するためのUFWの設定
# vi /etc/ufw/before.rules
19行目に下記を追加
# Don't delete these required lines, otherwise there will be errors
*filter
:ufw-before-input - [0:0]
:ufw-before-output - [0:0]
:ufw-before-forward - [0:0]
:ufw-not-local - [0:0]
# End required lines
## Start Suricata NFQUEUE rules
-I INPUT 1 -p tcp --dport 22 -j NFQUEUE --queue-bypass
-I OUTPUT 1 -p tcp --sport 22 -j NFQUEUE --queue-bypass
-I FORWARD -j NFQUEUE
-I INPUT 2 -j NFQUEUE
-I OUTPUT 2 -j NFQUEUE
## End Suricata NFQUEUE rules
IPv6も同様に下記ファイルを編集する
# vi /etc/ufw/before6.rules
UFWサービスを再起動する
# /etc/rc.d/rc.ufw restart
Elasticsearch
2台目のSlackware15.0 IP (192.168.11.85)で作業します
1. OpenJDKインストール
ElasticsearchにはOpenJDKが必要ですのでインストールしておきます
インストール方法については下記ページを参考にしてください
2. 専用のユーザーとグループの作成
Elasticsearch はセキュリティ上の理由から root ユーザーでは起動できません。専用の elasticsearch ユーザーを作成します。
グループの作成 (GIDは空いているものを適宜指定)
# groupadd -g 252 elasticsearch
ユーザーの作成
# useradd -u 252 -g elasticsearch -d /usr/share/elasticsearch -s /bin/false elasticsearch
3. アーカイブのダウンロードと解凍
公式の Linux x86_64 用のアーカイブをダウンロードし、/usr/share などに配置します。
# cd /tmp
# wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.19.12-linux-x86_64.tar.gz
解凍して配置
# tar -xzf elasticsearch-8.19.12-linux-x86_64.tar.gz
# mv elasticsearch-8.19.12 /usr/share/elasticsearch
所有権を elasticsearch ユーザーに変更
# chown -R elasticsearch:elasticsearch /usr/share/elasticsearch
4. ディレクトリの作成
ログやデータ、設定ファイルを置くためのディレクトリを個別に管理したい場合は作成し、権限を付与します。
# mkdir -p /var/log/elasticsearch /var/lib/elasticsearch /etc/elasticsearch
初期設定ファイルをコピー
# cp -R /usr/share/elasticsearch/config/* /etc/elasticsearch/
# chown -R elasticsearch:elasticsearch /var/log/elasticsearch /var/lib/elasticsearch /etc/elasticsearch
5.設定ファイル編集 (elasticsearch.yml)
/etc/elasticsearch/elasticsearch.yml を編集し、基本的な設定を行います。
# vi /etc/elasticsearch/elasticsearch.yml
パスの指定
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
ネットワーク設定
network.host: 192.168.11.85
http.port: 9200
シングルノードでの起動の場合 (検証環境など)
discovery.type: single-node
# 8.x以降、デフォルトで有効になるセキュリティ(TLS/認証)を一時的にテストするため無効化したい場合は以下(本番は推奨しません)
xpack.security.enabled: false
6.起動スクリプトの作成(Slackware方式)
事前に下記ディレクトリー作成
# mkdir /var/run/elasticsearch
# chown -R elasticsearch:elasticsearch /var/run/elasticsearch
Slackware の/etc/rc.d/rc.elasticsearch スクリプトを作成
# vi /etc/rc.d/rc.elasticsearch
下記を記入
#!/bin/sh
#
# /etc/rc.d/rc.elasticsearch
#
# Slackware init script for Elasticsearch
#
# 各種パス・ユーザー設定
ES_USER="elasticsearch"
ES_GROUP="elasticsearch"
ES_HOME="/usr/share/elasticsearch"
ES_BIN="$ES_HOME/bin/elasticsearch"
PID_FILE="/var/run/elasticsearch/elasticsearch.pid"
# Elasticsearchの起動処理
elasticsearch_start() {
if [ -f "$PID_FILE" ]; then
if ps -p $(cat "$PID_FILE") > /dev/null 2>&1; then
echo "Elasticsearch is already running."
return
else
echo "Removing stale PID file: $PID_FILE"
rm -f "$PID_FILE"
fi
fi
echo "Starting Elasticsearch..."
# PID保存用ディレクトリの権限確認
PID_DIR=$(dirname "$PID_FILE")
if [ ! -d "$PID_DIR" ]; then
mkdir -p "$PID_DIR"
chown "$ES_USER":"$ES_GROUP" "$PID_DIR"
fi
# rootからの実行禁止対策のため、専用ユーザーでバックグラウンド実行 (-d)
# -p オプションでPIDファイルを書き出します
su -s /bin/bash -c "$ES_BIN -d -p $PID_FILE" $ES_USER
}
# Elasticsearchの停止処理
elasticsearch_stop() {
if [ -f "$PID_FILE" ]; then
PID=$(cat "$PID_FILE")
echo "Stopping Elasticsearch (PID $PID)..."
kill $PID
# 完全に停止するまで少し待機
TIMEOUT=30
while ps -p $PID > /dev/null 2>&1; do
sleep 1
TIMEOUT=$((TIMEOUT - 1))
if [ $TIMEOUT -le 0 ]; then
echo "Elasticsearch did not stop gracefully. Forcing..."
kill -9 $PID
break
fi
done
rm -f "$PID_FILE"
else
echo "Elasticsearch is not running (no PID file found)."
fi
}
# ステータス確認
elasticsearch_status() {
if [ -f "$PID_FILE" ]; then
PID=$(cat "$PID_FILE")
if ps -p $PID > /dev/null 2>&1; then
echo "Elasticsearch is running with PID $PID."
else
echo "Elasticsearch is NOT running, but PID file exists."
fi
else
echo "Elasticsearch is stopped."
fi
}
# 引数に応じた処理の分岐
case "$1" in
'start')
elasticsearch_start
;;
'stop')
elasticsearch_stop
;;
'restart')
elasticsearch_stop
sleep 2
elasticsearch_start
;;
'status')
elasticsearch_status
;;
*)
echo "Usage: $0 {start|stop|restart|status}"
exit 1
esac
exit 0
実行権限の付与
# chmod +x /etc/rc.d/rc.elasticsearch
起動と動作確認
起動
# /etc/rc.d/rc.elasticsearch start
停止
# /etc/rc.d/rc.elasticsearch stop
再起動
/e# tc/rc.d/rc.elasticsearch restart
状態確認
# /etc/rc.d/rc.elasticsearch status
7. 自動起動の設定
OSの起動時に自動で立ち上げたい場合は、/etc/rc.d/rc.local に以下を追記します。
# vi /etc/rc.d/rc.local
下記記入
if [ -x /etc/rc.d/rc.elasticsearch ]; then
/etc/rc.d/rc.elasticsearch start
fi
8. elasticとkibana_systemのパスワードを作成
elasticユーザとkibana_systemユーザのパスワードは後で使用するので必ずコピーしておく
kibana_systemユーザはKibanaの設定に使用する
elasticユーザはFilebeat、Auditbeatの設定およびKibanaへのログインに使用する
パスワードを忘れた場合は、再度コマンドを使用してパスワードをリセットできます。
[elastic] userのパスワード作成
# cd /usr/share/elasticsearch/bin
# ./elasticsearch-reset-password -u elastic
This tool will reset the password of the [elastic] user to an autogenerated value.
The password will be printed in the console.
Please confirm that you would like to continue [y/N]y
Password for the [elastic] user successfully reset.
New value: l3=c2+QzGDJUzsxi0*47
※Elasticsearch パスワードのリセット
自動生成されたElasticユーザーパスワードが複雑すぎるので、/usr/share/elasticsearch/bin/elasticsearch-reset-passwordコマンドを使ってリセットできます
パスワードをリセットするには、コマンドを実行する
# /usr/share/elasticsearch/bin/elasticsearch-reset-password -u elastic -i
This tool will reset the password of the [elastic] user.
You will be prompted to enter the password.
Please confirm that you would like to continue [y/N]y
Enter password for [elastic]:
Re-enter password for [elastic]:
Password for the [elastic] user successfully reset.
[kibana_system]userのパスワード作成
# cd /usr/share/elasticsearch/bin
# ./elasticsearch-reset-password -u kibana_system
This tool will reset the password of the [kibana_system] user to an autogenerated value.
The password will be printed in the console.
Please confirm that you would like to continue [y/N]y
Password for the [kibana_system] user successfully reset.
New value: bctctD9JbJL7tfe0_o4b
9. 疎通確認
正常に稼働しているか curl を使って確認します。(またはWEBブラウザでhttps://192.168.11.85:9200へアクセスする)
# curl -k -u elastic https://192.168.11.85:9200
下記のように表示される
Enter host password for user 'elastic':
{
"name" : "Lion.korodes.com",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "ZMJ6oRhGT36FfdG177AltA",
"version" : {
"number" : "8.19.12",
"build_flavor" : "default",
"build_type" : "tar",
"build_hash" : "840cd2a58b052d1632219ee0b8dcc0f364226287",
"build_date" : "2026-02-23T23:08:40.713020893Z",
"build_snapshot" : false,
"lucene_version" : "9.12.2",
"minimum_wire_compatibility_version" : "7.17.0",
"minimum_index_compatibility_version" : "7.0.0"
},
"tagline" : "You Know, for Search"
}
Kibana
2台目のSlackware15.0 IP (192.168.11.85)で作業します
1. Kibanaインストール
# cd /usr/local
# wget https://artifacts.elastic.co/downloads/kibana/kibana-8.19.21-linux-x86_64.tar.gz
# tar -xzf kibana-8.19.21-linux-x86_64.tar.gz
# mv kibana-8.19.21 /usr/local/kibana
2. kibana ユーザーの作成
# useradd -r -s /bin/false kibana
# chown -R kibana:kibana /usr/local/kibana
3. Kibanaの設定ファイル編集
# vi /usr/local/kibana/config/kibana.yml
server.port: 5601
server.host: "192.168.11.85"
elasticsearch.hosts: ["https://191.168.11.85:9200"]
elasticsearch.username: "kibana_system"
elasticsearch.password: "your_password"
elasticsearch.ssl.certificateAuthorities: [ "/usr/share/elasticsearch/config/certs/http_ca.crt" ]
# chmod a+rx /usr/share/elasticsearch/config/certs
# chmod a+r /usr/share/elasticsearch/config/certs/http_ca.crt
4. Kibanaの起動
一時的なテストなどで、手動でバックグラウンド実行したい場合
# su -s /bin/bash kibana -c "/usr/local/kibana/bin/kibana &"
Kibana を起動し、システム起動時に実行できるようにする。
# vi /etc/rc.d/rc.kibana
#!/bin/bash
#
# /etc/rc.d/rc.kibana
# Start/stop/restart the Kibana service.
# 対象のディレクトリ
TARGET_DIR="/usr/local/kibana"
cd "$TARGET_DIR"
export PATH="/usr/local/kibana/node/glibc-217/bin:$PATH"
KIBANA_BIN=" /usr/local/kibana/bin/kibana"
KIBANA_USER="kibana"
PID_FILE="/var/run/kibana.pid"
LOG_FILE="/var/log/kibana.log"
kibana_start() {
if [ -f $PID_FILE ]; then
echo "Kibana is already running."
else
echo "Starting Kibana..."
# kibanaユーザーとしてバックグラウンドで実行
nohup su -s /bin/sh $KIBANA_USER -c "$KIBANA_BIN >> $LOG_FILE 2>&1" &
echo $! > $PID_FILE
# ログファイルの権限調整
touch $LOG_FILE && chown $KIBANA_USER:$KIBANA_USER $LOG_FILE
fi
}
kibana_stop() {
if [ -f $PID_FILE ]; then
echo "Stopping Kibana..."
kill $(cat $PID_FILE)
rm -f $PID_FILE
else
echo "Kibana is not running."
fi
}
kibana_restart() {
kibana_stop
sleep 2
kibana_start
}
kibana_status() {
if [ -f $PID_FILE ]; then
echo "Kibana is running with PID $(cat $PID_FILE)."
else
echo "Kibana is stopped."
fi
}
case "$1" in
'start')
kibana_start
;;
'stop')
kibana_stop
;;
'restart')
kibana_restart
;;
'status')
kibana_status
;;
*)
echo "usage $0 start|stop|restart"
esac
# chmod +x /etc/rc.d/rc.kibana
# /etc/rc.d/rc.kibana start
Filebeat 9のインストール
ELKスタックを使用して1台目サーバーSlackware15.0からログを収集して監視するには、Filebeatをインストールする必要があります。
本作業は1台目サーバー Slackware15.0 IPアドレス(192.168.11.83)で行います。
1. インストール
# cd /usr/local/src
# curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-9.5.4-linux-x86_64.tar.gz
# cd /usr/local
# tar -xzvf /usr/local/src/filebeat-9.5.4-linux-x86_64.tar.gz
# 管理しやすいようにシンボリックリンクを作成
# ln -s filebeat-9.5.4-linux-x86_64 filebeat
2. Filebeat Loggingの設定
デフォルトのfilebeat設定ファイルは/usr/local/filebeat/filebeat.ymlです
Filebeatがログを独自のログファイルに書き込むようにするには、設定ファイルに以下の設定を入力する
# cat >> /usr/local/filebeat/filebeat.yml << 'EOL'
logging.level: info
logging.to_files: true
logging.files:
path: /var/log/filebeat
name: filebeat
keepfiles: 7
permissions: 0640
EOL
# mkdir /var/log/filebeat
3. Filebeatをデータ処理系に接続する
Filebeatをデータ処理系に接続するように設定します。今回はElasticsearchです。
ログを直接Elasticsearchに送信するには、Filebeat設定ファイルを編集し、出力設定セクションを更新します。
Elasticsearch 9への接続にはSSLと認証が必要です。
Elasticsearchのポート9200/tcpに接続できることを確認する(事前に2台目サーバーの9200ポートを開放しておく)
# telnet 192.168.11.85 9200
Trying 192.168.11.85...
Connected to 192.168.11.85.
Escape character is '^]'.
① Elasticsearch CA証明書作成
Elasticsearch CA証明書をダウンロードし、任意のディレクトリに保存します(今回は/usr/local/filebeat/elastic-ca.crtとして保存します)
# openssl s_client -connect 192.168.11.85:9200 \
-showcerts </dev/null 2>/dev/null | \
openssl x509 -outform PEM > /usr/local/filebeat/elastic-ca.crt
➁FilebeatがElasticsearchの認証に使用する認証情報を取得
今回は、デフォルトのスーパー管理者、Elasticユーザの認証情報を使用します。
# vi /usr/local//filebeat/filebeat.yml
138行目当たり Kibanaセクションを下記のように追記
#host: "localhost:5601"
host: "192.168.11.85:5601"
164行目当たりコメントにして、 その下にElasticsearch Output セクションを下記のように追記
output.elasticsearch:
# Array of hosts to connect to.
#hosts: ["localhost:9200"]
hosts: ["192.168.11.85:9200"]
171行目当たりコメント解除し、Elasticsearch CA証明書の場所を追記
# Protocol - either `http` (default) or `https`.
protocol: "https"
ssl.certificate_authorities: ["/usr/local/filebeat/elastic-ca.crt"]
175,76行目当たりコメント解除しパスワード記入
# Authentication credentials - either API key or username/password.
#api_key: "id:api_key"
username: "elastic"
password: "Password" ←2台目サーバーで作成したelasticのパスワード
➂設定ファイルテスト
# filebeat test config
Config OK
④Filebeatの出力接続をテスト
#/usr/local/filbeat/filebeat test output
elasticsearch: https://192.168.11.85:9200...
parse url... OK
connection...
parse host... OK
dns lookup... OK
addresses: 192.168.11.85
dial up... OK
TLS...
security: server's certificate chain verification is enabled
handshake... OK
TLS version: TLSv1.3
dial up... OK
talk to server... OK
version: 8.19.12
⑤FilebeatのSuricataモジュールを有効にする
Suricataモジュールを有効にすると/usr/local/filebeat/modules.d/suricata.yml.disabledが/usr/local/filebeat/modules.d/suricata.ymlになりますがその中身は変更されませんので次のように変更する
# /usr/local/filebeat/filebeat modules enable suricata
# vi /usr/local/filebeat/modules.d/suricata.yml
7-8行目を下記の通り変更
- module: suricata
# All logs
eve:
enabled: true
var.paths: ["/var/log/suricata/eve.json"]
⑥初期環境をセットアップ
SIEMダッシュボードをElasticsearchにロードします
# /usr/local/filebeat/filebeat setup -e
{"log.level":"info","@timestamp":"2026-09-19T11:11:44.170+0900","log.logger":"modules","log.origin":{"function":"github.com/elastic/beats/v7/filebeat/fileset.LoadPipeline","file.name":"fileset/pipelines.go","file.line":134},"message":"Elasticsearch pipeline loaded.","service.name":"filebeat","pipeline":"filebeat-9.5.4-suricata-eve-pipeline","ecs.version":"1.6.0"}
{"log.level":"info","@timestamp":"2026-09-19T11:11:44.173+0900","log.logger":"modules","log.origin":{"function":"github.com/elastic/beats/v7/filebeat/fileset.LoadPipeline","file.name":"fileset/pipelines.go","file.line":134},"message":"Elasticsearch pipeline loaded.","service.name":"filebeat","pipeline":"filebeat-9.5.4-suricata-eve-dns","ecs.version":"1.6.0"}
{"log.level":"info","@timestamp":"2026-09-19T11:11:44.175+0900","log.logger":"modules","log.origin":{"function":"github.com/elastic/beats/v7/filebeat/fileset.LoadPipeline","file.name":"fileset/pipelines.go","file.line":134},"message":"Elasticsearch pipeline loaded.","service.name":"filebeat","pipeline":"filebeat-9.5.4-suricata-eve-dns-answer-v1","ecs.version":"1.6.0"}
{"log.level":"info","@timestamp":"2026-09-19T11:11:44.177+0900","log.logger":"modules","log.origin":{"function":"github.com/elastic/beats/v7/filebeat/fileset.LoadPipeline","file.name":"fileset/pipelines.go","file.line":134},"message":"Elasticsearch pipeline loaded.","service.name":"filebeat","pipeline":"filebeat-9.5.4-suricata-eve-dns-answer-v2","ecs.version":"1.6.0"}
{"log.level":"info","@timestamp":"2026-09-19T11:11:44.180+0900","log.logger":"modules","log.origin":{"function":"github.com/elastic/beats/v7/filebeat/fileset.LoadPipeline","file.name":"fileset/pipelines.go","file.line":134},"message":"Elasticsearch pipeline loaded.","service.name":"filebeat","pipeline":"filebeat-9.5.4-suricata-eve-tls","ecs.version":"1.6.0"}
{"log.level":"info","@timestamp":"2026-09-19T11:11:44.182+0900","log.logger":"modules","log.origin":{"function":"github.com/elastic/beats/v7/filebeat/fileset.LoadPipeline","file.name":"fileset/pipelines.go","file.line":134},"message":"Elasticsearch pipeline loaded.","service.name":"filebeat","pipeline":"filebeat-9.5.4-suricata-eve-http","ecs.version":"1.6.0"}
⑦Filebeatサービスを開始
# /usr/local/filebeat/filebeat
⑩Kibanaで確認
Kibanaにログインし直します。http://192.168.11.85:5601にアクセスします。
一番上の検索フィールドに「Suricata Events Overview」と入力し、[Filebeat Suricata]Events Overviewをクリック
以降は他のOSと同様ですので割愛します
