開発者ドキュメント

Suricata署名を理解する

序章

このシリーズの最初のチュートリアルでは、Suricataをインストールして構成する方法について説明しました。 このチュートリアルに従うと、Suricataルールセットをダウンロードして更新する方法、および疑わしいアクティビティに関するアラートのログを調べる方法も学習しました。 ただし、そのチュートリアルでダウンロードしたルールは多数あり、ネットワークやサーバーに関連しない可能性のあるさまざまなプロトコル、アプリケーション、攻撃ベクトルを網羅しています。

このチュートリアルでは、Suricata署名がどのように構造化されているか、およびほとんどのルールで一般的に使用されるいくつかの重要なオプションについて学習します。 署名の構造とフィールドを理解する方法に慣れたら、ファイアウォールと組み合わせてサーバーへの最も疑わしいトラフィックについて警告する独自の署名を作成できます。他の外部を使用する必要はありません。ルールセット。

ルールを作成および管理するこのアプローチは、作成した特定のルールを処理するだけでよいため、Suricataをより効率的に使用できることを意味します。 ネットワークで遭遇すると予想される正当で疑わしいトラフィックの大部分を説明するルールセットを入手したら、アクティブな侵入防止(IPS)モードでSuricataを使用して、無効なトラフィックを選択的にドロップし始めることができます。 このシリーズの次のチュートリアルでは、SuricataのIPS機能を有効にする方法について説明します。

前提条件

署名は通常、特定のオペレーティングシステムを必要としないため、このチュートリアルでは、任意のシステムでSuricataを実行できます。 このチュートリアルシリーズをフォローしている場合は、すでに次のものが必要です。

Suricata署名の構造を理解する

Suricataの署名は最初は複雑に見えるかもしれませんが、それらがどのように構造化され、Suricataがそれらをどのように処理するかを学ぶと、ネットワークの要件に合わせて独自のルールを作成できるようになります。

大まかに言うと、Suricataの署名は次の3つの部分で構成されています。

  1. トラフィックがルールに一致したときに実行するアクション
  2. ヘッダーは、ホスト、IPアドレス、ポート、プロトコル、およびトラフィックの方向(着信または発信)を記述します。
  3. オプション、署名ID(sid)、ログメッセージ、パケットの内容に一致する正規表現、分類タイプ、および正当なトラフィックと疑わしいトラフィックを絞り込むのに役立つその他の修飾子。

署名の一般的な構造は次のとおりです。

一般的なルール構造
ACTION HEADER OPTIONS

署名のヘッダー部分とオプション部分には、複数のセクションがあります。 たとえば、前のチュートリアルでは、次のルールを使用してSuricataをテストしました。 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;)

The alert 署名の一部はアクションであり、 ip any any -> any any セクションはヘッダーであり、残りの署名は (msg:GPL ATTACK_RESPONSE... ルールのオプションが含まれています。

次のセクションでは、Suricataルールの各部分を詳しく調べます。

行動

の最初の部分 sid:2100498 この場合、署名はアクションです alert. Suricataシグニチャのアクション部分は、パケットがルールに一致したときに実行するアクションを指定します。 SuricataがIDSモードとIPSモードのどちらで動作しているかに応じて、アクションは次のいずれかになります。

ヘッダー

各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>

プロトコルは、次のいずれかになります。

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 サイン:

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 アラートを生成します:

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 キーワード。

The msg キーワード

このチュートリアルの署名例には、すべてが含まれています msg 署名に関する情報を含むキーワード。 ながら msg オプションは必須ではありません。空白のままにすると、Suricataのログを調べるときにアラートまたはドロップアクションが発生した理由を理解するのが難しくなります。

A msg オプションは、アラートの人間が読めるテキストの説明になるように設計されています。 あなたまたはログを分析している他の誰かがアラートがトリガーされた理由を理解できるように、説明的でアラートにコンテキストを追加する必要があります。 の中に [reference このチュートリアルのキーワード](参照キーワード)セクションでは、 reference シグニチャとそれが検出するように設計されている問題に関する詳細情報にリンクするために使用できるオプション。

The sidrev キーワード

すべての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トラフィックのみをスキャンすることができます。

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 オプション。以前のバージョンから更新されたことを示します。

The reference キーワード

The 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 ファイル。 例えば、 url の代わりに使用できます cve 前の例では、の代わりにHeartbleedサイトへの直接リンクがあります 2014-0160 CVE識別子。

The 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つのフィールドがあります。

例では 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です。これは、2に割り当てられる値であるためです。 bad-unknown のクラスタイプ /etc/suricata/classification.config. クラスタイプのデフォルトの優先度を上書きする場合は、 priority:n 署名のオプション、ここで n 1から255までの値です。

The target キーワード

Suricata署名のもう1つの便利なオプションは、 target オプション。 次の2つの値のいずれかに設定できます。 src_ipdest_ip. このオプションの目的は、 sourcetarget Suricataのアラートログのホスト。

たとえば、このチュートリアルの前半の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 ルールを選択すると、次の追加フィールドが作成されます。 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モードを有効にする方法を学習します。

モバイルバージョンを終了