Suricata Host IDS/IPS + Elastic Stackでログの可視化とモニタリング(RockyLinux/AlmaLinux)

このページの目的

SuricataをIDSとIPSとして利用し、Elastic StackをSuricataのログの可視化とモニタリングに利用します
構築するイメージは下図の通りで2台のAlmaLinux9.3サーバーを用意し、
・1台目のサーバーにSuricata、Filebeatをインストールする
・2台目のサーバーに、Kibana、Elasticsearchをインストールする

それぞれの役割は

Suricata Host IDS/IPS
ホスト侵入検知・防御システムでデフォルトでパッシブIDSとしてインストールされ、単に不審なトラフィックをスキャンし、ホスト上でアラートを生成します。今回はSURICATAをIPSとしても動作するように設定し、定義されたルールに一致する悪意のあるネットワークトラフィックのパケットをドロップして完全にブロックします

Filebeat
ログデータを転送し、一元管理するための軽量なシッパーです

Elasticsearch
あらゆる種類のデータを対象とした検索・分析エンジン

Kibana
Elasticsearch にインデックスされたデータの検索とデータ可視化機能を提供します

SURICATAインストールと設定

本作業は1台目のAlmaLinuxサーバーで行う

1. SURICATAインストール

1.1 Open Information Security Foundation(OSIF)のリポジトリを追加

1.2 SURICATAをインストール

バージョンの確認

1.3 システム起動時にsuricata.serviceが起動するようにする

1.4 SURICATAを停止する
設定ファイルを編集してテストしたときに、SURICATAが再び起動したときに変更が検証されて読み込まれるようになる

2. SURICATAの設定

①SURICATAは、IDSモードでのみ有効であり、悪意のあるネットワークトラフィックをドロップあるいはブロックはしません、アラートとログを提供するだけです。SURICATAをIPSとして設定し、悪意のあるネットワークパケットをドロップするようにする
➁JSON出力にコミュニティIDを含めるようにSURICATAを設定する

2.1 デフォルトのネットワーク・インターフェイスを確認

デフォルトのネットワーク・インターフェイス名は"ens160"である

2.2 Suricataの設定ファイル編集

2.3 プロセスを再起動せずにルールセットを再読み込みするようSuricataプロセスに通知し、以Suricataサービスを再起動する

2.4 Suricataルールの更新

出力の最後に、読み込まれたルールの数が表示される
利用可能 enabled: 46733; 追加 added: 36236;

SURICATAのすべてのルールセット・プロバイダーを更新
no-check-certificateは、認証局の検証を無視する。

SURICATAのすべてのルールセット・プロバイダーをリストアップ

License: Commercial のルールは有償です。tgreen/huntingルールをフェッチする

suricata-updateコマンドを再度実行してtgreen/huntingルールセットをロードし、killコマンドを実行して再起動せずにルールを更新する

2.5 Suricataテスト

2.6 SURICATAサービスを起動し、ステータス確認

tailコマンドを使い、SURICATAのログから、起動が終了したことを示す特定のメッセージを探すことができる

2.7 SuricataがIDSモード動作確認テスト
TestMyNIDSのウェブサイトを使う

2100498ルール識別子を使用して、grepコマンドを使用してそれに一致するエントリを検索

GPL ATTACK_RESPONSEアラートをログに記録されています

JSON形式でイベントを記録するとより読みやすい形式でログを提供します。この形式でログを表示するために、jqユーティリティをインストールする

検索対象の2100498の値と一致するsignature_idキーを持つalertオブジェクトを表示します

2.8 SuricataをIPSに設定する
悪意のあるネットワーク・トラフィックをドロップするようにSuricataをIPSモードで起動するように設定する

非SSHポートへのSSHトラフィックをスキャンする以下のカスタム署名を作成し、/var/lib/suricata/rules/local.rulesというファイルにインクルードする

/etc/suricata/suricata.yaml設定ファイルを編集し、local.rulesをインクルードする

SURICATAの設定を検証

SURICATAの/etc/sysconfig/suricata設定ファイルを編集する

Suricataを再起動

ステータス確認

2.9 入ってくるネットワーク・トラフィックをSuricataのNFQUEUEに向ける
Firewalld がインストールされ、有効になっているのでSuricataに必要なルールをFirewalldに追加する

2.10 SURICATA がトラフィックを正しくドロップしていることを確認
シグネチャのデフォルトアクションをalertやlogからactive dropping trafficに切り替える
/var/lib/suricata/rules/local.rulesファイルを開き、ファイル内の各行の先頭にあるアラートアクションをdropに変更する

/var/lib/suricata/rules/suricata.rulesにsid:2100498に該当するものがあれば コメントアウトし、/var/lib/suricata/rules/local.rulesファイルにルールを追加

シグネチャを再読み込み

Suricataのルールを再読み込み

curlを使ってこのルールをテスト

jqを使ってeve.logファイルを調べる

"action": "blocked",になっている

ホストへのICMPリクエストをすべてドロップするルールを作成し、pingリクエストを実行し、パケットがドロップされることを確認する
ルールを作成

Suricataのルールを再読み込み

Windowsマシンから、Suricataホストにpingリクエストを実行する

SuricataはIPSとして動作し、すべてのpingリクエストをドロップするはずです

