序章
このシリーズの最初のチュートリアルでは、Suricataをインストールして構成する方法について説明しました。 このチュートリアルに従うと、Suricataルールセットをダウンロードして更新する方法、および疑わしいアクティビティに関するアラートのログを調べる方法も学習しました。 ただし、そのチュートリアルでダウンロードしたルールは多数あり、ネットワークやサーバーに関連しない可能性のあるさまざまなプロトコル、アプリケーション、攻撃ベクトルを網羅しています。
このチュートリアルでは、Suricata署名がどのように構造化されているか、およびほとんどのルールで一般的に使用されるいくつかの重要なオプションについて学習します。 署名の構造とフィールドを理解する方法に慣れたら、ファイアウォールと組み合わせてサーバーへの最も疑わしいトラフィックについて警告する独自の署名を作成できます。他の外部を使用する必要はありません。ルールセット。
ルールを作成および管理するこのアプローチは、作成した特定のルールを処理するだけでよいため、Suricataをより効率的に使用できることを意味します。 ネットワークで遭遇すると予想される正当で疑わしいトラフィックの大部分を説明するルールセットを入手したら、アクティブな侵入防止(IPS)モードでSuricataを使用して、無効なトラフィックを選択的にドロップし始めることができます。 このシリーズの次のチュートリアルでは、SuricataのIPS機能を有効にする方法について説明します。
前提条件
署名は通常、特定のオペレーティングシステムを必要としないため、このチュートリアルでは、任意のシステムでSuricataを実行できます。 このチュートリアルシリーズをフォローしている場合は、すでに次のものが必要です。
- Suricataは、 Ubuntu 20.04 、 Debian 11 、または RockyLinux8サーバーにインストールされて実行されています。
- ETオープンルールセットを使用してダウンロード
suricata-update
コマンド、およびSuricata署名に含まれています。
Suricata署名の構造を理解する
Suricataの署名は最初は複雑に見えるかもしれませんが、それらがどのように構造化され、Suricataがそれらをどのように処理するかを学ぶと、ネットワークの要件に合わせて独自のルールを作成できるようになります。
大まかに言うと、Suricataの署名は次の3つの部分で構成されています。
- トラフィックがルールに一致したときに実行するアクション。
- ヘッダーは、ホスト、IPアドレス、ポート、プロトコル、およびトラフィックの方向(着信または発信)を記述します。
- オプション、署名ID(
sid
)、ログメッセージ、パケットの内容に一致する正規表現、分類タイプ、および正当なトラフィックと疑わしいトラフィックを絞り込むのに役立つその他の修飾子。
署名の一般的な構造は次のとおりです。
ACTION HEADER OPTIONS
署名のヘッダー部分とオプション部分には、複数のセクションがあります。 たとえば、前のチュートリアルでは、次のルールを使用して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;)
The 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
部分:
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アドレスまたはネットワーク範囲、あるいは特別な値にすることができます any
、すべてのIPアドレスとネットワークに一致します。 The ->
矢印は交通の方向を示しています。
注:署名は無指向性マーカーを使用することもできます <>
両方向のトラフィックに一致します。 ただし、方向マーカーに関する Suricataのドキュメントでは、ほとんどのルールで ->
右一致矢印。
悪意のあるアウトバウンドトラフィック(つまり、ネットワークを離れるトラフィック)についてアラートを送信する場合、SourceフィールドはシステムのIPアドレスまたはネットワーク範囲になります。 宛先は、リモートシステムのIPまたはネットワーク、あるいは特別なものである可能性があります any
価値。
逆に、悪意のある着信トラフィックのアラートを生成する場合は、Sourceフィールドを次のように設定できます。 any
、およびDestinationをシステムのIPアドレスまたはネットワーク範囲に接続します。
Port フィールドを使用して、調べるTCPまたはUDPポートを指定することもできます。 通常、システムから発信されるトラフィックにはランダムなポートが割り当てられるため、 any
値は左側に適切です ->
インジケータ。 宛先ポートは次のようにすることもできます any
すべての着信パケットの内容を調べる場合、または署名を制限して、SSHトラフィックの場合は22、HTTPSの場合は443など、個々のポートのパケットのみをスキャンするように制限できます。
The ip any any -> any any
からのヘッダー sid:2100498
プロトコル、送信元または宛先IP、またはポートに関係なく、allトラフィックに一致する汎用ヘッダーです。 この種のcatchallヘッダーは、インバウンドトラフィックとアウトバウンドトラフィックに疑わしいコンテンツがないかどうかを確認する場合に役立ちます。
Source、Destination、およびPortフィールドも特別なものを使用できることに注意してください !
否定演算子。フィールドの値と一致しないトラフィックを処理します。
たとえば、次の署名により、Suricataはからのすべての着信SSHパケットに対してアラートを送信します。 any
ネットワーク宛てのネットワーク( 203.0.113.0/24
IPブロック)、ポート22宛てのではなく:
alert ssh any any -> 203.0.113.0/24 !22 (sid:1000000;)
このアラートには、パケットまたは分類タイプに関するメッセージが含まれていないため、それほど有用ではありません。 アラートに追加情報を追加し、より具体的な基準に一致させるために、Suricataルールには Options セクションがあり、署名にいくつかの追加設定を指定できます。
オプション
括弧内の引数 (. . .)
Suricata署名には、パケットの特定の部分での照合、ルールの分類、またはカスタムメッセージのログ記録に使用できるさまざまなオプションとキーワード修飾子が含まれています。 ルールのヘッダー引数はIP、ポート、およびプロトコルレベルでパケットヘッダーに作用しますが、オプションはパケット内のに含まれるデータと一致します。
Suricataルールのオプションは、 ;
セミコロンで、通常はkey:value形式を使用します。 一部のオプションには設定がなく、ルールで指定する必要があるのは名前だけです。
前のセクションの署名例を使用して、 msg
値が SSH traffic detected on non-SSH port
アラートの内容を説明する:
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 キーワード。これについては、次のセクションで説明します。
The Content
キーワード
ルールの最も重要なオプションの1つは、 content
キーワード。 例を思い出してください 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|
(前のチュートリアルでは、侵害されたホストを示す例として使用されました)。
The content
キーワードは、Suricataの他のほとんどのキーワードと一緒に使用できます。 ヘッダーと特定のアプリケーションプロトコルを対象とするオプションの組み合わせを使用して非常に特定の署名を作成し、正規表現を使用して個々のバイト、文字列、または一致についてパケットの内容を確認できます。
たとえば、次のシグニチャは、DNSトラフィックを調べて、内容を含むパケットを探します。 your_domain.com
アラートを生成します:
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;
ルールのキーワード:
alert dns any any -> any any (msg:"DNS LOOKUP for your_domain.com"; dns.query; content:"your_domain.com"; nocase; sid:1000001;)
これで、小文字または大文字の任意の組み合わせが引き続き一致します。 content
キーワード。
The msg
キーワード
このチュートリアルの署名例には、すべてが含まれています msg
署名に関する情報を含むキーワード。 ながら msg
オプションは必須ではありません。空白のままにすると、Suricataのログを調べるときにアラートまたはドロップアクションが発生した理由を理解するのが難しくなります。
A msg
オプションは、アラートの人間が読めるテキストの説明になるように設計されています。 あなたまたはログを分析している他の誰かがアラートがトリガーされた理由を理解できるように、説明的でアラートにコンテキストを追加する必要があります。 の中に [reference
このチュートリアルのキーワード](参照キーワード)セクションでは、 reference
シグニチャとそれが検出するように設計されている問題に関する詳細情報にリンクするために使用できるオプション。
The 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ページに記載されています。
The sid
オプションは通常、Suricataルールの最後の部分です。 ただし、時間の経過とともに変化する署名のバージョンが複数ある場合は、 rev
ルールのバージョンを指定するために使用されるオプション。 たとえば、このチュートリアルの前半のSSHアラートを変更して、ポート2022のSSHトラフィックのみをスキャンすることができます。
alert ssh any any -> 203.0.113.0/24 2022 (msg:"SSH TRAFFIC on non-SSH port"; sid:1000000; rev:2;)
更新された署名には、 rev:2
オプション。以前のバージョンから更新されたことを示します。
The reference
キーワード
The reference
キーワードはシグニチャで使用され、ルールが検出することを意図した攻撃または問題に関する詳細情報をどこで見つけるかを説明します。 たとえば、シグネチャが新しい種類のエクスプロイトまたは攻撃方法を検出するように設計されている場合、参照フィールドを使用して、問題を文書化したセキュリティ研究者または企業のWebサイトにリンクできます。
OpenSSL のHeartbleedの脆弱性は、広く公表され調査されているバグの例です。 Suricataには、誤ったTLSパケットをチェックするように設計された署名が付属しており、メインのHeartbleedCVEエントリへの参照が含まれています。
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
ファイル。 例えば、 url
の代わりに使用できます cve
前の例では、の代わりにHeartbleedサイトへの直接リンクがあります 2014-0160
CVE識別子。
The classtype
キーワード
Suricataは、Linuxディストリビューションのパッケージマネージャーを使用してSuricataパッケージをインストールするときに含まれる、事前構成された一連のカテゴリに従ってトラフィックを分類できます。 デフォルトの分類ファイルは通常、 /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;
、これは次の例で強調表示されています。
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です。これは、2に割り当てられる値であるためです。 bad-unknown
のクラスタイプ /etc/suricata/classification.config
. クラスタイプのデフォルトの優先度を上書きする場合は、 priority:n
署名のオプション、ここで n
1から255までの値です。
The target
キーワード
Suricata署名のもう1つの便利なオプションは、 target
オプション。 次の2つの値のいずれかに設定できます。 src_ip
と dest_ip
. このオプションの目的は、 source
と target
Suricataのアラートログのホスト。
たとえば、このチュートリアルの前半のSSH署名は、 target:dest_ip;
オプション:
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
ルールを選択すると、次の追加フィールドが作成されます。 alert
の一部 eve.json
ログエントリ。
. . .
"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モードを有効にする方法を学習します。