カスタムパターン
- Last Updated: April 5, 2026
- 21 minute read
- Flowmon Products
- Flowmon Anomaly Detection System
- Documentation
Flowmon ADSアプリケーションでは、シンプルなカスタム振る舞いパターンを作成できます。これらのパターンは、[設定] → [処理] → [カスタムパターン]で定義できます。これらのパターンは、BPATTERNSメソッドによる処理を有効にできます。パターンは、バイフローレコードからのシンプルなSQLクエリとして定義されます(「バイフローエントリのフィールド」を参照してください)。
バイフローレコードは、ペアになっているフロー(リクエストと返信)によって構成されます。方向ごとに異なるフロー項目は、元の方向に従ってプレフィックス付きでバイフローレコードに保存されます。たとえば、転送されたデータの量はreq_transferredフィールドとrep_transferredフィールドに保存されます。両方の元のフローで同じフロー項目は、リクエストフローに従って1回だけ保存されます。たとえば、バイフローレコードの送信元IPアドレスは、返信では宛先として指定されますが、リクエストフローの送信元IPアドレスに相当します。ペアになっていないフローの場合は、リクエストフローに対応する項目のみがバイフローレコードに入力されます。
カスタムパターンの編集可能なパラメータには、[パターンコード]、[パターンの説明]、[パターン詳細]**、パターン式パラメータがあります。
-
[パターンコード]では、パターン(BPATTERNSメソッドで指定されたパターンをアクティブ化(非アクティブ化)するためのパラメータとして使用されます)を指定します。
-
[パターンの説明]パラメータでは、パターンによって検知されたイベントについて説明します。
-
[パターン詳細]は、イベント詳細の部分文字列として使用されます。
-
パターン式は、where句、having句、イベントソースで表されます。
カスタム振る舞いパターン用に生成されるイベント詳細文字列には以下が含まれます。
-
パターンの短い説明([パターン詳細]パラメータから取得)
-
イベントソースからイベントターゲットへの発信フローの数
-
イベントターゲットからイベントソースへの受信フローの数
-
イベントソースがイベントターゲットに送信したデータの数
-
イベントソースがイベントターゲットから受信したデータの数
-
イベントソースがイベントターゲットに送信したパケットの数
-
イベントソースがイベントターゲットから受信したパケットの数
-
イベントターゲットの数
送信元IPアドレスと宛先IPアドレスを含むバイフローテーブルがあります。[イベントソース]オプションを使用して、イベントのイベントソースとして送信元IPアドレス(デフォルトオプション)または宛先IPアドレスを使用するかどうかを指定できます。宛先IPアドレスをイベントソースとして選択した場合、宛先IPアドレスによってグループ化されたレコードからイベントが検知され、宛先IPアドレスがイベントソースとして使用され、関連するすべてのIPアドレスがイベントターゲットになります。イベントソースに応じて、ターゲットIPと通信していたすべての宛先IPアドレスまたは送信元IPアドレスがイベントターゲットとして表示されます。たとえば、SRVNA検知メソッドでは、宛先IPアドレスによるグループ化を使用し、使用できないターゲット(サービスのIPアドレス)をイベントソースとして、すべての送信元IPアドレス(クライアントの接続試行)をイベントターゲットとしてマークします。
where句とhaving句
パターン自体は、SQL形式で記述されたwhere式とhaving式で定義されます。where式とhaving式で有効なSQLite言語のすべての構成要素がサポートされます。これには下記の演算子と関数が含まれます。文字列を囲むために一重引用符(アポストロフィ)が必要です。これは両方の式に当てはまります。論理式の要素をカッコ内に挿入できます。
where式は、定義済みの条件に基づき、論理演算子と関数を使用してレコードをフィルタリングすることを目的としています。having式では、これらの結果を使用する集計関数を使用できます。つまり、having式とwhere式の違いは、where式がテーブルの行を操作して個々の行をフィルタリングし、その後、havingが集計関数を使用してレコードのグループを操作するオプションを追加する、ということです。以下の集計関数がサポートされます。
-
SUM: 値の合計
-
AVG: 値の平均
-
COUNT: 値の数
-
MAX: 最大値
-
MIN: 最小値
-
VARIANCE: 値の分散
-
STDDEV: 標準偏差
集計関数の一覧とその説明については、SQLiteのマニュアルを参照してください(「集計関数」を参照してください)。where式とhaving式の詳細については、それぞれこちらとこちらを参照してください。
「カスタムパターンの例」を参照してください。
バイフローエントリのフィールド
以下のフィールドをフィルタリングに使用できます。
-
source_ip_address: 内部形式の送信元IPアドレス。「変換機能のための関数」を参照してください。
-
destination_ip_address: 内部形式の宛先IPアドレス。「変換機能のための関数」を参照してください。
-
protocol: プロトコル番号。
-
source_port: 送信元ポート番号。
-
destination_port: 宛先ポート番号。
-
req_duration: リクエストフローのミリ秒単位の時間(整数)。
-
rep_duration: レスポンスフローのミリ秒単位の時間(整数)。
-
req_transferred: リクエストフローの合計送信バイト数(整数)。
-
rep_transferred: レスポンスフローの合計送信バイト数(整数)。
-
req_packets: リクエストフローの合計パケット数(整数)。
-
rep_packets: レスポンスフローの合計パケット数(整数)。
-
req_flags: リクエストフローのTCPフラグ。適切なフィルタリング関数を使用することをお勧めします(「変換機能のための関数」を参照してください)。
-
rep_flags: レスポンスフローのTCPフラグ。
-
src_mac: 10進数の送信元MACアドレス。「変換機能のための関数」を参照してください。
-
dst_mac: 10進数の宛先MACアドレス。「変換機能のための関数」を参照してください。
-
src_as: 送信元の自律システム番号。
-
dst_as: ターゲットの自律システム番号。
-
src_country: 送信元IPアドレスに割り当てられる国番号(「国の一覧」を参照してください)。
-
dst_country: 宛先IPアドレスに割り当てられる国番号。
-
http_host: HTTPホスト名の最後の32文字。DNSクエリの場合は、クエリされたDNS名が含まれる場合があります。
-
http_url: HTTP GETリクエストで取得されたURLの最初の64文字。
-
src_user_id: 送信元IPアドレス(Flowmon OSの設定の場合は、Active Directoryから取得したもの)を使用しているユーザのID。
-
dst_user_id: 宛先IPアドレスを使用しているユーザのID。
-
tcp_ttl: TCP TTL。TCP SYNフラグが設定されている場合にのみ設定されます。
-
tcp_window: TCPウィンドウ。TCP SYNフラグが設定されている場合にのみ設定されます。
-
syn_size: リクエストフローのTCP SYNパケットのサイズ。
-
ua_os: オペレーティングシステムの番号(HTTPユーザエージェントから取得されます。「オペレーティングシステムの一覧」を参照してください)。65535はOSが不明であることを意味します。
-
ua_os_version: オペレーティングシステムのバージョン番号(HTTPユーザエージェントから取得されます)。10進数で、その整数部はメジャーバージョンを、小数部はマイナーバージョンを表します。65535以上の番号はバージョンが不明であることを意味します。
-
paired: バイフローにフローペア全体が含まれているか、単一のペアになっていないフローのみがあるかを示します。数値は0または1です。
-
ja3_fingerprint: クライアントのTLS JA3フィンガープリントの値。これは、16進数字の32文字長のストリングです。
カスタムパターン定義で使用できる変数:
-
#src_filter#: 割り当てられているフィルタ。送信元IPアドレスに適用されます。
-
#dst_filter#: 割り当てられているフィルタ。宛先IPアドレスに適用されます。
-
#neg_src_filter#: 割り当てられているフィルタのネガティブバージョン。送信元IPアドレスに適用されます(IPアドレスは指定されたフィルタの範囲外になければなりません)。
-
#neg_dst_filter#: 割り当てられているフィルタのネガティブバージョン。宛先IPアドレスに適用されます。
カスタムパターン定義で使用できる演算子。
-
=: 等価テスト(source_port = 80)
-
<>: 不等テスト(protocol <> 6)
-
>: より大きい(req_transferred > 102400)
-
<: より小さい(req_duration < 10)
-
>=: 以上
-
<=: 以下
-
IN: 指定されたセットに属する(destination_port IN (80, 443))
-
BETWEEN . . .AND: 指定された範囲に属する(req_duration BETWEEN 10 AND 60 (指定された境界を含みます))
-
LIKE: 指定された部分文字列を含む文字列(http_host LIKE '%facebook%' (パーセント記号は任意の文字列を表します))。
-
NOT: 指定された制約の否定(NOT (req_duration < 10 AND source_port = 80))
-
+: 加算(req_transferred + rep_transferred >= 1048576)
-
−: 減算(req_duration - rep_duration > 3)
-
*: 乗算(req_transferred * paired > 0)
-
*: 除算(req_transferred / req_packets = 40)
パターンの関数
カスタムパターン定義で使用できる関数:
- matchflags(flags, required, forbidden): TCPフラグと一致させるための関数。flagsはreq_flagsまたはrep_flagsに置き換える必要があります。この関数は、flagsにすべてのrequiredフラグが含まれていて*forbiddenフラグが含まれていない場合(および含まれていない場合にのみ) 0を返します。この関数は、0との等価テストとして使用する必要があります。
例:
- matchflags('RUAPSF', 'AP', '-') = 0
- matchflags('..APS.', 'A', 'F') = 0
- matchflags('..APS.', 'A', 'S') <> 0
- matchflags('..APS.', '-', 'R') = 0
-
ip_to_int(readable_ip): IPアドレスを内部形式に変換するための関数。
-
mac_to_int(readable_mac): MACアドレスを内部形式に変換するための関数。
国の一覧
| LAN |
ローカルエリアネットワーク |
0 |
| AF |
アフガニスタン |
4 |
| AX |
オーランド諸島 |
248 |
| AL |
アルバニア |
8 |
| DZ |
アルジェリア |
12 |
| AS |
米国領サモア |
16 |
| AD |
アンドラ |
20 |
| AO |
アンゴラ |
24 |
| AI |
アンギラ |
660 |
| AQ |
南極 |
10 |
| AG |
アンティグアバーブーダ |
28 |
| AR |
アルゼンチン |
32 |
| AM |
アルメニア |
51 |
| AW |
アルバ |
533 |
| AU |
オーストラリア |
36 |
| AT |
オーストリア |
40 |
| AZ |
アゼルバイジャン |
31 |
| BS |
バハマ |
44 |
| BH |
バーレーン |
48 |
| BD |
バングラデシュ |
50 |
| BB |
バルバドス |
52 |
| BY |
ベラルーシ |
112 |
| BE |
ベルギー |
56 |
| BZ |
ベリーズ |
84 |
| BJ |
ベナン |
204 |
| BM |
バミューダ |
60 |
| BT |
ブータン |
64 |
| BO |
ボリビア多民族国 |
68 |
| BQ |
ボネール、シントユースタティウスおよびサバ |
535 |
| BA |
ボスニアヘルツェゴビナ |
70 |
| BW |
ボツワナ |
72 |
| BV |
ブーヴェ島 |
74 |
| BR |
ブラジル |
76 |
| IO |
イギリス領インド洋地域 |
86 |
| BN |
ブルネイダルサラーム |
96 |
| BG |
ブルガリア |
100 |
| BF |
ブルキナファソ |
854 |
| BI |
ブルンジ |
108 |
| KH |
カンボジア |
116 |
| CM |
カメルーン |
120 |
| CA |
カナダ |
124 |
| CV |
カーボベルデ |
132 |
| KY |
ケイマン諸島 |
136 |
| CF |
中央アフリカ共和国 |
140 |
| TD |
チャド |
148 |
| CL |
チリ |
152 |
| CN |
中国 |
156 |
| CX |
クリスマス島 |
162 |
| CC |
ココス(キーリング)諸島 |
166 |
| CO |
コロンビア |
170 |
| KM |
コモロ |
174 |
| CG |
コンゴ |
178 |
| CD |
コンゴ民主共和国 |
180 |
| CK |
クック諸島 |
184 |
| CR |
コスタリカ |
188 |
| CI |
コートジボワール |
384 |
| HR |
クロアチア |
191 |
| CU |
キューバ |
192 |
| CW |
キュラソー島 |
531 |
| CY |
キプロス |
196 |
| CZ |
チェコ共和国 |
203 |
| DK |
デンマーク |
208 |
| DJ |
ジブチ |
262 |
| DM |
ドミニカ |
212 |
| DO |
ドミニカ共和国 |
214 |
| EC |
エクアドル |
218 |
| EG |
エジプト |
818 |
| SV |
エルサルバドル |
222 |
| GQ |
赤道ギニア |
226 |
| ER |
エリトリア |
232 |
| EE |
エストニア |
233 |
| ET |
エチオピア |
231 |
| FK |
フォークランド諸島(マルビナス諸島) |
238 |
| FO |
フェロー諸島 |
234 |
| FJ |
フィジー |
242 |
| FI |
フィンランド |
246 |
| FR |
フランス |
250 |
| GF |
フランス領ギアナ |
254 |
| PF |
フランス領ポリネシア |
258 |
| TF |
フランス領南方・南極地域 |
260 |
| GA |
ガボン |
266 |
| GM |
ガンビア |
270 |
| GE |
ジョージア |
268 |
| DE |
ドイツ |
276 |
| GH |
ガーナ |
288 |
| GI |
ジブラルタル |
292 |
| GR |
ギリシャ |
300 |
| GL |
グリーンランド |
304 |
| GD |
グレナダ |
308 |
| GP |
グアドループ島 |
312 |
| GU |
グアム島 |
316 |
| GT |
グアテマラ |
320 |
| GG |
ガーンジー島 |
831 |
| GN |
ギニア |
324 |
| GW |
ギニアビサウ |
624 |
| GY |
ガイアナ |
328 |
| HT |
ハイチ |
332 |
| HM |
ハード島およびマクドナルド諸島 |
334 |
| VA |
教皇庁(バチカン市国) |
336 |
| HN |
ホンジュラス |
340 |
| HK |
香港 |
344 |
| HU |
ハンガリー |
348 |
| IS |
アイスランド |
352 |
| IN |
インド |
356 |
| ID |
インドネシア |
360 |
| IR |
イランイスラム共和国 |
364 |
| IQ |
イラク |
368 |
| IE |
アイルランド |
372 |
| IM |
マン島 |
833 |
| IL |
イスラエル |
376 |
| IT |
イタリア |
380 |
| JM |
ジャマイカ |
388 |
| JP |
日本 |
392 |
| JE |
ジャージー島 |
832 |
| JO |
ヨルダン |
400 |
| KZ |
カザフスタン |
398 |
| KE |
ケニア |
404 |
| KI |
キリバス |
296 |
| KP |
朝鮮民主主義人民共和国 |
408 |
| KR |
大韓民国 |
410 |
| KW |
クウェート |
414 |
| KG |
キルギスタン |
417 |
| LA |
ラオス人民民主共和国 |
418 |
| LV |
ラトビア |
428 |
| LB |
レバノン |
422 |
| LS |
レソト |
426 |
| LR |
リベリア |
430 |
| LY |
リビア |
434 |
| LI |
リヒテンシュタイン |
438 |
| LT |
リトアニア |
440 |
| LU |
ルクセンブルグ |
442 |
| MO |
マカオ |
446 |
| MK |
北マケドニア共和国 |
807 |
| MG |
マダガスカル |
450 |
| MW |
マラウイ |
454 |
| MY |
マレーシア |
458 |
| MV |
モルディブ |
462 |
| ML |
マリ |
466 |
| MT |
マルタ |
470 |
| MH |
マーシャル諸島 |
584 |
| MQ |
マルティニーク島 |
474 |
| MR |
モーリタニア |
478 |
| MU |
モーリシャス |
480 |
| YT |
マヨット島 |
175 |
| MX |
メキシコ |
484 |
| FM |
ミクロネシア連邦 |
583 |
| MD |
モルドバ共和国 |
498 |
| MC |
モナコ |
492 |
| MN |
モンゴル |
496 |
| ME |
モンテネグロ |
499 |
| MS |
モントセラト島 |
500 |
| MA |
モロッコ |
504 |
| MZ |
モザンビーク |
508 |
| MM |
ミャンマー |
104 |
| NA |
ナミビア |
516 |
| NR |
ナウル |
520 |
| NP |
ネパール |
524 |
| NL |
オランダ |
528 |
| NC |
ニューカレドニア |
540 |
| NZ |
ニュージーランド |
554 |
| NI |
ニカラグア |
558 |
| NE |
ニジェール |
562 |
| NG |
ナイジェリア |
566 |
| NU |
ニウエ |
570 |
| NF |
ノーフォーク島 |
574 |
| MP |
北マリアナ諸島 |
580 |
| NO |
ノルウェー |
578 |
| OM |
オマーン |
512 |
| PK |
パキスタン |
586 |
| PW |
パラオ |
585 |
| PS |
パレスチナ国 |
275 |
| PA |
パナマ |
591 |
| PG |
パプアニューギニア |
598 |
| PY |
パラグアイ |
600 |
| PE |
ペルー |
604 |
| PH |
フィリピン |
608 |
| PN |
ピトケアン島 |
612 |
| PL |
ポーランド |
616 |
| PT |
ポルトガル |
620 |
| PR |
プエルトリコ |
630 |
| QA |
カタール |
634 |
| RE |
レユニオン |
638 |
| RO |
ルーマニア |
642 |
| RU |
ロシア連邦 |
643 |
| RW |
ルワンダ |
646 |
| BL |
サンバルテルミー島 |
652 |
| SH |
セントヘレナ・アセンションおよびトリスタンダクーニャ |
654 |
| KN |
セントクリストファーネービス |
659 |
| LC |
セントルシア |
662 |
| MF |
サンマルタン(フランス領) |
663 |
| PM |
サンピエール島およびミクロン島 |
666 |
| VC |
セントビンセントおよびグレナディーン諸島 |
670 |
| WS |
サモア |
882 |
| SM |
サンマリノ |
674 |
| ST |
サントメプリンシペ |
678 |
| SA |
サウジアラビア |
682 |
| SN |
セネガル |
686 |
| RS |
セルビア |
688 |
| SC |
セーシェル |
690 |
| SL |
シエラレオネ |
694 |
| SG |
シンガポール |
702 |
| SX |
シントマールテン(オランダ領) |
534 |
| SK |
スロバキア |
703 |
| SI |
スロベニア |
705 |
| SB |
ソロモン諸島 |
90 |
| SO |
ソマリア |
706 |
| ZA |
南アフリカ |
710 |
| GS |
サウスジョージアおよびサウスサンドウィッチ諸島 |
239 |
| SS |
南スーダン |
728 |
| ES |
スペイン |
724 |
| LK |
スリランカ |
144 |
| SD |
スーダン |
729 |
| SR |
スリナム |
740 |
| SJ |
スヴァールバル諸島およびヤンマイエン島 |
744 |
| SZ |
スワジランド |
748 |
| SE |
スウェーデン |
752 |
| CH |
スイス |
756 |
| SY |
シリアアラブ共和国 |
760 |
| TW |
中国台湾省 |
158 |
| TJ |
タジキスタン |
762 |
| TZ |
タンザニア連合共和国 |
834 |
| TH |
タイ |
764 |
| TL |
東ティモール |
626 |
| TG |
トーゴ |
768 |
| TK |
トケラウ |
772 |
| TO |
トンガ |
776 |
| TT |
トリニダードトバゴ |
780 |
| TN |
チュニジア |
788 |
| TR |
トルコ |
792 |
| TM |
トルクメニスタン |
795 |
| TC |
タークスカイコス諸島 |
796 |
| TV |
ツバル |
798 |
| UG |
ウガンダ |
800 |
| UA |
ウクライナ |
804 |
| AE |
アラブ首長国連邦 |
784 |
| GB |
イギリス |
826 |
| US |
アメリカ合衆国 |
840 |
| UM |
合衆国領有小離島 |
581 |
| UY |
ウルグアイ |
858 |
| UZ |
ウズベキスタン |
860 |
| VU |
バヌアツ |
548 |
| VE |
ベネズエラボリバル共和国 |
862 |
| VN |
ベトナム |
704 |
| VG |
英領バージン諸島 |
92 |
| VI |
米領バージン諸島 |
850 |
| WF |
ウォリスフトゥーナ |
876 |
| EH |
西サハラ |
732 |
| YE |
イエメン |
887 |
| ZM |
ザンビア |
894 |
| ZW |
ジンバブエ |
716 |
オペレーティングシステムの一覧
| ID |
OS名 |
ID |
OS名 |
ID |
OS名 |
||
| 1 |
AIX |
26 |
Arch Linux |
51 |
Nintendo Wii U |
||
| 2 |
Amiga OS |
27 |
CentOS |
52 |
OpenBSD |
||
| 3 |
Android |
28 |
Debian |
53 |
OpenVMS |
||
| 4 |
iOS |
29 |
Fedora |
54 |
OS/2 |
||
| 5 |
Mac OS |
30 |
Gentoo |
55 |
OS/2 Warp |
||
| 6 |
Mac OS X |
31 |
Knoppix |
56 |
Palm OS |
||
| 7 |
AROS |
32 |
Kanotix |
57 |
OPClinuxOS |
||
| 8 |
Bada |
33 |
Linspire |
58 |
QNX |
||
| 9 |
BeOS |
34 |
Mageia |
59 |
RISC OS |
||
| 10 |
BlackBerry |
35 |
Mandriva |
60 |
Sailfish |
||
| 11 |
BlackBerry Tablet |
36 |
Mint |
61 |
SkyOS |
||
| 12 |
Brew |
37 |
Red Hat |
62 |
Solaris |
||
| 13 |
Chrome OS |
38 |
Slackware |
63 |
Syllable |
||
| 14 |
Danger Hiptop |
39 |
SUSE |
64 |
Symbian |
||
| 15 |
Darwin |
40 |
Ubuntu |
65 |
Tizen |
||
| 16 |
DragonFly BSD |
41 |
VectorLinux |
66 |
Ubuntu Touch |
||
| 17 |
Firefox OS |
42 |
LiveArea |
67 |
webOS |
||
| 18 |
FreeBSD |
43 |
MeeGo |
68 |
Windows |
||
| 19 |
GNU OS |
44 |
MINIX |
69 |
Windows 3.x |
||
| 20 |
Haiku OS |
45 |
MorphOS |
70 |
Windows CE |
||
| 21 |
HP-UX |
46 |
MSN TV (WebTV) |
71 |
Windows Phone |
||
| 22 |
Inferno |
47 |
NetBSD |
72 |
Windows Xbox |
||
| 23 |
IRIX |
48 |
Nintendo 3DS |
73 |
XrossMediaBar |
||
| 24 |
Joli OS |
49 |
Nintendo DS |
||||
| 25 |
Linux |
50 |
Nintendo Wii |
カスタムパターンの例
192.168.1.10で実行されているSSHハニーポットでの通信を検知する例(5つを超えるパケットを含むフローのみが対象):
where式:
#neg_src_filter# AND destination_ip_address = ip_to_int('192.168.1.10') AND destination_port = 22
AND protocol = 6 AND matchflags(req_flags, 'S', '-') = 0 AND req_packets > 5
sambaプロトコル経由で合計1GBを超えるデータを伝送しているステーションを検知する例:
where式:
#src_filter# AND destination_port = 445 AND protocol = 6
having式:
SUM(req_transferred) + SUM(rep_transferred) > 1048576000
ポートスキャン検知の例。この場合、having式によってスキャン試行の最小回数が制限されています。
where式:
#src_filter# AND destination_port < 1024 AND protocol = 6 AND req_flags IN ('....S.', '......', '.....F', 'U.P..F')
having式:
COUNT(*) >= 100