Suricata で異常を検出する

WiresharkWiresharkBeginner
今すぐ練習

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

この実験では、強力なオープンソースの脅威検出エンジンである Suricata を使用してネットワーク異常を検出する方法を学びます。ルール設定、トラフィック監視、アラート分析などの主要な機能を探索し、潜在的なセキュリティ脅威を特定します。

実践的な演習では、Suricata のセットアップ、基本的なルールの作成、リアルタイムのトラフィック検査の手順を案内します。ICMP ping 要求などの疑わしい活動を検出し、特定の脅威シナリオに合わせてルールをカスタマイズする実践的な経験を積むことができます。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL wireshark(("Wireshark")) -.-> wireshark/WiresharkGroup(["Wireshark"]) wireshark/WiresharkGroup -.-> wireshark/packet_capture("Packet Capture") wireshark/WiresharkGroup -.-> wireshark/display_filters("Display Filters") wireshark/WiresharkGroup -.-> wireshark/export_packets("Exporting Packets") wireshark/WiresharkGroup -.-> wireshark/packet_analysis("Packet Analysis") subgraph Lab Skills wireshark/packet_capture -.-> lab-549934{{"Suricata で異常を検出する"}} wireshark/display_filters -.-> lab-549934{{"Suricata で異常を検出する"}} wireshark/export_packets -.-> lab-549934{{"Suricata で異常を検出する"}} wireshark/packet_analysis -.-> lab-549934{{"Suricata で異常を検出する"}} end

Suricata のインストール

このステップでは、オープンソースのネットワーク脅威検出エンジンである Suricata をインストールします。Suricata は、ネットワークのセキュリティカメラのように機能し、トラフィックを常に分析して潜在的な脅威を特定します。リアルタイム侵入検知 (IDS: Intrusion Detection System) で攻撃を監視し、インライン侵入防止 (IPS: Intrusion Prevention System) で悪意のあるトラフィックをブロックし、ネットワークセキュリティ監視ですべての活動をログに記録する、3 つの主要な機能を実行できます。

インストール手順を段階的に開始しましょう。

  1. まず、パッケージリストを更新する必要があります。これにより、何かをインストールする前に、システムが最新の利用可能なソフトウェアバージョンを認識するようになります。

    sudo apt update

    sudo コマンドは管理者権限を与え、apt update はシステムの利用可能なパッケージのリストを更新します。

  2. 次に、Suricata とその必要なすべてのコンポーネント (依存関係) をインストールします。-y フラグはインストールを自動的に確認します。

    sudo apt install -y suricata

    このコマンドは、Ubuntu の公式リポジトリから Suricata ソフトウェアパッケージをダウンロードしてインストールします。

  3. インストール後、インストールされたバージョンを確認することで、すべてが正しく動作したことを検証しましょう。

    suricata -V

    次のような出力が表示されるはずです。

    This is Suricata version 6.0.3 RELEASE

    -V フラグは Suricata にバージョン情報を表示するよう指示します。この出力が表示されれば、インストールが成功したことが確認できます。

  4. Suricata の動作は設定ファイルによって制御されます。この重要なファイルがデフォルトの場所に存在するかどうかを確認しましょう。

    ls /etc/suricata/suricata.yaml

    /etc/suricata/ ディレクトリは、Linux で一般的にシステム全体のアプリケーションの設定ファイルが保存される場所です。

  5. 最後に、Suricata はネットワークトラフィックで何を探すかを知るためにルールが必要です。これらのルールは、Suricata に疑わしい活動が何であるかを教える一連の指示のようなものです。デフォルトのルールは以下の場所に保存されています。

    ls /var/lib/suricata/rules

    /var/lib/suricata/rules ディレクトリには、Suricata のインストールに付属するルールファイルが含まれています。これらのルールをこの実験の後半で使用します。

基本ルールの設定