ログを確認すると下記のようにDropされている

ELK StackとSURICATAの統合

Elastic Stackをインストール&設定して、SURICATAのログをより効率的に可視化&検索できるようにする
本セクションは基本的には2台目のAlmaLinuxサーバーで行います

1. Elasticsearchのインストール

1.1 公開署名キーをダウンロードしてインストール

1.2 リポジトリ定義を/etc/yum/yum.repos.d ディレクトリに作成

1.3 ElasticsearchとKibanaをインストール

2. Elasticsearch 設定

Elasticsearchはデフォルトでローカル接続のみを受け付けるように設定されています。また、認証が有効になっていないため、Filebeatなどのツールはログを送信できません。今回は、Elasticsearchのネットワーク設定を行い、Elasticsearchに組み込まれているxpackセキュリティモジュールを有効にします。

2.1 Elasticsearchネットワークの設定
ElasticsearchとSURICATAのサーバは別々なので、Elasticsearchがプライベートネットワークインターフェースで接続をリッスンするように設定する必要がある

ファイルを保存する

2.2 ファイアウォールルールを追加

2.3 Elasticsearch デーモンを起動し、xpack セキュリティモジュールで使用するパスワードを設定

ユーティリティを再度実行することはできませんので、これらのパスワードを安全な場所に記録しておいてください。kibana_systemユーザのパスワードはKibana ネットワークの設定で、elasticユーザのパスワードはFilebeatを設定するステップで使用します

3. Kibana の設定

3.1 xpackセキュリティモジュールの設定

Kibana の xpack セキュリティ機能を有効にして、Kibana が Elasticsearch にデータを保存するために使用するいくつかの暗号化キーを作成する。
暗号化キーは、/usr/share/kibana/bin ディレクトリに含まれる kibana-encryption-keys ユーティリティを使用して作成する。
作成した3つのキーを安全な場所に保存しておく

これらのキーをKibanaの/etc/kibana/kibana.yml設定ファイルに追加する

3.2 Kibana ネットワークの設定

3.3 Kibana が Elasticsearch の認証に使用するユーザー名とパスワードを設定
Kibanaのキーストアに値を保存する

Kibanaのユーザー名を設定

パスワードを保存

3.4 Kibanaの起動

ステータス確認

4. Kibanaのウェブページ起動確認

ウェブ・ブラウザにアクセスし、Kibanaが正しく起動していることを確認する。"http://192.168.1.101:5601"と入力してKibanaにアクセスしてみる。ただし、5601ポートを開放しておく

Usernameはelastic、Passwordはelastic用に作成したものでログイン

"Add integrations"選択しEnter

elasticスーパーユーザーアカウントを使う必要がないように、新しいユーザーアカウントを作成します。
メインメニューを開き、Stack Management > Users

右上の"Create user"ボタンをクリック

新規ユーザー情報を入力し、Privilegesでkibana_admin、kibana_system、monitoring_user、editorのロールを割り当てる

現在のプロファイルからログアウトし、新しく作成したユーザーアカウントでログインできることを確認する。現在、SURICATAのホストでFilebeatとAuditbeatを設定していないため、Kibanaで表示できるデータがありません。

SURICATAサーバにFilebeatをインストール

本作業はSuricataをインストールした1台目のAlmaLinuxサーバーで作業する

1. Filebeat インストール

1.1 Elastic GPGキーをダウンロード

1.2 /etc/yum/yum.repos.dディレクトリにelasticsearch.repoファイルを以下の内容で、作成

1.3 Filebeatをインストール

1.4 FilebeatをElasticsearchとKibanaに接続するように設定

Filebeatsの組み込みSuricataモジュールを有効にする

1.5 初期環境をセットアップ

1.6 Filebeatサービスを開始

1.7 Kibana ダッシュボードへのアクセス
KibanaはElasticsearchサーバーのプライベートIPアドレスからのみ利用できるように設定されているため、Kibanaに接続するにはSSHトンネルを使用する必要がある

SSHでKibanaに接続する
SSHには、ローカル・ポート上のネットワーク・トラフィックをサーバー上のリモートIPアドレスとポートに転送するオプション -L を使用して、ブラウザから Kibana インスタンスにトラフィックを転送します。

Linux、MavOS、Windowsでは、内蔵の SSH クライアントを使用してトンネルを作成できます。Kibanaに接続するたびにこのコマンドを使用します。この接続はいつでも閉じることができ、トンネルを再確立するために再度SSHコマンドを実行する

ローカルのPCのターミナルで以下のコマンドを実行し、KibanaへのSSHトンネルを作成する
192.168.11.101はElasticsearch serverのIPアドレス
lanはElasticsearch serverへログインするユーザー名

SSHトンネルを閉じたい場合は、CTRL+C

以上で4. Kibanaのウェブページ起動確認で記載通りKibanaに接続できる

2. Kibanaで確認

作成したユーザーでKibanaにログインし直します。http://192.168.1.101:5601にアクセスします。

一番上の検索フィールドに「Suricata Events Overview」と入力し、Events Overviewをクリック

過去 15 分間のすべての Suricata イベントが表示されます

悪質なトラフィックのアラートを表示するにはSuricataロゴの横にあるAlertsテキストをクリック