目的別 Snort コマンド&ルール記述リファレンス
1. Snortの起動とモード
Snortは様々なモードで起動できます。目的に応じて適切なオプションを指定してください。
目的 | モード | コマンド例 | 説明 |
---|---|---|---|
ネットワークインターフェースを流れるパケットのヘッダを表示 | スニッファモード | snort -v -i eth0 |
TCP/IPヘッダ情報をコンソールに表示します。-v オプションで詳細表示。-i でインターフェースを指定。 |
パケットの内容(ヘッダ+データ)を表示 | スニッファモード (詳細) | snort -vd -i eth0 |
-d オプションでアプリケーションデータも表示します。 |
さらに詳細なデータリンク層ヘッダも表示 | スニッファモード (最詳細) | snort -vde -i eth0 |
-e オプションでデータリンク層ヘッダも表示します。 |
キャプチャしたパケットを指定ディレクトリに記録 | パケットロガーモード | snort -dev -l ./log -i eth0 |
-l オプションでログディレクトリを指定します。パケットはtcpdump形式で保存されます。 |
ホームネットワーク宛の通信のみ記録 | パケットロガーモード (フィルタ) | snort -dev -l ./log -h 192.168.1.0/24 -i eth0 |
-h オプションでホームネットワークを指定します。指定したネットワーク宛のパケットのみ記録します。 |
設定ファイルとルールに基づき不正アクセスを検知 | ネットワーク侵入検知システム (NIDS) モード | snort -c /etc/snort/snort.conf -l /var/log/snort -i eth0 -A full |
-c で設定ファイル、-l でログディレクトリ、-A でアラートモードを指定します。-A full は標準的なアラート出力です。 |
バックグラウンドでNIDSモードを実行 | NIDSモード (デーモン) | snort -c /etc/snort/snort.conf -l /var/log/snort -i eth0 -A full -D |
-D オプションでデーモンモードとしてバックグラウンドで実行します。 |
設定ファイルの構文チェック | テストモード | snort -c /etc/snort/snort.conf -T |
-T オプションで設定ファイルとルールの構文をチェックし、問題がなければ終了します。 |
インラインでパケットをフィルタリング (不正なパケットを破棄) | インラインモード (IPS) | snort -c /etc/snort/snort.conf -Q --daq afpacket --daq-dir /usr/local/lib/daq --daq-var device=eth0:eth1 -A full |
-Q オプションでインラインモードを有効化します。--daq でデータ収集ライブラリ (DAQ) を指定し、インライン処理を行うインターフェースペアを指定します。drop ルールに合致したパケットを破棄します。 |
インラインモードの設定テスト | インラインテストモード | snort -c /etc/snort/snort.conf -Q --daq afpacket --daq-dir /usr/local/lib/daq --daq-var device=eth0:eth1 -T |
インラインモードの設定をテストします。 |
2. 設定ファイル (snort.conf) の主要設定 ⚙️
snort.conf
はSnortの動作を制御する中心的なファイルです。主要な設定項目を理解することが重要です。
設定項目 | 例 | 説明 |
---|---|---|
ホームネットワーク定義 | ipvar HOME_NET [192.168.1.0/24,10.0.0.0/8] |
保護対象の内部ネットワークを定義します。複数のネットワークやIPアドレスをカンマ区切りで指定できます。any を指定すると全てのIPアドレスが対象になりますが、通常は推奨されません。 |
外部ネットワーク定義 | ipvar EXTERNAL_NET !$HOME_NET |
ホームネットワーク以外を外部ネットワークとして定義します。通常は !$HOME_NET と記述します。 |
サーバー定義 | ipvar DNS_SERVERS $HOME_NET ipvar SMTP_SERVERS $HOME_NET ipvar HTTP_SERVERS $HOME_NET ipvar SQL_SERVERS $HOME_NET ipvar TELNET_SERVERS $HOME_NET ipvar SSH_SERVERS $HOME_NET ipvar FTP_SERVERS $HOME_NET ipvar SIP_SERVERS $HOME_NET |
各プロトコルのサーバーが存在するIPアドレス範囲を定義します。デフォルトでは $HOME_NET になっていることが多いですが、環境に合わせて具体的に指定することが推奨されます。 |
ポート定義 | portvar HTTP_PORTS [80,8080] portvar SHELLCODE_PORTS !80 portvar ORACLE_PORTS 1521 portvar SSH_PORTS 22 |
特定のサービスが使用するポート番号を定義します。ポート範囲 (例: [1024:65535] ) や否定 (例: !80 ) も指定可能です。 |
ルールファイルのパス | var RULE_PATH ../rules var SO_RULE_PATH ../so_rules var PREPROC_RULE_PATH ../preproc_rules |
テキストルール、共有オブジェクトルール、プリプロセッサルールのディレクトリを指定します。 |
ルールファイルの読み込み | include $RULE_PATH/local.rules include $RULE_PATH/web-client.rules |
指定したパスからルールファイルを読み込みます。include ディレクティブを使用して個々のルールファイルやカテゴリを指定します。コメントアウト (# ) で特定のルールファイルを無効化できます。 |
プリプロセッサ設定 | preprocessor http_inspect: global ... preprocessor stream5_global: max_tcp 262144 ... preprocessor stream5_tcp: policy first ... |
各種プリプロセッサを有効化し、その動作を設定します。パフォーマンスや検知精度に大きく影響するため、環境に応じた調整が必要です。詳細はプリプロセッサのセクションで後述します。 |
出力プラグイン設定 | output unified2: filename snort.u2, limit 128 output alert_fast: stdout # output alert_syslog: LOG_AUTH LOG_ALERT |
検知したアラートやログの出力方法とフォーマットを指定します。複数の出力プラグインを同時に有効化できます。コメントアウトで無効化します。 |
イベントフィルタリング (thresholding) | include $RULE_PATH/threshold.conf |
特定のルールからのアラートを抑制したり、一定期間内の発生回数に基づいてアラートを制御したりします。threshold.conf ファイルで詳細な設定を行います。 |
イベント抑制 (suppression) | suppress gen_id 1, sig_id 1851 suppress gen_id 1, sig_id 0, track by_src, ip 192.168.1.100 |
特定ルールや特定の送信元/宛先IPアドレスからのアラートを完全に抑制します。誤検知が多いルールに対して使用します。 |
3. ルール記述の基本
Snortルールの基本構造は「ルールヘッダー」と「ルールオプション」から構成されます。
アクション プロトコル 送信元IP 送信元ポート 方向演算子 宛先IP 宛先ポート (ルールオプション)
3.1. ルールヘッダー
要素 | 例 | 説明 |
---|---|---|
アクション | alert , log , pass , drop , reject , sdrop |
ルールに一致した場合の動作を定義します。alert : アラート生成+パケット記録, log : パケット記録のみ, pass : パケット無視, drop : パケット破棄 (インラインモード), reject : パケット破棄+TCP Reset/ICMP Unreachable送信 (インラインモード), sdrop : パケット破棄、アラートなし (インラインモード)。他に activate , dynamic があります。 |
プロトコル | tcp , udp , icmp , ip |
検査対象のプロトコルを指定します。ip は TCP, UDP, ICMP を含む全てのIPパケットを対象とします。 |
IPアドレス | any , $HOME_NET , !$EXTERNAL_NET , 192.168.1.100 , [10.0.0.0/8, 172.16.0.0/12] |
送信元/宛先IPアドレスを指定します。snort.conf で定義した変数 ($HOME_NET など) や、特定のIP、CIDR表記、否定 (! )、リスト ([] ) が使用可能です。any は任意のIPアドレスを意味します。 |
ポート番号 | any , $HTTP_PORTS , !22 , 1024: , :1024 , [80,443,8080] |
送信元/宛先ポートを指定します。snort.conf で定義した変数 ($HTTP_PORTS など) や、特定のポート、範囲 (: )、否定 (! )、リスト ([] ) が使用可能です。any は任意のポートを意味します。1024: は1024番以上のポート、:1024 は1024番以下のポートを示します。 |
方向演算子 | -> , <> |
通信の方向を示します。-> は左から右への一方向、<> は双方向の通信を検査対象とします。 |
3.2. ルールオプション
ルールヘッダーに続く括弧 ()
内に、セミコロン ;
区切りで記述します。パケットの内容や状態に関する詳細な条件を指定します。
基本オプション | 例 | 説明 |
---|---|---|
msg |
msg:"ET MALWARE Win32/Autorun Worm"; |
アラートやログに出力されるメッセージを定義します。必須オプションです。ダブルクォーテーション " で囲みます。 |
sid |
sid:2013031; |
SnortルールID。ルールを一意に識別するための番号です。1,000,000未満は予約済み、カスタムルールでは1,000,000以上を使用します。必須オプションです。 |
rev |
rev:5; |
ルールのリビジョン番号。ルールが更新されるたびにインクリメントします。必須オプションです。 |
classtype |
classtype:trojan-activity; |
攻撃の分類を示します。classification.config ファイルで定義されたカテゴリを指定します。アラートの分類や優先度付けに利用されます。 |
gid |
gid:1; |
ジェネレータID。どのサブシステムがイベントを生成したかを示します。通常ルールは 1 、プリプロセッサ関連は異なる値が設定されます。省略すると 1 になります。 |
priority |
priority:1; |
ルールの優先度を数値で指定します (1が高優先度)。classtype と関連付けられています。 |
metadata |
metadata:service http, policy security-ips; |
ルールに関する追加情報(メタデータ)を記述します。key value のペアをカンマ区切りで複数指定できます。 |
reference |
reference:cve,2021-44228; reference:url,www.example.com/advisory; |
関連する脆弱性情報 (CVE) や外部情報源への参照リンクを記述します。system_id, reference_info の形式で指定します。 |
💡 ヒント:
sid
は一意である必要があります。カスタムルール作成時は、既存のルールと重複しないように注意し、1,000,000以上の番号を割り当てましょう。
4. ペイロード検出オプション
パケットのデータ部分(ペイロード)の内容に基づいて検知を行うためのオプションです。
オプション | 構文例 | 説明 |
---|---|---|
content |
content:"GET"; content:"|FF D8 FF E0|"; content:"/etc/passwd"; http_uri; |
ペイロード内に指定した文字列またはバイナリパターンが存在するかを検査します。文字列は "" 、バイナリは || で囲みます。 |
nocase |
content:"cmd.exe"; nocase; |
content オプションに続けて指定し、大文字/小文字を区別せずにマッチングします。 |
rawbytes |
content:"GET"; http_uri; rawbytes; |
HTTPデコードなど、プリプロセッサによる正規化が行われる前の生データに対して content マッチングを行います。 |
offset |
content:"login"; offset:10; |
ペイロードの先頭から指定したバイト数だけ進んだ位置から content マッチングを開始します。 |
depth |
content:"user"; depth:4; |
ペイロードの先頭から指定したバイト数までの範囲内で content マッチングを行います。offset と併用可能。 |
distance |
content:"password"; distance:10; |
直前の content マッチングが成功した位置から、指定したバイト数だけ進んだ位置から次の content マッチングを開始します。 |
within |
content:"logout"; within:20; |
直前の content マッチングが成功した位置から、指定したバイト数までの範囲内で次の content マッチングを行います。distance と併用可能。 |
http_uri |
content:".php?id="; http_uri; |
HTTPリクエストの正規化されたURIバッファに対して content マッチングを行います。http_inspect プリプロセッサが必要です。 |
http_client_body |
content:" |
コメント