コンテンツにスキップ

CELのはじめ方🔗

注意

Taegis XDRでは、Alerts および Investigations という用語が、最近 検出 および ケース に変更されました。SophosとTaegisテクノロジーのプラットフォーム統合作業が進行中のため、引き続き旧用語が参照されている場合があります。詳細については、Taegis用語の更新をご覧ください。

Common Expression Language(CEL)は、Secureworks® Taegis™自動化で使用されるシンプルな式言語です。CELは、コネクター、テンプレート、プレイブックトリガー、およびプレイブック入力のデータを操作するためのシンプルで一貫性があり強力な機能を提供します。詳細については、公式のGoogle CELドキュメントをご覧ください。

使用方法🔗

式は常に${}構文を使用してサポートされます。プレイブックテンプレートやトリガーフィルター内で式を使用する場合、利便性のために${}構文を省略することもできます。ただし、コネクター定義を作成する際には${}構文を必ず使用する必要があります。

例:

Expression:
${'Hello World'}

Output:
Hello World

さらに多くの例はCommon Expression Languageの例をご覧ください。

ヒント

CELヘルパーは、該当する場合に表示され、自動化設定で使用できる一般的なCEL式を提供します。

CELヘルパー

また、CEL Explorerを使用して、特定の種類の入力に対してCEL式をテストし、設定を完了する際に式の結果を確認することもできます。詳細については、CEL Explorerをご覧ください。

データ型🔗

CELは強い型付けを持ち、以下のデータ型をサポートします。

データ型 説明
int 64ビット符号付き整数
uint 64ビット符号なし整数
double 64ビットIEEE浮動小数点数
bool ブール値(true または false
string Unicodeコードポイントの文字列
bytes バイト列
list 値のリスト [1,2,3]
map intuintbool、またはstringキーを持つ連想配列 {'key':'value'}
null_type null値
message names Protocol Bufferメッセージ
type 1列目の型を表す値 string

多くの場合、組み込みマクロを使用してデータ型を変換できます:int()uint()double()string()list()map()bool()bytes()。たとえば、数値を文字列に変換するには:

Expression:
${ string(8) }

Output:
8

Expression:
${ type(string(8)) }

Output:
string

ほとんどの場合、変数の値を定義すると同時にデータ型も設定されます。

Expression:
${ {'key':'value'} }

Output:
a map data type, with a single key called "key" and a value of "value"

Expression:
${ [1,2,3] }

Output:
a list data type, with the values 1, 2, and 3

Expression:
${ [] }

Output:
an empty list

Expression:
${ 'this is a string' }

Output:
this is a string

データへのアクセス🔗

データは変数名を参照することでアクセスできます。

Expression:
${myvar}

マップ内のデータには、次のいずれかの方法でアクセスできます(どちらの式も同じ結果を返します)。

Expression:
${map_var.map_key}

Expression:
${map_var['map_key']}

Output:
the value associated with the key map_key in the map_var map variable

リスト要素には、要素の順序(0始まり)が分かっていればアクセスできます。

Expression:
${mylist[0]}

Output:
the value of the first element in the mylist list variable

条件式🔗

CELは従来のifthenelse構文をサポートしていませんが、三項条件演算子をサポートしています。三項演算子は短縮されたifthenelseで、次の構造を持ちます:<if> ? <then> : <else>。ここで<if>はtrue/falseのブール値を返す任意の式です。<then>は任意の式で、条件がtrueの場合に返されます。<else>も任意の式で、条件がfalseの場合に返されます。<then><else>の値のデータ型は一致している必要があります。

Expression:
${ int_val > 3 ? 'int_val is greater than 3' : 'int_val is less than 3' }

Output (int_val=4):
int_val is greater than 3

Output (int_val=2):
int_val is less than 3

マクロ🔗

言語の機能を拡張する多数のマクロがサポートされています。マクロは通常、特定のデータ型にのみ適用され、受け入れます。たとえば、toLower()マクロは文字列またはリストに適用されます。

Expression:
${'Hello World'.toLower()}

Output:
hello world

Expression:
${toLower(['Hello World'])}

Output:
[
  hello world
]

サポートされている多くのマクロはCommon Expression Languageマクロで説明されています。

エラーの回避🔗

定義されていない変数にアクセスしようとすると、no_such_fieldエラーが発生します。これは、has()マクロと三項条件演算子を組み合わせて回避できます。

Expression:
${ has(map_var, 'map_key') ? map_var.map_key : '' }

Output:
the value of map_var.map_key if it exists, else an empty string

もう一つの一般的なエラーは、型の不一致によるものです。この問題を防ぐために、変数内のデータを特定のデータ型に変換する必要がある場合があります。たとえば:

Expression:
${ int(int_val) }

Output:
the value of int_val as an integer type