はじめに

Snort IDS 入門の実験へようこそ。

Snort は、オープンソースのネットワーク侵入防止システム(NIPS)およびネットワーク侵入検知システム(NIDS)であり、IP ネットワーク上でリアルタイムのトラフィック分析とパケットログ記録を行うことができます。プロトコル分析、コンテンツ検索、マッチングを実行でき、バッファオーバーフロー、ステルスポートスキャン、Web アプリケーション攻撃など、さまざまな攻撃やプローブを能動的にブロックしたり、受動的に検知したりするために一般的に使用されます。

大まかに言うと、IDS はパケットスニファーとは異なる問いに答えるものです。スニファーはトラフィックを観察するのに役立ちますが、IDS はそのトラフィックの一部が注意を払うべきものかどうかを判断しようとします。Snort は、パケット検査とルール言語を組み合わせることでこれを実現します。言い換えれば、生のトラフィックをセキュリティに関連するイベントへと変換するのです。

この実験では、Snort の基礎を学びます。設定ファイルを確認し、設定構文を検証する方法を学び、Snort の主要な動作モードである「スニファーモード」と「パケットロガーモード」の 2 つを実行します。

Snort 設定ファイルの確認

このステップでは、Snort が使用する主要な設定ファイルを確認します。このファイルを理解することは、Snort の動作、保護対象のネットワーク、適用するルールを決定するため、非常に重要です。

検知の品質はコンテキストに大きく依存するため、設定は重要です。どの IP アドレスが自分の環境に属しているかを知らない IDS は、インバウンドトラフィックと内部トラフィックを適切に区別できません。そのため、HOME_NET のような変数は単なる装飾的な設定ではなく、Snort が防御対象のネットワークをモデル化する上で不可欠な要素です。

Snort のメイン設定ファイルは /etc/snort/snort.conf にあります。このファイルには、ネットワーク変数、ルールファイルへのパス、プリプロセッサ設定など、さまざまな設定が含まれています。

まずは、デフォルトのワークスペースであるプロジェクトディレクトリに移動しましょう。

cd ~/project

Snort 設定ファイルの中で最も重要な変数の一つが HOME_NET です。この変数は、Snort が保護すべき内部ネットワークを定義します。デフォルトでは多くの場合 any に設定されており、これは Snort がすべてのネットワークトラフィックを監視することを意味します。

grep コマンドを使用して、設定ファイル内の HOME_NET 変数を検索できます。grep コマンドは、ファイル内の特定のテキストパターンを検索するために Linux で使用される強力なツールです。設定ファイルは保護されているため、管理者権限でコマンドを実行するために sudo を使用する必要があります。

sudo grep "ipvar HOME_NET" /etc/snort/snort.conf

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

ipvar HOME_NET any

この出力は、HOME_NET 変数が現在 any に設定されていることを確認するものです。実際の運用環境では、誤検知を減らしパフォーマンスを向上させるために、これを特定の内部 IP サブネット(例:192.168.1.0/24)に合わせて変更するのが一般的です。

さらに詳しく調べたい場合は、less コマンドを使用して設定ファイル全体を表示することもできます(ファイルはかなり長いです)。現時点では、ファイルの場所と主要な変数の探し方を知っていれば十分です。

設定構文のテスト

このステップでは、Snort 設定ファイルの構文エラーをテストする方法を学びます。

デプロイ前の検証は、重要な運用上のプラクティスです。検知ルールや設定ファイルは、エンジンが実際に読み込める場合にのみ有用です。構文テストは、リリース前にコードをコンパイルするのと同等の IDS における作業であり、壊れた変更を早期に発見し、本番環境での死角を防ぎます。

snort.conf ファイルに変更を加えるたびに、Snort サービスを開始または再起動する前に設定をテストすることを強く推奨します。タイプミスや設定ミスがあると Snort は起動に失敗し、ネットワークが監視されない状態になる可能性があります。

Snort には組み込みのテストモードが用意されています。-T フラグを使用して Snort に設定をテストするように指示し、-c フラグでテストしたい設定ファイルのパスを指定します。

以下のコマンドを実行して、デフォルト設定をテストしてください。

sudo snort -T -c /etc/snort/snort.conf

Snort はネットワークインターフェースやシステムレベルのファイルにアクセスする必要があるため、管理者権限を付与するために sudo で実行する必要があります。

コマンドが実行されると、Snort はターミナルに多くの情報を出力します。プリプロセッサの初期化、ルールの読み込み、構文の検証が行われています。

