IDP 署名言語の機能強化
IDP 署名言語の構成要素を使用すると、IDP はより効率的な署名を生成し、誤検知を減らすことができます。これは、ルールベースの構文、コンテキスト、一致条件を使用して攻撃パターンを定義するシグネチャ言語を使用することで実現できます。
シグネチャ言語の構成要素の理解
Junos OS の IDP シグネチャ言語コンストラクトは、IDP シグネチャ言語内で利用可能なコンストラクトです。これらの構造は、ネットワークセキュリティ対策の検出および防止機能を強化するように設計されています。この言語は、さまざまなタイプの悪意のあるアクティビティや異常なトラフィックパターンを検出できるシグネチャを定義するための一連のツールと機能を提供します。ネットワーク管理者は、効果的なセキュリティシグネチャを作成できます。構成には、トラフィックパターンの定義、アラートの条件の指定、コンテキスト情報を組み込むためのオプションが含まれており、検出の精度と関連性が向上します。
IDP エンジン コードでは、次のコンストラクトがサポートされています。
-
Depth—特定のパターンを検索するパケットの深さを指定します。深度値は相対値ではありません。 たとえば、深さを 100 と指定できます
<Depth>100</Depth>
-
Offset—パケット内のパターンの検索を開始する場所を指定できます。オフセット値は相対値ではありません。 たとえば、offset の値を 100 に指定できます
<Offset>100</Offset>
-
Within—パターン一致間に最大Nバイトがあることを確認します。パターン一致は、常に前の一致を基準にしています。 たとえば、N の値が 10 の場合
<Attack> <Member>m01</Member> - - - - - - </Attack> <Attack> <Member>m02</Member> - - - - - - <Within>10</Within> - - - - - - </Attack>
-
Distance—IDP エンジンが前のパターン一致を基準にして指定されたパターンを検索する場所を指定できます。これは常に前の一致を基準にしており、距離の値は負の値にすることができます。 たとえば、N の値が 10 の場合、m01 が一致すると、m02 は m01 の一致の末尾の 10 バイト後に出現します
<Attack> <Member>m01</Member> - - - - - - </Attack> <Attack> <Member>m02</Member> - - - - - - <Distance>10</Distance> - - - - - - </Attack>
-
Ipopts- リストされているすべてのipoptsには、セキュリティパッケージで定義された対応する異常があり、デバイスまたはIDPエンジンで設定することで検出できます。
-
rr - ルートの記録
-
eol - リストの終わり
-
nop - 操作なし
-
ts - タイムスタンプ
-
sec - IP セキュリティ
-
esec - IP 拡張セキュリティ
-
lsrr - ルーズソースルーティング
-
ssrr - ストリクト ソース ルーティング
-
satid - ストリーム識別子
-
-
Byte extract— Byte extract キーワードは、長さエンコードされたプロトコルに対するシグネチャの書き込みに役立ち、パケットペイロードをバイト単位で読み取り、後で使用するために変数として保存します。バイト抽出は、相対的および非相対的の両方にすることができます。チェーン攻撃ごとに任意の数のバイト抽出を使用できます例えば:
<Byte_Extract> <Byte>4</Byte> <Offset>12</Offset> <Relative>True</Relative> <Endian>Big</Endian> <Bitmask>0x45</Bitmask> <Multiplier>2</Multiplier> <String>dec</String> <align>True</align> <Name>msg_len</align> </Byte_Extract>
表 1 は、
Byte extract
構成のフィールドをリストしています。表 1: バイト抽出出力フィールド 畑
フィールドの説明
align
バイトアライメントを指定します。
bitmask
AND演算のビットマスク(1〜4バイト)を16進形式で指定します。
bytes
パケットから抽出するバイト数を指定します(1-10)。
endianness
IDPエンジンによって読み取られたバイトを処理するエンディアンを指定します。
multiplier
読み取ったバイトに対して乗算する値を指定します。
offset
IDPエンジンが処理を開始するペイロードのオフセットバイト数を指定します。
relative
最後のパターンマッチを基準にしたオフセットを使用するかどうかを指定します。
string
文字列データを解析するデータ型を指定します。
var-name
他のルール・オプションで参照する変数の名前を指定します。
-
Byte test-Byte test キーワードを使用すると、運用値でバイト フィールドをテストできます。バイト テストは、相対テストと非相対テストの両方を行うことができます。サポートされている演算子は
> , < , =, &, ^ ,<=,>=
で、抽出される最大バイト数は 4. です。例えば:M02 <SLE_Constructs> <Within>50</Within> <Byte_Test> <Byte>4</Byte> <Operator>=</Operator> <Offset>12</Offset> <Value>12</Value> <Relative>True</Relative> <Endian>Big</Endian> <Bitmask>0x45</Bitmask> <String>dec</String> <align>True</align> </Byte_Test>
表 2 は、
Byte test
構成のフィールドをリストしています。表 2: バイト テスト出力フィールド 畑
フィールドの説明
bitmask
AND演算のビットマスク(1〜4バイト)を16進形式で指定します。
bytes
パケットから抽出するバイト数を指定します(1-10)。
endianness
IDPエンジンによって読み取られたバイトを処理するエンディアンを指定します。
negate
演算子が真でないかどうかを確認します。
offset
オフセット変数名またはオフセット値を記載します
operator
抽出された値に対して実行する操作を指定します。
relative
最後のパターンマッチを基準にしたオフセットを使用するかどうかを指定します。
rvalue
変換された値は 右辺値でテストされます。.
string
文字列データを解析するデータ型を指定します。
-
Byte jump— バイト ジャンプ キーワードは、ペイロードの特定の部分をスキップし、非常に特定の場所で検出を実行するために、長さエンコード プロトコル用に記述されたシグネチャに使用されます。バイト ジャンプ値は、相対値と非相対値の両方にすることができます例えば:
<Byte_jump> <Byte>2</Byte> <Offset>8</Offset> <Relative>true</Relative> <Multiplier>2</Multiplier> <From_beginning>true</From_beginning> Endianess>little</Endianess> </Byte_jump>
表 3 は、
Byte jump
コンストラクトのフィールドの一覧です。表 3: バイト ジャンプ出力フィールド 畑
フィールドの説明
align
IDP エンジンによって読み取られたバイトを処理するエンディアンを指定します。
bitmask
AND演算のビットマスク(1〜4バイト)を16進形式で指定します。
bytes
パケットから抽出するバイト数を指定します(1-10)。
endianness
IDP エンジンによって読み取られたバイトを処理するエンディアンを指定します。
from-beginning
ペイロードの先頭からのジャンプを有効にします。
from-end
ペイロードの末尾からのジャンプを有効にします。
multiplier
読み取ったバイトに対して乗算する値を指定します。
offset
使用するオフセット変数名またはオフセット値を指定します。
post-offset
前後にスキップするバイト数を指定します (-65535..65535)。
relative
最後のパターンマッチを基準にしたオフセットを使用するかどうかを指定します。
string
文字列データを解析するデータ型を指定します。
-
Byte math- Byte math キーワードを使用すると、抽出された値、指定した値、または既存の変数に対して算術演算を実行できます。バイト数学値は、結果を新しい結果の変数に格納します。
1) '+' | '-' | '*' | '/' | '<<' | '>>'
などの操作がサポートされています。これは、相対的および非相対的の両方になります例えば:<SLE_Constructs> <Byte_Math> <Byte>4</Byte> <Operator>+</Operator> <Offset>12</Offset> <rValue>12</rValue> <Relative>True</Relative> <Endian>Big</Endian> <Bitmask>0x45</Bitmask> <String>dec</String> <align>True</align> <result_var>var1</result_var> </Byte_Math> <SLE_Constructs>
表 4 は、
Byte math
構成のフィールドの一覧です。表 4: バイト演算出力フィールド 畑
フィールドの説明
bitmask
AND演算のビットマスク(1〜4バイト)を16進形式で指定します。
bytes
パケットから抽出するバイト数を指定します(1-10)。
endianness
読み取られたバイトを処理するエンディアンを指定します。
offset
処理を開始するペイロードのバイト数を指定します(0..65535)。
operator
抽出された値に対して実行する操作を指定します。
relative
最後のパターンマッチを基準にしたオフセットを使用するかどうかを指定します。
result
結果を格納する変数名を指定します。
rvalue
特定の算術演算に使用する値を指定します。
string
文字列データを解析するデータ型を指定します。
-
Is-data-at— is-data-atキーワードを使用すると、ペイロードに指定された場所に必要なデータが含まれていることを確認できます。例えば:
M02 <SLE_Constructs> <Isdataat> <Value>50</Value> <negate>false</negate> </Isdataat> <SLE_Constructs>
表 5 は、
Is-data-at
コンストラクトのフィールドをリストしています。表 5: Isdataat 出力フィールド 畑
フィールドの説明
negate
is-data-at テストの結果を否定します。
offset
オフセット変数名またはオフセット値を指定します。
relative
最後のパターンマッチを基準にしたオフセットを使用するかどうかを指定します
-
Detection Filter— 検出フィルターは、攻撃が一致するレートを定義します。送信元または宛先のカウントは、シグネチャで指定されたオプション値に従って維持されます。検出フィルターは
<SLE_Constructs>
外であり、攻撃のメンバーごとではなく、攻撃ごとに指定されます。同じ送信元IPから10秒の間隔で5回攻撃が検出された場合、攻撃としてフラグが立てられます。 次に例を示します。<Detection_filter> <count>5</count> <scope>src</scope> other options dst/session <time>10</time> </Detection_filter>