このトピックでは、アラート通知用テンプレートを定義する方法について説明します。ESA(Event Stream Analysis)では、アラートに使用可能なテンプレートを定義できます。テンプレートを定義するには、FreeMarkerとESAデータ モデルに関する十分な知識が必要です。FreeMarkerの詳細については、「FreeMarker Template Author's Guide」を参照してください。
ESAデータ モデル
以下に示すESAアラート ルールについて考えてみます。
@
Name
(
'module_144d43f5_f0b4_4cd0_8c6c_5ce65c37e624_Alert'
)
@Description(
'Brute Force Login To Same Destination'
)
@RSAAlert(oneInSeconds=0, identifiers={
"ip_dst"
})
SELECT
*
FROM
Event (ec_activity =
'Logon'
,ec_theme =
'Authentication'
,ec
outcome = 'Failure'
,ip_dst
IS
NOT
NULL
)
.std:groupwin(ip_dst)
.win:time_length_batch(60 seconds, 2)
GROUP
BY
ip_dst
HAVING
COUNT
(*) = 2;
上のルールが発行されると、生成されたアラートは、複数のメタ値を持つNextGenセッションに似た2個のイベントで構成されます。FreeMarkerのテンプレートevaluatorに渡されるアラート データ オブジェクトは次のようになります。
(root) | +- id = "4e67012f-9c53-4f0b-ac44-753e2c982b79" // Unique identifier for each alert | +- severity = 1 // The severity of the alert +- time = 2013-12-31T11:02Z // The alert time (needs a ?datetime for proper rendering) | +- moduleType = "ootb" // The module type | +- moduleName = "Brute Force Login To Same Destination" // A description of the module | +- statement = "module_144d43f5_f0b4_4cd0_8c6c_5ce65c37e624_Alert" // The name of the EPL statement | +- events // The constituent events - as a sequence of event maps | +- [0] // offset 0 (i.e. the first constituent event) | | | | | +- event_cat_name = "User.Activity.Failed Logins" | +- device_class = "Firewall" // event meta (accessible as ${events[0].device_class}$) | | | +- event_source_id = "uttam:50002:1703395" // Investigation URI to the individual session (used by SA) | | | +- ... // Other meta | | | +- sessionid = 1703395 // NextGen sessionid | | | +- time = 1388487764 // event/session time at NextGen source (as a long Unix timestamp) | | | +- user_dst = "user5" | +- [1] // offset 1 (i.e. the second consituent event) | +- device_class = "Firewall" | +- event_cat_name = "User.Activity.Failed Logins" | +- event_source_id = "uttam:50002:1703405" | +- ... | +- sessionid = 1703405 | +- time = 1388487766 | +- user_dst = "user5"
データ モデルで利用できるテンプレート変数には次の2つのタイプあります。
- アラート メタ データ: これらは、ステートメント名、モジュール名、アラートID、アラートの時刻、重大度など、アラート レベルの詳細を保持します。FreeMarkerの用語では、これらはアラート インスタンス自体に関連づけられたトップ レベルの変数であり、
${moduleName}
のようにそれらの名前で単純に参照できます。time
メタは特別です。これはDate
型で、適切にレンダリングするには、?datetime
というサフィックスを追加する必要があります。
- 要素イベント メタ データ:これらは、アラートを構成する個々のイベントのセッション メタ フィールドを含みます。アラートは複数のイベントで構成できます。そのため、同一のアラートにマップが複数存在する場合があります。これらは、FreeMarkerのテンプレートevaluatorへのハッシュのシーケンスとして表示され、参照できる必要があります。たとえば、アラートが2個のイベント要素で構成されている場合、最初のevent_source_idは
${events[0].event_source_id}
として利用でき、2つ目は${events[1].event_source_id
}としてアクセスできます。また、複数値のメタ フィールドに注意する必要があります。それらのフィールドはシーケンスとして扱う必要があります。たとえば、${events[0].alias_host}
はシーケンスであるため、機能しません。
注:指定されたアラートの要素イベントで利用可能なメタデータは、EPL SELECT句によって決定されます。たとえば、SELECT sessionid, time FROM ...
のアラートでは、利用できるメタ値は2つのみ(sessionid、time)です。SELECT * FROM Event ...
の要素イベントでは、Event
タイプで、null以外の値を持つすべてのメタ フィールドを利用できます。
すべてのアラート出力に存在するとは限らないメタ キーをテンプレートで使用している場合、FreeMarkerによるデフォルト値のプロビジョニングの利用を検討してください。
たとえば、Id=${id},ec_outcome=${ec_outcome}というテキストが含まれていて、メタ キーec_outcome
を含まないアラートに対して適用する場合、このテンプレートは適用できません。このような場合、不足している値のプレースホルダーとして、${ec_outcome!”default”}
を使用できます。