出力の最後の方までスクロールしてください。以下のような成功メッセージを探します。

        --== Initialization Complete ==--

   ,,_     -*> Snort! <*-
  o"  )~   Version 2.9.15.1 GRE (Build 68)
   ''''    By Martin Roesch & The Snort Team: http://www.snort.org/contact#team
           Copyright (C) 2014-2019 Cisco and/or its affiliates. All rights reserved.
           Copyright (C) 1998-2013 Sourcefire, Inc., et al.
           Using libpcap version 1.10.1 (with TPACKET_V3)
           Using PCRE version: 8.39 2016-06-14
           Using ZLIB version: 1.2.11

           Rules Engine: SF_SNORT_DETECTION_ENGINE  Version 3.0  <Build 1>
           Preprocessor Object: SF_GTP  Version 1.1  <Build 4>
           Preprocessor Object: SF_CORVUS  Version 1.1  <Build 4>
           ...

Snort successfully validated the configuration!
Snort exiting

ここでの重要なフレーズは Snort successfully validated the configuration! です。これは、snort.conf ファイルの構文が正しく、使用できる状態であることを意味します。

スニファーモードでの Snort 実行

このステップでは、Snort をスニファーモードで実行します。

スニファーモードは、Snort を使用する最も基本的な方法です。このモードでは、Snort はネットワーク上を流れるパケットを読み取り、連続したストリームとしてコンソールに表示します。これは、有名な tcpdump ユーティリティと非常によく似た動作をします。

IDS 技術もパケットから始まることを示しているため、教育的な観点からも有用です。Snort がトラフィックに対してアラートを出す前に、そのトラフィックを正しくキャプチャしてデコードする必要があります。最初にスニファーモードを学ぶことで、アラートを魔法のようなものとして扱うのではなく、パケットレベルの基盤を意識し続けることができます。

Snort をスニファーモードで実行するには、-v (verbose) フラグを使用します。これにより、Snort は TCP/IP パケットヘッダーを画面に出力します。

ネットワークトラフィックは膨大でターミナルを埋め尽くす可能性があるため、-n フラグとそれに続く数字を使用します。これは、指定した数のパケットだけをキャプチャして自動的に終了するように Snort に指示します。

以下のコマンドを実行して、5 つのパケットをキャプチャして表示します。

sudo snort -v -n 5

以下のような出力が表示され、パケットヘッダーが確認できます。

Running in packet dump mode

        --== Initializing Snort ==--
Initializing Output Plugins!
pcap DAQ configured to passive.
Acquiring network traffic from "eth0".
...
05/18-14:32:10.123456 192.168.1.10:54321 -> 8.8.8.8:53
UDP TTL:64 TOS:0x0 ID:12345 IpLen:20 DgmLen:63
Len: 35
...
===============================================================================
Snort exiting

さらに詳細を確認したい場合は、フラグを組み合わせることができます。例えば、-d を追加するとパケットのアプリケーションデータ(ペイロード)が表示され、-e を追加するとリンク層(MAC アドレス)ヘッダーが表示されます。

詳細情報(ヘッダー、データ、リンク層情報)を含めて 2 つのパケットをキャプチャしてみましょう。

sudo snort -vde -n 2

このモードは、ネットワーク接続の問題のトラブルシューティングや、現在ネットワークインターフェースを通過しているトラフィックの種類を素早く確認するのに非常に役立ちます。

パケットロガーモードでの Snort 実行

このステップでは、Snort をパケットロガーモードで実行する方法を学びます。

スニファーモードはリアルタイムの確認には適していますが、長期的な監視や詳細な分析には実用的ではありません。パケットロガーモードは、キャプチャしたパケットを後で Wireshark や Snort 自体などのツールで分析できる形式でディスクに保存することで、この問題を解決します。

保存されたパケットの証拠は、アラートとパケットが互いに補完し合うため重要です。アラートはルールが発火したことを知らせ、パケット記録は実際に何が起こったのかを確認し、アラートの要約には含まれない詳細を調査することを可能にします。成熟した監視スタックでは、多くの場合その両方を保持します。

まず、ログファイルを保存するためのディレクトリを作成する必要があります。プロジェクトフォルダ内に snort_logs というディレクトリを作成しましょう。

mkdir -p ~/project/snort_logs

Snort をパケットロガーモードで実行するには、-l フラグの後にログディレクトリへのパスを指定します。また、-dev を使用してパケットの詳細をすべてキャプチャし、-n 10 を使用して 10 パケットをキャプチャした後に終了するようにします。

以下のコマンドを実行してください。

sudo snort -dev -l ~/project/snort_logs -n 10

Snort は 10 個のパケットをキャプチャし、指定したディレクトリに書き込みます。今回は画面にパケットは表示されませんが、初期化と終了の要約が表示されます。

Snort の実行が完了したら、snort_logs ディレクトリの内容をリスト表示して、ログファイルが作成されたことを確認できます。

ls -l ~/project/snort_logs

以下のように、snort.log. にタイムスタンプが続いたファイルが表示されるはずです。

total 4
-rw------- 1 root root 1234 May 18 14:45 snort.log.1684421100

このファイルはバイナリ形式(pcap)で保存されています。nano や cat などのテキストエディタで直接読むことはできません。代わりに、通常は tcpdump のようなツールを使用するか、-r (read) フラグを使用して Snort に読み込ませ、詳細な分析を行います。

まとめ

おめでとうございます!Snort IDS 入門の実験を無事に完了しました。

この実験では、Snort の基本的な概念を学びました。メインの設定ファイル(snort.conf)を確認し、起動エラーを防ぐために -T フラグを使用して構文を検証する方法を学びました。また、スニファーモードでライブネットワークトラフィックをターミナルで表示する方法や、パケットロガーモードでキャプチャしたパケットをディレクトリに保存して後で分析する方法を練習しました。これらの基礎スキルは、ネットワークセキュリティ監視や侵入検知のために Snort を活用しようとするすべての人にとって不可欠なものです。