基本
Snortは柔軟性に富み、強力であるにも関わらず、シンプルで軽量なルール
記述言語を採用しています。Snortルールを記述する際に覚えておくと役立つ
多くの簡単なガイドラインがあります。
ほとんどのSnortのルールは1行で記述されています。1.8より前のバージョンでは、
この方法でしか記述できませんでした。
Snortの現行バージョンでは、行の終わりにバックスラッシュ
を追加することで、複数行にわたるルールを記述できます。
Snortのルールは、ルールヘッダ部とルールオプション部という2つの論理セクションに
分かれています。ルールヘッダ部にはルールのアクション、プロトコル、送信元/
宛先IPアドレスおよびネットマスク、送信元/宛先ポート情報が含まれます。
ルールオプション部にはアラートメッセージと、ルールに記述されたアクションの
実施を判断するために検査するパケットの一部に関する情報が含まれます。
図1はSnortルールのサンプルです。
alert tcp any any -> 192.168.1.0/24 111 (content:"|00 01 86 a5|"; msg:"mountd access";)
Figure 1: Snortルールのサンプル
1つ目の括弧までの文字列がルールヘッダ部で、括弧で囲まれた部分がルール
オプション部です。ルールオプション部の中でコロンの前の単語はオプション
キーワードと呼ばれます。ただし、ルールオプション部は必須ではなく、
特定のパケットの収集、アラート出力(または遮断)の際に厳密な定義を
行うために利用されます。
ルール全体を構成する要素は、論理積(and)命令文を構成すると
見なされます。同時に、Snortルールファイル群に含まれる様々なルールは
大規模な論理和(or)命令文を構成するものと見なされます。
includeキーワードを利用することで、Snortのコマンドラインで指定された
ルールファイルから他のルールファイルを読み込むことができます。この
機能はC言語の#includeと同様に機能し、includeが含まれるファイルの
当該箇所に指定されたファイルの内容を読み込みます。
書式
include: <include file path/name>
この行末にはセミコロンがないことに注意してください。読み込まれる
ファイルは事前に定義された変数を独自の変数リファレンスに代入します。
Snortルールファイルにおける変数の定義と利用方法について、
詳しくは第2.1.2節をご参照ください。
Snortでは変数を定義できます。図2に示した
ように、varキーワードを用いて簡単に代入を行うことができます。
var: <name> <value>
var MY_NET [192.168.1.0/24,10.1.1.0/24]
alert tcp any any -> $MY_NET any (flags:S; msg:"SYN packet";)
Figure 2: 変数の定義および利用例
ルール変数名は様々な方法で修飾できます。$演算子を利用してメ
タ変数を定義し、変数修飾演算子?および-と共に利用できます。
* $var - メタ変数を定義します。
* $(var)- 変数varの内容で代入します。
* $(var:-default)-変数varの内容、
またはvarが未定義の場合はdefaultの値を代入します。*
$(var:?message) -変数varの内容を代入するか、またはエラーメッセージ
messageを出力して終了します。
これらのルール修飾子の例については、図??をご参照ください。
var MY_NET 192.168.1.0/24
log tcp any any -> $MY_NET 23
Figure 3: 高度な変数の利用例
Snortの多くの設定およびコマンドラインオプションは設定ファイルで
指定することができます。
config <directive> [: <value>]
- order
- ルールをパスする順序を変更します (snort -o)
- alertfile
- アラート出力ファイルを指定します。例:config alertfile:
alerts
- classification
- ルールの分類(classifications)を行います (表2を参照)
- decode_arp
- arp デコードを行います (snort -a)
- dump_chars_only
- キャラクターダンプを行います (snort -C)
- dump_payload
- アプリケーション層の情報をダンプします (snort -d)
- decode_data_link
- Layer2ヘッダをデコードします (snort -e)
- bpf_file
- BPFフィルタを指定します (snort -F). 例: config bpf_file:
filename.bpf
- set_gid
- GIDを変更します (snort -g). 例: config set_gid:
snort_group
- daemon
- デーモンとしてforkします (snort -D)
- reference_net
- ホームネットワークを指定します (snort -h). 例: config reference_net:
192.168.1.0/24
- interface
- ネットワークインタフェースを指定します (snort -i). 例: config
interface: xl0
- alert_with_interface_name
- アラートにインタフェース名を付加します(snort -I)
- logdir
- ログ出力ディレクトリを指定します (snort -l). 例: config logdir: /var/log/snort
- umask
- 実行時にumaskを設定します (snort -m). 例: config umask: 022
- pkt_count
- Nパケット後に終了します (snort -n). 例: config pkt_count:
13
- nolog
- ログ取得を行いません。注: アラートは出力されます(snort -N)
- obfuscate
- IPアドレスを隠蔽化します (snort -O)
- no_promisc
- promiscuousモードを利用しません (snort -p)
- quiet
- バナーおよびステータスレポートを無効にします (snort -q)
- checksum_mode
- チェックサムを計算するパケットのタイプ。 値:
none, noip, notcp, noicmp, noudp, all
- utc
- タイムスタンプとしてローカル時間の代わりにUTC(協定世界時)を利用します (snort -U)
- verbose
- 標準出力へ冗長なログ出力を行います (snort -v)
- dump_payload_verbose
- 生パケットをデータリンク層からダンプします (snort -X)
- show_year
- タイムスタンプに西暦年を表示します (snort -y)
- stateful
- stream4(たぶん)に対してassuranceモードを指定します。表7も併せて参照して下さい。
- min_ttl
- Snortが処理する最小TTLを指定します。
- disable_decode_alerts
- Snortのデコード段階で生成されるアラートを無効にします
- disable_tcpopt_experimental_alerts
- 実験的なTCPオプションによって生成されるアラートを無効にします
- disable_tcpopt_obsolete_alerts
- obsolete tcpオプションによって生成されるアラートを無効にします
- disable_tcpopt_ttcp_alerts
- T/TCPオプションによって生成されるアラートを無効にします
- disable_tcpopt_alerts
- (訳注:TCP)オプション長検証アラートを無効にします
- disable_ipopt_alerts
- IPオプション長検証アラートを無効にします
- detection
- 検知エンジンを指定します (例: search-method lowmem )
- reference
- 新しいリファレンスシステムをSnortに追加します