警告の設定テンプレート
Sophos Linux Sensor (SLS) を使用すると、ユーザーは、ワークフローに最適なデータを選択できます。これを実現するために、警告テンプレートを使用した警告のカスタムフォーマットをサポートしています。警告は、デフォルトの JSON 形式ではなく、Go テンプレートを使用して UTF-8 文字列に変換できます。
警告テンプレートは、警告ディスパッチャの outputs
セクションに一覧表示されている個々の出力の template
フィールド、または alert_output
の最上位レベルで設定されている文字列で、テンプレートが未設定の出力にテンプレートを適用します。これによって、特定の出力に対して任意で上書きできる、グローバル警告テンプレートを設定できます。
このガイドでは、基本的な使用方法といくつかの一般的なシナリオについて説明します。詳細は、Go テンプレートのドキュメントを参照してください。
警告テンプレートの例
警告テンプレートを作成するには、まず、警告の出力に含める警告フィールドの名前を選択します。警告フィールドは、Go テンプレート {{.FieldName}}
構文を使用して選択します。構文は Mustache テンプレートと似ていますが、Go テンプレート言語は、はるかに強力です。たとえば、警告のポリシー名、スレッドグループ ID、プログラム名をログに記録するには、次の手順を実行します。
template: `{{.StrategyName}} - {{.ProcessInfo.Tgid}} {{.ProcessInfo.Program.Path}}`
これによって、次の文字列のような警告が生成されます。
WGET - Blacklist 6620 /usr/bin/wget
このテンプレートでは、警告の ProcessInfo
構造体から入れ子の TGID 値が選択されました。テンプレートパラメータを除くすべてのパラメータが、プレーンテキストとして渡されたことに注意してください。このため、ポリシー名とログステートメントの残りの部分との間にハイフンを追加して、わかりやすくすることができました。さらに一歩進んで、警告を JSON としてフォーマットすることもできます。
template: `{"policy_name":"{{.StrategyName}}","process_tgid":"{{.ProcessInfo.Tgid}}"}`
これによって、次の JSON 文字列が生成されます。
{"policy_name":"Blacklist wget","process_tgid":"22144"}
別のシステムとの互換性を保つために、完全な警告 JSON を別の JSON オブジェクトにラッピングする必要がある場合、SLS では AlertJSON
というヘルパー関数を使用できます。次の例では、id
フィールド、timestamp
フィールド、および payload
というフィールドに割り当てられた完全な警告ペイロードを含む、新しい JSON オブジェクトが作成されます。
template: `{"id":"{{.UUID}}","timestamp":"{{.Timestamp}}","payload":{{AlertJSON .}}}`
新しいテンプレートの出力を適用する前に、必ずテストして、出力の形式が予想どおりであることを確認するようにしてください。これは、JSON など、他のシステムが解析する可能性のある形式では特に重要です。この例は、たいていのログシステムとデフォルトで互換性のない複数行出力を使用しないように、意図的に 1行に圧縮されています。
全体的に見ると、警告テンプレートは、警告フォーマットを拡張して、より適切に既存のワークフローに統合するための強力で柔軟な方法です。そして、Alert Webhook 機能と組み合わせることで、SLS を他のシステムと簡単に統合するための強力な方法になります。センサーは起動時に、テスト警告を使用して、すべてのテンプレートをサイレントにコンパイルしてテストします。これによって、センサーは、テンプレートの構文が正しいこと、およびテンプレートをエラーなしで警告に正常に適用できることを確認できます。このプロセスによって何も出力されません。
警告テンプレートを使用したフィルタリング
Go テンプレートの if
文を使用して、特定の出力場所に警告を送信することができます。これは、SLS が空の警告を出力場所に送信しないことにより機能します。たとえば、優先度の高い警告のみを Slack チャネルに送信することができます。
次に例を示します。
alert_output:
outputs:
# Send alerts to Slack using their webhook JSON format
- type: webhook
enabled: true
url: https://hooks.slack.com/services/123ABC/ab914B12eeigVh2xZ
template: |
{{- if eq .Priority 4 -}}
{"text": "New Sophos alert {{.PolicyType}} {{.Description}}"}
{{- end -}}
# Send all alerts except for Heartbeat alerts
- type: webhook
enabled: true
url: https://hooks.slack.com/services/123ABC/ab914B12eeigVh2xZ
template: |
{{- if ne (print .PolicyType) "Heartbeat" -}}
{"data": {{AlertJSON .}}}
{{- end -}}
注
上のテンプレートの「-」は、テンプレートの前後にある空白文字を無視するように Go に指示します。これは、警告 JSON の前後に、空の新しい行が表示されないようにするために重要です。
Go テンプレートの If ステートメントの詳細は、こちらを参照してください。使用可能なブール関数と比較関数の詳細は、Go のこちらの文章を参照してください。
警告テンプレートの enum
SLS 警告では、特定の数の可能な値がある多くのフィールドで enum が使用されます。使いやすさのため、これらの enum は、警告の生成時に文字列に変換されますが、テンプレート内で値を参照する際は、整数値を使用する必要があります。たとえば、優先度の高い警告のみを生成するには、次のように指定します。
{{if eq .Priority 4 -}}
{"text": "Alert {{.PolicyType}} {{.StrategyName}}"}
{{- end}}
警告テンプレートの関数
警告テンプレートには、フォーマットを簡単に設定するためのいくつかの関数があります。
AlertJSON
警告の json 全体を出力します。これは、必要な入力形式 (例: Webhooks、Splunk など) が、他のシステムで指定されている場合に、警告 json をラッピングする際に便利です。
関数を使用する方法は次のとおりです。
template:?`{"uuid": "{{.UUID}}", "data": {{AlertJSON}}}```
これによって、次のような出力が生成されるはずです。
{"uuid": "2fb9e1fd-cd9b-4dbc-adca-70c29446f808", "data": {"timestamp":"2020-07-29T19:35:57.440109088Z","scope":"Process","priority":"Low","confidence":"Max","comments":"Alerts when an command is executed by a valid system user via SSH.","alert_labels":{},"notifications":[{"timestamp":"2020-07-29T19:35:57.440109088Z",
...
,"name":"Shell Command Executed","categories":["C8.Abnormal Activity.System Activity","MITRE.Execution.Command-Line Interface","MITRE.Execution.User Execution","MITRE.Initial Access.Valid Accounts"]}}
RFC3339Date、RFC3339NanoDate、および ToSeconds
これらの関数を使用すると、警告内の日付を簡単にフォーマットできます。これによって、宛先で要求されるどのような形式にも対応するように、出力される警告で日付を表示することができます。
- RFC3339Date は、日付を
YYYY-MM-DDTHH:mm:SSZ
形式で表示します。 - RFC3339NanoDate は、日付を
YYYY-MM-DDTHH:mm:SS.NNNNNNNNNZ
形式で表示します。 - ToSeconds は、UnixNano の値を UNIX タイムスタンプ (秒単位) に変換します。
これらの機能は、次のように使用します。
template: |
{{.UUID}} .Timestamp {{.Timestamp}}
{{.UUID}} RFC3339Date .Timestamp {{RFC3339Date .Timestamp}}
{{.UUID}} RFC3339NanoDate .Timestamp {{RFC3339NanoDate .Timestamp}}
{{.UUID}} ToSeconds .Timestamp {{ToSeconds .Timestamp}}
次のように出力されます。
9dae63f9-110f-40d0-9dfe-ebac85b9433f .Timestamp 1596053056936135157
9dae63f9-110f-40d0-9dfe-ebac85b9433f RFC3339Date .Timestamp 2020-07-29T20:04:16Z
9dae63f9-110f-40d0-9dfe-ebac85b9433f RFC3339NanoDate .Timestamp 2020-07-29T20:04:16.936135157Z
9dae63f9-110f-40d0-9dfe-ebac85b9433f ToSeconds .Timestamp 1596053056
警告テンプレートのエラー
template
値が、構文が有効でないテンプレートの場合、致命的なエラーとして処理され、SLS の起動が妨げられます。出力には行番号が含まれます。たとえば template:1
は、エラーが最初の行にあることを示します。
root@peterm:~# ./sophoslinuxsensor
Sophos Linux Runtime Detections Agent version 5.0.0.28 (Build: 1917)
INFO[0000] fetching metadata
INFO[0000] fetched metadata
INFO[0001] Starting Embedded Analytics
FATA[0001] Unable to start analytics: template: error: template: template:1: unexpected"}" in operand
テンプレートの構文が有効であるが、無効な警告フィールドが指定されている場合、致命的ではないエラーが警告で発生します。
たとえば、template
の Path
フィールドが、誤って Psth
と入力された場合などです。
template: |
{{.StrategyName}} {{.ProcessInfo.Tgid}} {{.ProcessInfo.Program.Psth}}
次のエラーが表示されます。
ERRO[0005] template: template:1:53: executing "template" at <.ProcessInfo.Program...>: can`t evaluate field Psth in type *processtree.ProgramInfo
この問題を修正するには、テンプレートを更新して SLS を再起動する必要があります。
詳細情報