snort(IDS/IPS) チートシート

cheatsheet

目的別 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:"

コメント

タイトルとURLをコピーしました