このステップでは、Suricata の基本的な検出ルールを設定します。ルールは、Suricata にネットワークトラフィックで何を探すかを指示する核心的なコンポーネントです。疑わしいパターンや既知の脅威を定義する一連の指示のように考えてください。

  1. まず、すべてのルールファイルが保存されている Suricata のルールディレクトリに移動します。

    cd /var/lib/suricata/rules

    ここには Suricata のデフォルトルールファイルとカスタムルールファイルが保存されています。ディレクトリの場所は Suricata の設定で指定されています。

  2. 既存のルールファイルを一覧表示して、すでに利用可能なものを確認します。

    ls

    suricata.rules のようないくつかの .rules ファイルが表示されるはずです。これらのファイルには、Suricata が検出に使用するさまざまなカテゴリのルールが含まれています。

  3. 基本的なルール構造を調べてみましょう。nano エディタを使用してメインのルールファイルを開きます。

    sudo nano suricata.rules

    nano エディタは、ルールを変更するために使用するシンプルなテキストエディタです。似たような構造の多くの既存のルールが表示されます。

  4. ICMP ping 要求を検出する単純なルールを追加します(ファイルの末尾に追加します)。

    alert icmp any any -> any any (msg:"ICMP Ping Detected"; itype:8; sid:1000001; rev:1;)

    このルールが何をするかを分解してみましょう。

    • alert: 一致した場合に Suricata にアラートを生成するよう指示します。
    • icmp: ICMP プロトコルのトラフィックに適用されます。
    • any any -> any any: 任意のソース IP/ポートから任意の宛先 IP/ポートへの通信を一致させます。
    • msg: ログに表示されるアラートメッセージです。
    • itype:8: 具体的に ICMP タイプ 8(ping 要求)を一致させます。
    • sid: 一意のルール識別子(カスタムルールの場合は 1000001 以上)。
    • rev: ルールのリビジョン番号。
  5. ファイルを保存します(nano では Ctrl+O、Enter、Ctrl+X)。これにより、新しいルールが永続的に保存されます。

  6. ルールを適用する前に、ルールの構文が正しいことを検証します。

    sudo suricata -T -c /etc/suricata/suricata.yaml -v

    -T フラグは設定をテストします。次のような出力が最後に表示されるはずです。

    Configuration provided was successfully loaded. Exiting.

    これにより、ルールが正しく書式設定されていることが確認できます。

  7. 新しいルールを読み込んで監視を開始するために、Suricata を再起動します。

    sudo pkill suricata
    sudo suricata -c /etc/suricata/suricata.yaml -i eth0

    最初のコマンドは実行中の Suricata インスタンスを停止し、2 番目のコマンドは新しいルールで Suricata を再起動し、eth0 インターフェイスを監視します。

リアルタイムトラフィックの監視

このステップでは、Suricata がリアルタイムのネットワークトラフィックをどのように監視し、先ほど設定したルールに基づいてアラートを生成するかを観察します。これは、すべての IDS(侵入検知システム:Intrusion Detection System)の核心機能であり、ネットワークパケットを監視し、疑わしい活動を検出することです。

  1. まず、Suricata をリアルタイムキャプチャモードで起動する必要があります。以下のコマンドは、まず実行中の Suricata インスタンス(存在する場合)を停止し、次に eth0 インターフェイスを監視する新しいインスタンスを起動します。

    sudo pkill suricata
    sudo suricata -c /etc/suricata/suricata.yaml -i eth0

    -c フラグは設定ファイルを指定し、-i は Suricata に監視するネットワークインターフェイスを指示します。

  2. 次に、前のステップで作成した ICMP ルールをトリガーするテストトラフィックを生成しましょう。新しいターミナルを開き、以下のコマンドを実行します。

    ping -c 3 8.8.8.8

    これは、Google の DNS サーバー(8.8.8.8)に 3 つの ICMP ping パケットを送信します。ICMP トラフィックを検出するルールを作成したので、Suricata はこの活動をログに記録するはずです。

  3. Suricata はアラートを /var/log/suricata/fast.log に書き込みます。これらのアラートをリアルタイムで監視するには、以下のコマンドを使用します。

    sudo tail -f /var/log/suricata/fast.log

    tail -f コマンドは、ファイルに追加された新しい行を継続的に表示します。次のような出力が表示されるはずです。

    01/01/2023-12:34:56.123456  [**] [1:1000001:1] ICMP Ping Detected [**] [Classification: (null)] [Priority: 3] {ICMP} 192.168.1.1 -> 8.8.8.8

    これにはタイムスタンプ、ルール ID(1:1000001:1)、アラートメッセージ、およびソース/宛先 IP アドレスが表示されます。

  4. JSON 形式のより詳細なログを確認するには、eve.json ファイルを調べることができます。以下のコマンドは、アラートイベントのみをフィルタリングして整形します。

    sudo tail -f /var/log/suricata/eve.json | jq '. | select(.event_type == "alert")'

    jq ツールは、JSON 出力を解析して整形するのに役立ち、読みやすくなります。

  5. Suricata が処理しているトラフィックの統計情報(生成されたアラートの数など)を表示するには、以下のコマンドを実行します。

    sudo suricatasc -c stats

    出力の中で detect.alert のようなカウンターを探してください。これは、ルールがアラートをトリガーした回数を示しています。

  6. トラフィックの観察が終了したら、ログを監視しているターミナルウィンドウで Ctrl+C を押して、継続的な出力を停止します。

