SnortとSuricataによるシグネチャルール
ネットワークルールを記述し、読み解きます。
「SnortとSuricataによるシグネチャルール」はCoddyKit上の無料Cyber Security Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはCyber Security Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Cyber Security Academyコースには全4レッスンが含まれています。
SnortとSuricata
SnortとSuricataは、2つの主要なオープンソースIDS/IPSエンジンです。両者は大部分で互換性のあるルール言語を共有しているため、一方のために作成したルールは通常もう一方でも実行できます。
Suricataは、マルチスレッド処理、ネイティブプロトコルパーサー、ファイル抽出、豊富なログ出力(EVE JSON)を追加しています。Snort 3も同様に独自のエンジンを現代化しました。ルール構文を一度学べば、両方でその知識を活用できます。
ルールの構造
すべてのルールは、ヘッダーと、オプションを含む括弧付きのボディという2つの部分で構成されます。ヘッダーではアクション、プロトコル、トラフィックの方向を設定し、ボディでは何を照合し、どのように報告するかを定義します。
alert tcp $EXTERNAL_NET any -> $HOME_NET 80 ( \
msg:"WEB suspicious request"; \
content:"/admin.php"; http_uri; \
sid:1000001; rev:1; )ヘッダーフィールド
ヘッダーは左から右へ読み取ります。
- action — alert、drop、reject、pass
- protocol — tcp、udp、icmp、ip(Suricataではアプリケーションプロトコルの http、dns、tls も使用します)
- source IP/port と destination IP/port
- direction —
->は一方向、<>は双方向
$HOME_NET や $EXTERNAL_NET のような変数は設定から読み込まれるため、サイト間でルールを移植できます。
drop tcp any any -> $HOME_NET 22 ( msg:"SSH blocked"; sid:1000002; rev:1; )アクション:Alert と Drop
アクションによって、そのルールが IDS と IPS のどちらとして動作するかが決まります。
alert— ログを記録して通知しますが、トラフィックは停止しません(IDS)drop— パケットを黙って破棄します(IPS、インライン配置時のみ)reject— 破棄したうえで、TCPリセットまたはICMP到達不能を送信しますpass— 明示的に許可し、後続のルールをスキップします
同じエンジンでも、インラインで配置するかどうかと使用するアクションによって、IDSにもIPSにもなります。
コンテンツマッチング
contentキーワードは、ペイロード内のバイトパターンに一致します。テキストは引用符で囲み、バイナリはパイプ内に16進数で記述します。
アンカー用キーワードを使うと一致条件を厳密にできます。offset、depth、distance、withinによってパターンが現れる位置を制限できるため、精度とパフォーマンスの両方が向上します。
alert tcp any any -> $HOME_NET any ( \
msg:"Malware magic bytes"; \
content:"|4D 5A|"; offset:0; depth:2; \
sid:1000003; rev:1; )スティッキーバッファ
最新のルールは、生のストリームではなくプロトコル対応バッファを対象にマッチングします。バッファキーワードの後に続くcontentによるマッチングは、解析されたプロトコルのその部分に対して適用されます。
http_uri— リクエストURIhttp_header— リクエスト/レスポンスヘッダーhttp_user_agent— User-Agenttls_sni/dns_query— TLSサーバー名/DNSクエリ
これは、パケット全体から部分文字列を検索するよりもはるかに信頼性が高い方法です。
alert http any any -> any any ( \
msg:"Suspicious user agent"; \
http.user_agent; content:"sqlmap"; nocase; \
sid:1000004; rev:1; )PCRE と nocase
固定文字列だけでは不十分な場合、pcreによってPerl互換正規表現を使用できます。低コストなcontentによる事前フィルターとpcreを組み合わせると、正規表現の実行対象を候補パケットだけに絞り、パフォーマンスを維持できます。
nocase修飾子を使うと、contentによるマッチングで大文字と小文字を区別しなくなります。これは、攻撃者が変化させられるヘッダーやユーザー制御フィールドで重要です。
alert http any any -> $HOME_NET any ( \
msg:"SQLi attempt in URI"; \
http.uri; content:"select"; nocase; \
pcre:"/union\s+select/i"; \
sid:1000005; rev:1; )フローと状態のキーワード
flowオプションは、ルールを接続の状態と方向に限定し、誤検知と処理コストを削減します。
established— 完了したTCPセッションに対してのみ適用to_server/to_client— リクエストとレスポンスの方向
サーバーからのレスポンスを、接続が確立済みでto_clientの場合にのみ照合すれば、無関係なパケットや偽装パケットに反応することを避けられます。
alert tcp $HOME_NET any -> $EXTERNAL_NET any ( \
msg:"Beacon response"; \
flow:established,to_client; \
content:"|00 01 02 03|"; \
sid:1000006; rev:1; )メタデータ:sid、rev、msg、reference
管理用オプションによって、ルールセットを保守しやすくできます。
sid— 一意のシグネチャID(ローカルルールには1000000以上を使用します)rev— 改訂番号。編集するたびに増やしますmsg— アナリストに表示されるアラートテキストclasstype— 優先度を決めるカテゴリreference— CVEまたはアドバイザリへのリンク
sidを安定させ、revを増分していけば、ダッシュボードや抑制設定を壊さずにルールを追跡・更新できます。
alert tcp any any -> $HOME_NET 445 ( \
msg:"EternalBlue exploit attempt"; \
flow:to_server,established; content:"|FF|SMB"; \
classtype:attempted-admin; \
reference:cve,2017-0144; sid:1000007; rev:2; )Snort と Suricata の違い
ルールには互換性がありますが、エンジンの機能は異なります。
- Suricataはマルチスレッドで動作し、アプリケーションプロトコルをネイティブに解析し、ファイルを抽出してJA3を計算し、EVE JSONを出力します
- Snort 3は、パフォーマンスとモジュール式プラグインシステムを重視してエンジンを書き直しています
一部のキーワードはエンジン固有です。Suricataはアプリケーション層キーワード(tls.sni、dns.query、http.method)や、データセットとflowbitsの機能を追加しています。ルールを共有する場合は、共通して利用できる最小限の機能に合わせるか、エンジンごとにルールセットを管理してください。
レートフィルタリングとしきい値
ルールによってコンソールがアラートで埋め尽くされるのを防ぐには、しきい値を適用します。detection_filterは一定時間内にN件のイベントが発生した後にのみ検知し、limitを指定したthresholdはアラート量に上限を設けます。
これは、ブルートフォース攻撃やスキャンの検知に不可欠です。1件のイベントには意味がなくても、短時間に集中して発生することがシグナルになるためです。
alert tcp any any -> $HOME_NET 22 ( \
msg:"SSH brute force"; flow:to_server; \
detection_filter:track by_src, count 5, seconds 60; \
sid:1000008; rev:1; )確認問題
ルールを読んで、その動作を予測してください。
まとめ
これで、Snort/Suricataのシグネチャを読み書きできるようになりました。
- ルールは、ヘッダー(アクション、プロトコル、送信元/宛先、方向)と本文のオプションで構成されます
- アクションによってIDSとIPSが決まります:
alert、drop、reject、pass contentは、offset/depthや16進数による指定と組み合わせてペイロードのバイト列に一致させます- スティッキーバッファ(http.uri、tls.sni、dns.query)は、解析済みのプロトコルフィールドに一致させます
pcreとnocaseで変化するパターンに対応しますflowで状態と方向を限定しますsid/rev/msg/referenceによって、ルールを保守しやすくします- しきい値によって、ブルートフォース攻撃やスキャンによるノイズを抑えます
次は、シグネチャをまったく使わずに脅威を検知します。
よくある質問
「SnortとSuricataによるシグネチャルール」レッスンは無料ですか?
はい。「SnortとSuricataによるシグネチャルール」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Cyber Security Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Cyber Security Academyコースには全4レッスンが含まれています。
「SnortとSuricataによるシグネチャルール」で何を学びますか?
ネットワークルールを記述し、読み解きます。 ブラウザで直接実行するハンズオンコードでCyber Security Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Cyber Security Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのCyber Security Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「SnortとSuricataによるシグネチャルール」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このCyber Security Academyレッスンでコードを書いて実行できますか?
はい。すべてのCyber Security Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- IDSとIPSの概念
- SnortとSuricataによるシグネチャルール
- 異常検知と振る舞い検知
- チューニングとデプロイ