業務用エアコン関連の技術情報、エラーコード、環境問題対策に関する別サイト「エアコンの安全な修理・適切なフロン回収」

Slackware15 : Suricata , Elasticsearch , Kibana インストール

前提条件

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と同様ですので割愛します