序章
このシリーズの最初のチュートリアルでは、Suricataをインストールして構成する方法について説明しました。 このチュートリアルに従うと、Suricataルールセットをダウンロードして更新する方法、および疑わしいアクティビティに関するアラートのログを調べる方法も学習しました。 ただし、そのチュートリアルでダウンロードしたルールは多数あり、ネットワークやサーバーに関連しない可能性のあるさまざまなプロトコル、アプリケーション、攻撃ベクトルを網羅しています。
このチュートリアルでは、Suricata署名がどのように構造化されているか、およびほとんどのルールで一般的に使用されるいくつかの重要なオプションについて学習します。 署名の構造とフィールドを理解する方法に慣れたら、ファイアウォールと組み合わせてサーバーへの最も疑わしいトラフィックについて警告する独自の署名を作成できます。他の外部を使用する必要はありません。ルールセット。
ルールを作成および管理するこのアプローチは、作成した特定のルールを処理するだけでよいため、Suricataをより効率的に使用できることを意味します。 ネットワークで遭遇すると予想される正当で疑わしいトラフィックの大部分を説明するルールセットを入手したら、アクティブな侵入防止(IPS)モードでSuricataを使用して、無効なトラフィックを選択的にドロップし始めることができます。 このシリーズの次のチュートリアルでは、SuricataのIPS機能を有効にする方法について説明します。
前提条件
署名は通常、特定のオペレーティングシステムを必要としないため、このチュートリアルでは、任意のシステムでSuricataを実行できます。 このチュートリアルシリーズをフォローしている場合は、すでに次のものが必要です。
- Suricataは、 Ubuntu 20.04 、 Debian 11 、または RockyLinux8サーバーにインストールされて実行されています。
- ET Open Ruleset は、
suricata-update
コマンドを使用してダウンロードされ、Suricata署名に含まれています。
Suricata署名の構造を理解する
Suricataの署名は最初は複雑に見えるかもしれませんが、それらがどのように構造化され、Suricataがそれらをどのように処理するかを学ぶと、ネットワークの要件に合わせて独自のルールを作成できるようになります。
大まかに言うと、Suricataの署名は次の3つの部分で構成されています。
- トラフィックがルールに一致したときに実行するアクション。
- ヘッダーは、ホスト、IPアドレス、ポート、プロトコル、およびトラフィックの方向(着信または発信)を記述します。
- オプション。署名ID(
sid
)、ログメッセージ、パケットの内容に一致する正規表現、分類タイプ、および正当なものと疑わしいものを絞り込むのに役立つその他の修飾子などを指定します。トラフィック。
署名の一般的な構造は次のとおりです。
一般的なルール構造
ACTION HEADER OPTIONS
署名のヘッダー部分とオプション部分には、複数のセクションがあります。 たとえば、前のチュートリアルでは、sid
2100498のルールを使用してSuricataをテストしました。 参照用の完全なルールは次のとおりです。
sid:2100498
alert ip any any -> any any (msg:"GPL ATTACK_RESPONSE id check returned root"; content:"uid=0|28|root|29|"; classtype:bad-unknown; sid:2100498; rev:7; metadata:created_at 2010_09_23, updated_at 2010_09_23;)
署名のalert
部分はアクション、ip any any -> any any
セクションはヘッダー、残りの署名は(msg:GPL ATTACK_RESPONSE...
には、ルールのオプションが含まれています。
次のセクションでは、Suricataルールの各部分を詳しく調べます。
行動
sid:2100498
署名の最初の部分はアクションであり、この場合はalert
です。 Suricataシグニチャのアクション部分は、パケットがルールに一致したときに実行するアクションを指定します。 SuricataがIDSモードとIPSモードのどちらで動作しているかに応じて、アクションは次のいずれかになります。
- Pass -Suricataは、アラートを生成せずに、パケットのスキャンを停止して許可します。
- Drop -IPSモードで動作している場合、Suricataはすぐにパケットの処理を停止し、アラートを生成します。 パケットを生成した接続がTCPを使用している場合、タイムアウトになります。
- 拒否-SuricataがIPSモードを実行している場合、TCPリセットパケットが送信され、Suricataは一致するパケットをドロップします。
- Alert -Suricataはアラートを生成し、さらに分析するためにログに記録します。
ヘッダー
各Suricataシグニチャには、ネットワークプロトコル、送信元と宛先のIPアドレス、ポート、およびトラフィックの方向を説明するヘッダーセクションがあります。 sid:2100498
署名の例を参照すると、ルールのヘッダーセクションは強調表示されたip any any -> any any
部分です。
sid:2100498
alert ip any any -> any any (msg:"GPL ATTACK_RESPONSE id check returned root"; content:"uid=0|28|root|29|"; classtype:bad-unknown; sid:2100498; rev:7; metadata:created_at 2010_09_23, updated_at 2010_09_23;)
ルールのヘッダーセクションの一般的な形式は次のとおりです。
ルール形式
<PROTOCOL> <SOURCE IP> <SOURCE PORT> -> <DESTINATION IP> <DESTINATION PORT>
プロトコルは、次のいずれかになります。
- TCP
- UDP
- ICMP
- IP
- 他の多くのアプリケーションプロトコル
SourceおよびDestinationフィールドは、IPアドレスまたはネットワーク範囲、またはすべてのIPアドレスとネットワークに一致する特別な値any
にすることができます。 ->
の矢印は、トラフィックの方向を示します。
注:署名では、双方向のトラフィックに一致する無指向性マーカー<>
を使用することもできます。 ただし、方向マーカーに関する Suricataのドキュメントでは、ほとんどのルールで->
の右一致矢印が使用されると記載されています。
悪意のあるアウトバウンドトラフィック(つまり、ネットワークを離れるトラフィック)についてアラートを送信する場合、SourceフィールドはシステムのIPアドレスまたはネットワーク範囲になります。 宛先は、リモートシステムのIPまたはネットワーク、あるいは特別なany
値である可能性があります。
逆に、悪意のある着信トラフィックのアラートを生成する場合は、 Sourceフィールドをany
に設定し、DestinationをシステムのIPアドレスまたはネットワークに設定できます。範囲。
Port フィールドを使用して、調べるTCPまたはUDPポートを指定することもできます。 通常、システムから発信されるトラフィックにはランダムなポートが割り当てられるため、any
の値は->
インジケーターの左側に適しています。 すべての着信パケットの内容を調べる場合は、宛先ポートをany
にすることもできます。または、SSHトラフィックの場合は22、HTTPSの場合は443など、個々のポートのパケットのみをスキャンするようにシグニチャを制限できます。
sid:2100498
のip any any -> any any
ヘッダーは、プロトコル、送信元または宛先IP、またはポートに関係なく、すべてのトラフィックに一致する汎用ヘッダーです。 この種のcatchallヘッダーは、インバウンドトラフィックとアウトバウンドトラフィックに疑わしいコンテンツがないかどうかを確認する場合に役立ちます。
Source、Destination、およびPortフィールドは、特別な!
否定演算子も使用できることに注意してください。この演算子は、フィールドの値と一致しないトラフィックを処理します。
たとえば、次の署名は、ネットワーク(203.0.113.0/24
IPブロックで表される)宛てのany
ネットワークからのすべての着信SSHパケットで、ではないではないSuricataアラートを作成します。 X206X]ポート22宛て:
ヘッダーの例
alert ssh any any -> 203.0.113.0/24 !22 (sid:1000000;)
このアラートには、パケットまたは分類タイプに関するメッセージが含まれていないため、それほど有用ではありません。 アラートに追加情報を追加し、より具体的な基準に一致させるために、Suricataルールには Options セクションがあり、署名にいくつかの追加設定を指定できます。
オプション
Suricata署名の括弧(. . .)
内の引数には、パケットの特定の部分での照合、ルールの分類、またはカスタムメッセージのログ記録に使用できるさまざまなオプションとキーワード修飾子が含まれています。 ルールのヘッダー引数はIP、ポート、およびプロトコルレベルでパケットヘッダーに作用しますが、オプションはパケット内の'に含まれるデータと一致します。
Suricataルールのオプションは、;
セミコロンで区切る必要があり、通常はkey:value形式を使用します。 一部のオプションには設定がなく、ルールで指定する必要があるのは名前だけです。
前のセクションの署名の例を使用して、アラートの内容を説明するSSH traffic detected on non-SSH port
の値を持つmsg
オプションを追加できます。
ヘッダーの例
alert ssh any any -> 203.0.113.0/24 !22 (msg:"SSH TRAFFIC on non-SSH port"; sid:1000000;)
Suricataルールで各オプションを使用する方法の完全な説明は、このチュートリアルの範囲を超えています。 セクション6.2から始まるSuricataルールのドキュメントでは、各キーワードオプションについて詳しく説明しています。
ただし、content
キーワードや、ほとんどの署名で使用されるさまざまな Meta キーワードなど、いくつかのコアオプションがあります。これらについては、次のセクションで説明します。
Content
キーワード
ルールの最も重要なオプションの1つは、content
キーワードです。 sid:2100498
署名の例を思い出してください。
sid:2100498
alert ip any any -> any any (msg:"GPL ATTACK_RESPONSE id check returned root"; content:"uid=0|28|root|29|"; classtype:bad-unknown; sid:2100498; rev:7; metadata:created_at 2010_09_23, updated_at 2010_09_23;)
強調表示されたcontent:"uid=0|28|root|29|";
部分には、content
キーワードと、Suricataがパケット内で検索する値が含まれています。 この署名例の場合、任意のポートの任意のIPアドレスからのすべてのパケットがチェックされ、文字列値uid=0|28|root|29|
が含まれていないことを確認します(前のチュートリアルでは、侵害されたホストを示す例として使用されました) )。
content
キーワードは、Suricataの他のほとんどのキーワードと一緒に使用できます。 ヘッダーと特定のアプリケーションプロトコルを対象とするオプションの組み合わせを使用して非常に特定の署名を作成し、正規表現を使用して個々のバイト、文字列、または一致についてパケットの内容を確認できます。
たとえば、次のシグニチャは、DNSトラフィックを調べて、your_domain.com
の内容のパケットを探し、アラートを生成します。
dns.queryの例
alert dns any any -> any any (msg:"DNS LOOKUP for your_domain.com"; dns.query; content:"your_domain.com"; sid:1000001;)
ただし、DNSクエリでドメインYOUR_DOMAIN.COM
が使用されている場合、Suricataではデフォルトで大文字と小文字が区別されるコンテンツの一致が行われるため、このルールは一致しません。 コンテンツの一致を大文字と小文字を区別しないようにするには、nocase;
キーワードをルールに追加します。
大文字と小文字を区別しないdns.queryの例
alert dns any any -> any any (msg:"DNS LOOKUP for your_domain.com"; dns.query; content:"your_domain.com"; nocase; sid:1000001;)
これで、小文字または大文字の任意の組み合わせがcontent
キーワードと一致します。
msg
キーワード
このチュートリアルの署名の例には、署名に関する情報を含むmsg
キーワードがすべて含まれています。 msg
オプションは必須ではありませんが、空白のままにすると、Suricataのログを調べるときにアラートまたはドロップアクションが発生した理由を理解するのが難しくなります。
msg
オプションは、人間が読める形式のアラートの説明になるように設計されています。 あなたまたはログを分析している他の誰かがアラートがトリガーされた理由を理解できるように、説明的でアラートにコンテキストを追加する必要があります。 このチュートリアルの[reference
キーワード](参照キーワード)セクションでは、署名に関する詳細情報へのリンクに使用できるreference
オプションについて学習します。検出するように設計されている問題。
sid
およびrev
キーワード
すべてのSuricata署名には、一意の署名ID(sid
)が必要です。 2つのルールに同じsid
がある場合(次の出力例ではsid:10000000
)、Suricataは起動せず、代わりに次のようなエラーを生成します。
Example Duplicate sid Error. . . 19/11/2021 -- 01:17:40 - <Error> - [ERRCODE: SC_ERR_DUPLICATE_SIG(176)] - Duplicate signature "drop ssh any any -> 127.0.0.0/8 !22 (msg:"blocked invalid ssh"; sid:10000000;)" . . .
独自の署名を作成する場合、範囲1000000-1999999はカスタムルール用に予約されています。 Suricataの組み込みルールは、2200000-2299999の範囲です。 その他のsid
の範囲は、 Emerging Threats SIDAllocationページに記載されています。
sid
オプションは通常、Suricataルールの最後の部分です。 ただし、時間の経過とともに変化するシグニチャのバージョンが複数ある場合は、ルールのバージョンを指定するために使用されるrev
オプションがあります。 たとえば、このチュートリアルの前半のSSHアラートを変更して、ポート2022のSSHトラフィックのみをスキャンすることができます。
revを使用したSSH署名の例
alert ssh any any -> 203.0.113.0/24 2022 (msg:"SSH TRAFFIC on non-SSH port"; sid:1000000; rev:2;)
更新された署名にrev:2
オプションが含まれるようになり、以前のバージョンから更新されたことを示します。
reference
キーワード
reference
キーワードは、ルールが検出することを意図した攻撃または問題に関する詳細情報を見つける場所を説明するためにシグニチャで使用されます。 たとえば、シグネチャが新しい種類のエクスプロイトまたは攻撃方法を検出するように設計されている場合、参照フィールドを使用して、問題を文書化したセキュリティ研究者または企業のWebサイトにリンクできます。
OpenSSL のHeartbleedの脆弱性は、広く公表され調査されているバグの例です。 Suricataには、誤ったTLSパケットをチェックするように設計された署名が付属しており、メインのHeartbleedCVEエントリへの参照が含まれています。
/etc/suricata/rules/tls-events.rules
alert tls any any -> any any (msg:"SURICATA TLS invalid heartbeat encountered, possible exploit attempt (heartbleed)"; flow:established; app-layer-event:tls.invalid_heartbeat_message; flowint:tls.anomaly.count,+,1; classtype:protocol-command-decode; reference:cve,2014-0160; sid:2230013; rev:1;)
署名の強調表示されたreference:cve,2014-0160;
部分に注意してください。 この参照オプションは、特定の問題に関する詳細情報を見つける場所を、Suricataからのアラートを調べているあなたまたはアナリストに通知します。
参照オプションでは、/etc/suricata/reference.config
ファイルの任意のプレフィックスを使用できます。 たとえば、前の例のcve
の代わりにurl
を使用し、2014-0160
CVE識別子の代わりにHeartbleedサイトに直接リンクすることができます。
classtype
キーワード
Suricataは、Linuxディストリビューションのパッケージマネージャーを使用してSuricataパッケージをインストールするときに含まれる、事前構成された一連のカテゴリに従ってトラフィックを分類できます。 デフォルトの分類ファイルは通常/etc/suricata/classification.config
にあり、次のようなエントリが含まれています。
/etc/suricata/classification.config
# # config classification:shortname,short description,priority # config classification: not-suspicious,Not Suspicious Traffic,3 config classification: unknown,Unknown Traffic,3 config classification: bad-unknown,Potentially Bad Traffic, 2 . . .
ファイルヘッダーで示されているように、各分類エントリには3つのフィールドがあります。
- 上記の例では、それぞれ
not-suspicious
、unknown
、およびbad-unknown
の短い機械可読名。 Not Suspicious Traffic
など、アラートで使用される分類の説明。- Suricataによって署名が処理される順序を決定する優先度フィールド。 最高の優先順位は値1です。 優先度の高い分類子を使用する署名は、Suricataがパケットを処理するときに最初にチェックされます。
sid:2100498
シグニチャの例では、クラスタイプはclasstype:bad-unknown;
であり、次の例で強調表示されています。
sid:2100498
alert ip any any -> any any (msg:"GPL ATTACK_RESPONSE id check returned root"; content:"uid=0|28|root|29|"; classtype:bad-unknown; sid:2100498; rev:7; metadata:created_at 2010_09_23, updated_at 2010_09_23;)
シグニチャの暗黙の優先度は2です。これは、/etc/suricata/classification.config
のbad-unknown
クラスタイプに割り当てられる値であるためです。 クラスタイプのデフォルトの優先度を上書きする場合は、priority:n
オプションをシグニチャに追加できます。ここで、n
は1〜255の値です。
target
キーワード
Suricata署名のもう1つの便利なオプションは、target
オプションです。 src_ip
とdest_ip
の2つの値のいずれかに設定できます。 このオプションの目的は、Suricataのアラートログでsource
およびtarget
ホストを正しく識別することです。
たとえば、このチュートリアルの前半のSSH署名は、target:dest_ip;
オプションを使用して拡張できます。
ターゲットフィールドを使用したSSH署名の例
alert ssh any any -> 203.0.113.0/24 2022 (msg:"SSH TRAFFIC on non-SSH port"; target:dest_ip; sid:1000000; rev:3;)
この例では、dest_ip
を使用しています。これは、ルールがサンプルネットワークに着信するSSHトラフィックをチェックするように設計されているため、これが宛先です。 target
オプションをルールに追加すると、eve.json
ログエントリのalert
部分に次の追加フィールドが作成されます。
. . . "source": { "ip": "127.0.0.1", "port": 35272 }, "target": { "ip": "203.0.113.1", "port": 2022 } . . .
Suricataのログにこれらのエントリを含めると、セキュリティ情報およびイベント管理(SIEM)ツールに送信して、共通のホストから発信された可能性のあるアラートや、特定のターゲットに向けられた攻撃を簡単に検索できるようになります。通信網。
結論
このチュートリアルでは、完全なSuricata署名を作成する主要なセクションのそれぞれを調べました。 ルール内のアクション、ヘッダー、およびオプションセクションにはそれぞれ複数のオプションがあり、さまざまなプロトコルを使用したパケットのスキャンをサポートしています。 このチュートリアルでは、どのセクションも詳細には説明していませんが、ルールの構造、および例の重要なフィールドは、独自のルールの作成を開始するのに十分なはずです。
このチュートリアルで説明されているものよりも多くのオプションを含む完全な署名を調べたい場合は、/etc/suricata/rules
ディレクトリ内のファイルを調べてください。 ルールに詳細を知りたいフィールドがある場合は、 Suricataルールドキュメントが、各オプションとその可能な値の意味に関する信頼できるリソースです。
署名の読み取りとテストに慣れたら、このシリーズの次のチュートリアルに進むことができます。 その中で、アラートを生成するだけのデフォルトのIDSモードとは対照的に、疑わしいトラフィックをドロップするために使用されるSuricataのIPSモードを有効にする方法を学習します。