序章

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

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

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

前提条件

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

Suricata署名の構造を理解する

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

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

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

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

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

署名のヘッダー部分とオプション部分には、複数のセクションがあります。 たとえば、前のチュートリアルでは、sid2100498のルールを使用して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:2100498ip 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-0160CVE識別子の代わりに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-suspiciousunknown、および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.configbad-unknownクラスタイプに割り当てられる値であるためです。 クラスタイプのデフォルトの優先度を上書きする場合は、priority:nオプションをシグニチャに追加できます。ここで、nは1〜255の値です。

targetキーワード

Suricata署名のもう1つの便利なオプションは、targetオプションです。 src_ipdest_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モードを有効にする方法を学習します。