生成されたアラートのレビュー

このステップでは、前の監視セッションで Suricata が生成したアラートを分析します。これにより、どのようなトラフィックパターンがルールをトリガーしたかを理解することができます。侵入検知システムを使用する際には、アラートをレビューすることは、潜在的なセキュリティ脅威を特定し、検知ルールを微調整するために重要です。

  1. まず、基本的なアラートログを確認します。

    sudo cat /var/log/suricata/fast.log

    このコマンドは、タイムスタンプ付きのアラートをシンプルで人間が読みやすい形式で表示します。fast.log は Suricata のデフォルトのアラート出力ファイルです。「ICMP Ping Detected」を含むエントリを探してください。これらは、検知ルールに一致した ping 要求を示しています。

  2. より詳細な分析のために、構造化された JSON ログを調べます。

    sudo cat /var/log/suricata/eve.json | jq '. | select(.event_type == "alert")'

    eve.json ファイルには、JSON 形式の包括的な機械可読ログが含まれています。jq を使用してアラートイベントのみをフィルタリングします。これにより、以下のような詳細情報が提供されます。

    • ソースと宛先の IP アドレス
    • 正確なタイムスタンプ
    • 完全なルール詳細
    • パケットペイロード情報(設定されている場合)
  3. 各アラートがトリガーされた回数をカウントするには、次のコマンドを実行します。

    sudo grep -o "ICMP Ping Detected" /var/log/suricata/fast.log | wc -l

    このパイプラインは、まず grep -o を使用して「ICMP Ping Detected」のすべての出現箇所を抽出し、次に wc -l でそれらをカウントします。これにより、このイベントがどれだけ頻繁に発生するかを定量的に把握することができます。

  4. アラートタイプの概要を取得するには、次のコマンドを実行します。

    sudo jq -r '.alert.signature' /var/log/suricata/eve.json | sort | uniq -c

    このコマンドは、すべてのアラートシグネチャ(ルール名)を抽出し、アルファベット順にソートしてから、一意の出現回数をカウントします。これにより、どのルールが最も頻繁にトリガーされているかの概要が得られます。

  5. ソース IP 情報を含むアラートを表示するには、次のコマンドを実行します。

    sudo jq -r 'select(.event_type == "alert") | [.timestamp, .src_ip, .alert.signature] | @tsv' /var/log/suricata/eve.json

    この高度な jq クエリは、各イベントのタイムスタンプ、ソース IP、およびアラートシグネチャを示すタブ区切りの出力を作成します。@tsv 形式により、スプレッドシートに簡単にインポートすることができます。

  6. 最新の 5 件のアラートを確認するには、次のコマンドを実行します。

    sudo tail -n 5 /var/log/suricata/fast.log

    tail コマンドは、ファイルの最後の数行を表示します。これは、ログ全体をスクロールすることなく、最近の活動をすばやく確認するのに便利です。

カスタムルールの追加

このステップでは、ネットワークトラフィックの特定のパターンを検出するために、独自の Suricata ルールを作成してテストする方法を学びます。実践的な例として、テストドメイン(example.com)への HTTP リクエストを検出することに焦点を当てます。カスタムルールを使用すると、Suricata の検出機能をデフォルトのルールセットを超えて拡張することができます。

  1. まず、Suricata が検出ルールを保存しているルールディレクトリに移動します。

    cd /var/lib/suricata/rules

    ここには通常、すべての Suricata ルールファイルが保存されています。既存のルールと整理して管理するために、ここにカスタムルールを追加します。

  2. カスタムルール専用の新しいルールファイルを作成します。

    sudo nano custom.rules

    ルールディレクトリを変更するには管理者権限が必要なので、sudo を使用する必要があります。ファイル名を custom.rules とすることで、Suricata のデフォルトのルールファイルと明確に区別します。

  3. 以下のルールを追加して、example.com への HTTP リクエストを検出します。

    alert http any any -> any any (msg:"HTTP Request to example.com"; flow:to_server; http.host; content:"example.com"; nocase; sid:1000002; rev:1;)

    このルールが何をするかを分解して説明します。

    • alert http:HTTP トラフィックに対してアラートをトリガーします。
    • any any -> any any:任意のソースポートから任意の宛先ポートへのトラフィックに適用されます。
    • msg:人間が読めるアラートメッセージを提供します。
    • flow:to_server:サーバーに向かうトラフィックのみに一致します。
    • http.host:HTTP ホストヘッダーを調べます。
    • content:"example.com":この特定のドメインを探します。
    • nocase:大文字小文字を区別せずに一致させます。
    • sid:1000002:ルールに一意の ID を付けます(カスタムルールは 1,000,000 以上)。
    • rev:1:これがルールの最初のバージョンであることを示します。
  4. nano エディタで、Ctrl+O(書き出し)を押してから Enter で確認し、Ctrl+X で終了してファイルを保存します。

  5. 次に、Suricata に新しいルールファイルを読み込むように指示する必要があります。メインの設定を編集します。

    sudo nano /etc/suricata/suricata.yaml

    rule-files: セクション(通常は 50 - 60 行目付近)を見つけて、以下を追加します。

    - custom.rules

    この追加により、Suricata が起動するときにカスタムルールを読み込むようになります。

  6. 変更を適用する前に、ルールの構文が正しいことを確認します。

    sudo suricata -T -c /etc/suricata/suricata.yaml -v

    -T フラグは、Suricata に実際に実行せずに設定をテストするように指示します。これにより、ルールを使用する前に構文エラーを見つけることができます。

  7. 新しいルールを読み込むために Suricata を再起動します。

    sudo pkill suricata
    sudo suricata -c /etc/suricata/suricata.yaml -i eth0

    最初のコマンドは実行中の Suricata インスタンスを停止し、2 番目のコマンドは更新された設定で新たに起動します。

  8. ルールが機能するかテストするために、example.com への HTTP トラフィックを生成します。

    curl http://example.com

    このコマンドは、新しいルールをトリガーするはずの単純な HTTP リクエストを行います。

  9. 最後に、最新のアラートを表示して、Suricata がトラフィックを検出したかどうかを確認します。

    sudo tail -n 5 /var/log/suricata/fast.log

    example.com への HTTP リクエストに関するカスタムルールのメッセージに一致するアラートが表示されるはずです。表示されない場合は、各ステップを再確認し、ルールの構文を検証してください。

まとめ

この実験では、オープンソースのネットワーク脅威検出エンジンである Suricata のインストールと設定方法を学びました。そのプロセスには、パッケージの更新、依存関係のインストール、設定ファイルとルールディレクトリの確認によるインストールの検証が含まれていました。

また、ICMP ping 要求ルールを追加することでカスタム検知ルールの作成を試し、その構造と構成要素を理解しました。最後に、Suricata がネットワークトラフィックを効果的に監視し、異常に対するアラートを生成できるように、ルールの構文を検証しました。