サポートされているCELマクロ🔗
注意
Taegis XDRでは、Alerts および Investigations という用語が、最近 検出 および ケース に変更されました。SophosとTaegisテクノロジーのプラットフォーム統合作業が進行中のため、引き続き旧用語が参照されている場合があります。詳細については、Taegis用語の更新をご覧ください。
Secureworks® Taegis™ XDR自動化プラットフォームでは、GoogleのCommon Expression Language (CEL) を使用して、コネクター、プレイブック入力、プレイブックトリガー、テンプレート内でロジックやデータ操作を埋め込むことができます。
XDRは、データの操作や評価を可能にするGoogleのCommon Expression Language (CEL)マクロを多数サポートしています。多くのマクロは組み込みですが、よくある課題に対応するためにカスタムで作成されたものもあります。
これらの例では、以下のデータ構造を使用します。
{
"plant": {
"type": "tree",
"name": "white oak",
"uses": [
"lumber",
"firewood",
"furniture"
],
"traits": {
"produces_fruit": yes,
"genus": "Quercus",
"height": 100,
"extinct": false,
"related_to": [
{
"name": "chestnut",
"genus": "Castanea"
},
{
"name": "beech",
"genus": "Fagus"
}
]
},
"locations": [
"usa",
"europe",
"new york",
"New York",
"new york ",
"usa",
"worldwide",
"eu"
]
}
}
リストおよびマップ操作用マクロ🔗
以下のCELマクロは、リストやマップの操作用に設計されています。
マップのデータ構造例:
このマップの例では、左側のラベルはキーと呼ばれます。各name: valueのペアは要素と呼ばれます。
マップは入れ子にすることもできます。例:
propertiesマップ内のcolorキーの値にアクセスするには、パスとして.記法を使います: properties.color
リストのデータ構造例:
このリストの例では、リスト内の各値が要素と呼ばれます。all()🔗
リストまたはマップを反復処理し、リスト内のすべての要素に対して条件が真であることを検証します。
以下の式は、usesリスト内の要素のうち1つが文字fで始まらないため、falseを返します:
false
append()🔗
既存のリストに要素を追加します。
以下の式は、usesリストに値"barrels"を追加します:
["lumber","firewood","furniture","barrels"]
collect()🔗
指定したパス引数に一致するマップ値のリストを返します。
以下の式は、related_toリスト内のnameキーの値を返します:
["chestnut","beech"]
contains()🔗
リスト内のいずれかの要素が指定した引数と一致する場合(大文字・小文字を区別)、trueを返します。2番目の引数にtrueを指定すると、大文字・小文字を無視して一致判定を行います。
以下の式は、usesリストに値Nit(大文字・小文字区別)が存在しないため、falseを返します:
false
以下の式は、usesリストに値nitが大文字・小文字無視で一致するため、trueを返します:
true
count()🔗
指定した文字列引数に一致するリスト要素の数を返します。
以下の式は、related_toリスト内のnameキーの件数を返します:
2
exists()🔗
リストまたはマップを反復処理し、少なくとも1つの要素に対して条件が真であることを検証します。
以下の式は、lumberがusesリストに含まれているため、trueを返します:
true
以下の式は、related_toリストにappleという名前の要素が存在しないため、falseを返します:
false
exists_one()🔗
リストまたはマップを反復処理し、ちょうど1つの要素に対して条件が真であることを検証します。
以下の式は、usesリスト内で文字fで始まる要素が複数あるため、falseを返します:
false
filter()🔗
リストを反復処理し、指定した条件に一致する要素を返します。
以下の式は、usesリストをフィルタリングし、"firewood"と"furniture"の値を持つ新しいリストを返します。両方とも文字fで始まります:
["firewood","furniture"]
flatten()🔗
すべての入れ子リストを1つのトップレベルリストに結合して返します。
以下の式は、入れ子リストを1つの非入れ子リストに結合します:
出力:["a","b","c","x","y","z","a"]
format()🔗
指定したフォーマットを使用して、タイムスタンプの文字列表現を返します。サポートされているフォーマットの一覧はSupported Formatsを参照してください。
以下の式は、現在のタイムスタンプから年・月・日だけを返します:
出力:2024-05-01
groupBy()🔗
1つ以上のパスでグループ化し、対応する件数を返すマップ要素のリストを返します。マクロの第1引数はグループ化するリスト、第2引数はグループ化するパスのリスト、第3引数(省略可)は昇順(asc)または降順(desc)で並べ替えます(デフォルトは昇順)。
以下の式は、related_toリストを評価し、genus値で降順にグループ化します:
has()🔗
キーが存在する/定義されている/nullでないことを検証します。このマクロは、1つ以上のパスについてマップをチェックすることもサポートします。パスの区切り文字用に3番目の引数(省略可)もあります。
以下の式は、変数/パスplant.traits.produces_fruitが存在するため、trueを返します:
true
join()🔗
リストの要素を指定した(省略可)区切り文字で連結して文字列にします。デフォルトの区切り文字はカンマです。
以下の式は、usesリストの要素をカンマ区切りの文字列に連結します:
"lumber, firewood, furniture"
keys()🔗
マップのトップレベルキーのリストを返します。
以下の式は、traitsマップのキーからなるリストを返します:
["produces_fruit","genus","height","extinct","related_to"]
map()🔗
リストを反復処理し、定義された方法で要素を変換します。
以下の式は、各要素を大文字に変換し、"LUMBER"、"FIREWOOD"、"FURNITURE"の値を持つ新しいリストを返します:
["LUMBER","FIREWOOD","FURNITURE"]
merge()🔗
既存のマップに要素を追加します。
以下の式は、既存のtraitsマップに新しい要素を追加します:
"traits": {
"produces_fruit": yes,
"genus": "Quercus",
"height": 100,
"extinct": false,
"related_to": [
{
"name": "chestnut",
"genus": "Castanea"
},
{
"name": "beech",
"genus": "Fagus"
}
],
"leaf_type": "simple"
}
sort()🔗
指定したリストのコピーを昇順で返します。第2引数にdescを指定すると降順で並べ替えます。
以下の式は、usesリストを昇順で並べ替えます:
["firewood","furniture","lumber"]
以下の式は、usesリストを降順で並べ替えます:
["lumber","furniture","firewood"]
toLower()🔗
リスト内のすべての要素を小文字に変換したコピーを返します。
以下の式は、locationsリストの既存要素をすべて小文字に変換して返します:
["usa","europe","new york","new york","new york ","usa","worldwide","eu"]
toUpper()🔗
リスト内のすべての要素を大文字に変換したコピーを返します。
以下の式は、usesリストの既存要素をすべて大文字に変換して返します:
["LUMBER","FIREWOOD","FURNITURE"]
trim()🔗
リスト内のすべての要素から先頭および末尾の空白文字を削除したコピーを返します。
以下の式は、locationsリストの既存要素から先頭および末尾の空白文字を削除して返します:
["usa","europe","new york","New York","new york","usa","worldwide","eu"]
unique()🔗
重複する要素を削除したリストのコピーを返します。完全に一致する(大文字・小文字区別)要素のみが重複として削除されます。
以下の式は、locationsリストから重複要素を削除して返します:
["usa","europe","new york","New York","new york ","worldwide","eu"]
文字列操作用マクロ🔗
以下のCELマクロは、文字列操作用に設計されています。
contains()🔗
文字列が指定した部分文字列と一致する場合、trueを返します。最初の引数に部分文字列のリストを指定できます。2番目の引数(省略可)で一致判定時に大文字・小文字を無視するかどうかを指定できます(デフォルトはfalse)。
以下の式は、文字列testが部分文字列estを含むため、trueを返します:
true
以下の式は、文字列testが部分文字列estを含むため、trueを返します:
true
以下の式は、オプションの大文字・小文字無視を有効にした場合、文字列testが部分文字列ESTを含むため、trueを返します:
true
decodeBase64()🔗
base64でエンコードされた入力文字列をデコードして返します。
以下の式は、base64でデコードした文字列を返します:
出力:"test=123"
decodeJSON()🔗
入力文字列をデコードしてjsonオブジェクトを返します。
以下の式は、入力文字列(エンコードされたjson)を表すjsonオブジェクトを返します:
出力:encodeBase64()🔗
入力文字列をbase64文字列としてエンコードして返します。
以下の式は、base64でエンコードされた文字列を返します:
出力:"dGVzdD0xMjM="
encodeJSON()🔗
入力文字列をjson文字列としてエンコードして返します。
以下の式は、plant.usesリストをjsonエンコードした文字列として返します:
出力:"['lumber','firewood','furniture']"
generateString()🔗
第1引数で指定した長さ、第2引数で指定した文字/アルファベットを使ってランダムな文字列を生成して返します。
以下の式は、5文字長でa, b, c, 1, 2, 3のみを含むランダムな文字列を返します:
出力:31a3c
ipInNetwork()🔗
第1引数のIPアドレスが第2引数のIPネットワーク範囲(CIDR表記のリスト)のいずれかに含まれる場合、trueを返します。
以下の式は、文字列が指定したネットワーク範囲に含まれるため、trueを返します:
true
isDomain()🔗
指定した文字列引数が有効なドメインを表す場合、trueを返します。
以下の式は、文字列が有効なドメインであるため、trueを返します:
true
isEmail()🔗
指定した文字列引数が有効なメールアドレスを表す場合、trueを返します。
以下の式は、文字列が有効なメールアドレスであるため、trueを返します:
true
isIP()🔗
指定した文字列引数が有効なIPv4アドレスを表す場合、trueを返します。
以下の式は、文字列が有効なIPであるため、trueを返します:
true
isPrivateIP()🔗
指定した文字列引数がプライベート(RFC-1918)、リンクローカル、またはループバックIPv4アドレスを表す場合、trueを返します。
以下の式は、文字列がパブリックIPアドレスを表すため、falseを返します:
false
isURL()🔗
指定した文字列引数が有効なURL(Uniform Resource Locator)を表す場合、trueを返します。
以下の式は、文字列が有効なURLであるため、trueを返します:
true
isUUID()🔗
指定した文字列引数が有効なUUID(Universally Unique Identifier)を表す場合、trueを返します。
以下の式は、文字列が有効なUUIDであるため、trueを返します:
true
matchGroup()🔗
指定した正規表現キャプチャグループから文字列の配列を返します。
以下の式は、正規表現のキャプチャグループを表すリストを返します:
出力:["blue:green","blue","green"]
md5sum()🔗
指定した文字列のmd5ダイジェストを計算して返します。
以下の式は、toHex()マクロを使って文字列入力のmd5ダイジェストを一般的な文字列表現で返します:
出力:"098f6bcd4621d373cade4e832627b4f6"
parseURL()🔗
指定したURL文字列をURLマップ構造として返します。
以下の式は、URL文字列を表すURLマップ構造を返します:
出力:{
"ForceQuery": false
"Fragment": ""
"Host": "www.example.com"
"OmitHost": false
"Opaque": ""
"Path": ""
"RawFragment": ""
"RawPath": ""
"RawQuery": ""
"Scheme": "https"
"User": {
"Password": ""
"Username": ""
}
}
sha1sum()🔗
指定した文字列のsha1ダイジェストを計算して返します。
以下の式は、toHex()マクロを使って文字列入力のsha1ダイジェストを一般的な文字列表現で返します:
出力:"a94a8fe5ccb19ba61c4c0873d391e987982fbbd3"
sha256sum()🔗
指定した文字列のsha256ダイジェストを計算して返します。
以下の式は、toHex()マクロを使って文字列入力のsha256ダイジェストを一般的な文字列表現で返します:
出力:"9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08"
sha512sum()🔗
指定した文字列のsha512ダイジェストを計算して返します。
以下の式は、toHex()マクロを使って文字列入力のsha512ダイジェストを一般的な文字列表現で返します:
出力:"ee26b0dd4af7e749aa1a8ee3c10ae9923f618980772e473f8819a5d4940e0db27ac185f8a0e1d5f84f88bc887fd67b143732c304cc5fa9ad8e6f57f50028a8ff"
toHTML()🔗
指定した文字列をHTMLとして返します。
以下の式は、マークダウンの文字列をHTMLに変換します:
出力:"<h2>This is an H2</h2>"
toLower()🔗
すべての文字を小文字に変換した文字列のコピーを返します。
以下の式は、文字列Testをtestに変換します:
"test"
toString()🔗
任意のデータ型の値を文字列として返します。
以下の式は、指定したリストの文字列表現を返します:
出力:"[1,2,3]"
toTable()🔗
指定したデータをテキスト/マークダウンテーブルとして表す文字列を返します。このマクロは4つのパラメータを必要とします:
- 各行がリストで表されるデータのリスト
- テーブルのヘッダーのリスト
- テーブルのフッターのリスト
- マークダウンとして出力するかどうかのブール値
以下の式は、ヘッダーやフッターなしで2列2行のテキストテーブルを生成します:
出力:+--------------+--------------+
| row1_column1 | row2_column2 |
| row2_column1 | row2_column2 |
+--------------+--------------+
toTimestamp()🔗
日付と時刻の文字列からタイムスタンプを返します。
以下の式は、日付文字列2000/01/01からタイムスタンプを返します:
2000-01-01T00:00:00Z
toTitle()🔗
各単語の先頭文字を大文字に変換した文字列のコピーを返します。
以下の式は、文字列new yorkをNew Yorkに変換します:
"New York"
toUpper()🔗
すべての文字を大文字に変換した文字列のコピーを返します。
以下の式は、文字列testをTESTに変換します:
"TEST"
toURLQuery()🔗
URLの特殊文字をすべてエスケープシーケンスに変換した文字列のコピーを返します。
以下の式は、文字列param=1をエスケープされたURL文字列として返します:
"param%3D1"
userInDomain()🔗
指定したユーザー名引数が指定したドメインのいずれかに含まれる場合、trueを返します。
以下の式は、ユーザー名が指定したドメインの一部であるため、trueを返します:
true
アラートデータ操作用マクロ🔗
以下のCELマクロは、アラートデータの操作用に設計されています。
alertAttackTechniqueIds()🔗
alert レコードを解析し、攻撃手法IDの値を返します。
以下の式は、アラート内で見つかった攻撃手法IDのリストを返します:
出力:['T1059', 'T1057']
alertConfidence()🔗
alert レコードを解析し、信頼度の値を返します。
以下の式は、アラートから信頼度の値を返します:
出力:0.1
alertCreatedAtNanos()🔗
alert レコードを解析し、アラートが作成された時刻のナノ秒値を返します。
以下の式は、アラート作成時刻のナノ秒値を返します:
出力:1678899090
alertCreatedAtSeconds()🔗
alert レコードを解析し、作成時刻(created_at)をエポックからの秒数で返します。
以下の式は、アラートが作成された時刻(秒)を返します:
出力:1697207995554
alertDescription()🔗
alert レコードを解析し、説明の値を返します。
以下の式は、アラートの説明を返します:
出力:"This is a sample Taegis Watchlist Alert"
alertDestinationIPs()🔗
alert レコードを解析し、エンティティフィールド内でdestinationIPAddress(大文字・小文字無視)とラベル付けされたアラートエンティティから一意のIPアドレス値のリストを返します。
以下の式は、アラート内で見つかった宛先IPのリストを返します:
出力:['192.168.0.1', '192.168.0.2']
alertDetectorId()🔗
alert レコードを解析し、検知機IDの値を返します。
以下の式は、アラート内で見つかった検知機IDを返します:
出力:"267658fe-65f1-4145-8753-d45fbf9ed6d3"
alertDetectorName()🔗
alert レコードを解析し、検知機名の値を返します。
以下の式は、アラート内で見つかった検知機名を返します:
出力:"Taegis Watchlist"
alertDomains()🔗
alert レコードを解析し、エンティティフィールド内でipdomain、topprivateipdomain、domainname、authdomainname、sourceauthdomainname、targetauthdomainname(大文字・小文字無視)とラベル付けされたアラートエンティティから一意のドメイン名値のリストを返します。
以下の式は、アラート内で見つかったドメインのリストを返します:
出力:['example.com', 'a.example.com']
alertEnrichment()🔗
alert レコードとエンリッチメントデータを解析し、指定したパスに一致する最初の値を返します。
以下の式は、rareprogram_rare_ip.programsパスに関連付けられたエンリッチメントデータを返します:
['foo.exe', 'bar.exe']
alertEntities()🔗
alert レコードを解析し、エンティティ値を返します。
以下の式は、アラート内で見つかったエンティティのリストを返します:
出力:['hostname:abc', 'sensorId:12345', 'fileName:c:\windows\syswow64\cmd.exe']
alertEntity()🔗
alert レコードを解析し、指定したエンティティ名(大文字・小文字無視)に一致するエンティティ値のリストを返します。
以下の式は、アラート内でusernameエンティティ名を持つエンティティ値のリストを返します:
['bob','sally']
alertEventIds()🔗
alert レコードを解析し、イベントID値のリストを返します。
以下の式は、アラート内で見つかったイベントIDのリストを返します:
出力:['29ab783f-d3b5-4d4e-8025-9d36f4e1d2ae', 'aef81a33-fe5c-43fe-b589-c5ff8c3cce1c']
alertGroupKey()🔗
alert レコードを解析し、group_key値を返します。
以下の式は、アラート内で見つかったグループキーを返します:
出力:"12345:app:event-filter:80c0809b-153f-4b81-bb7c-52fcb83c7127"
alertHostnames()🔗
alert レコードを解析し、エンティティフィールド内でhostname、sourcehostname、desthostname、workstationname、computername(大文字・小文字無視)とラベル付けされたアラートエンティティから一意の値のリストを返します。
以下の式は、アラート内で見つかったホスト名のリストを返します:
出力:['sample_hostname', 'another_sample_hostname']
alertId()🔗
alert レコードを解析し、IDまたはUUIDを返します。
以下の式は、アラートからIDを返します:
出力:"alert://priv:endpoint-redcloak:12345:1678899090095:29ab783f-d3b5-4d4e-8025-9d36f4e1d2ae"
alertInvestigationIds()🔗
alert レコードを解析し、アラートに関連付けられたインベスティゲーションIDのリストを返します。
以下の式は、アラートに関連付けられたインベスティゲーションIDのリストを返します:
出力:['29ab783f-d3b5-4d4e-8025-9d36f4e1d2ae', 'aef81a33-fe5c-43fe-b589-c5ff8c3cce1c']
alertIPs()🔗
alert レコードを解析し、エンティティフィールド内でipAddress(大文字・小文字無視)とラベル付けされたアラートエンティティから一意のIPアドレス値のリストを返します。
以下の式は、アラート内で見つかったIPアドレスのリストを返します:
出力:['192.168.0.1', '192.168.0.2']
alertMitreAttackInfo()🔗
alert レコードを解析し、mitre_attack_info値のリストを返します。
以下の式は、アラート内で見つかったmitre_attack_info値のリストを返します:
出力:[
{
"description": "Adversaries may attempt...",
"platform": [
"Linux",
"macOS"
],
"tactics": [
"discovery"
],
"technique": "Process Discovery",
"technique_id": "T1057",
"type": "Enterprise ATT&CK"
}
]
alertObservationIds()🔗
alert レコードを解析し、オブザベーションID値のリストを返します。
以下の式は、アラート内で見つかったオブザベーションIDのリストを返します:
出力:['29ab783f-d3b5-4d4e-8025-9d36f4e1d2ae', 'aef81a33-fe5c-43fe-b589-c5ff8c3cce1c']
alertReferences()🔗
alert レコードを解析し、アラートに関連付けられたリファレンスのリストを返します。
以下の式は、アラートからリファレンスのリストを返します:
出力:[
{
"description": "External Alert Ref",
"url": https://example.com/alert/29ab783f-d3b5-4d4e-8025-9d36f4e1d2ae"
}
]
alertResolution()🔗
alert レコードを解析し、解決値を返します。
以下の式は、アラートから解決値を返します:
出力:"open"
alertResolutionReason()🔗
alert レコードを解析し、解決理由の値を返します。
以下の式は、アラートから解決理由の値を返します:
出力:"Valid activity for this user."
alertRuleId()🔗
alert レコードを解析し、ルールIDを返します。
以下の式は、アラート内で見つかったルールIDを返します:
出力:"267658fe-65f1-4145-8753-d45fbf9ed6d3"
alertSensorIds()🔗
alert レコードを解析し、センサーID値のリストを返します。
以下の式は、アラート内で見つかったセンサーID値のリストを返します:
出力:['12345', '1234-12345-123']
alertSensorTypes()🔗
alert レコードを解析し、一意のセンサータイプ値(大文字)をリストで返します。
以下の式は、アラート内で見つかったセンサータイプのリストを返します:
出力:['ENDPOINT_REDCLOAK', 'ENDPOINT_TAEGIS']
alertSeverity()🔗
alert レコードを解析し、重大度の値を返します。
以下の式は、アラートの重大度を浮動小数点数で返します:
出力:0.8
alertSeverityNice()🔗
alert レコードを解析し、人間が読みやすい重大度値(Informational、Low、Medium、High、Critical)を単語で返します。
以下の式は、アラートの重大度を文字列で返します:
出力:"High"
alertSourceIPs()🔗
alert レコードを解析し、エンティティフィールド内でsourceIPAddress(大文字・小文字無視)とラベル付けされたアラートエンティティから一意のIPアドレス値のリストを返します。
以下の式は、アラート内で見つかった送信元IPのリストを返します:
出力:['192.168.0.1', '192.168.0.2']
alertStatus()🔗
alert レコードを解析し、ステータス値を返します。
以下の式は、アラートからステータス値を返します:
出力:"open"
alertTags()🔗
alert レコードを解析し、タグのリストを返します。
以下の式は、アラート内で見つかったタグのリストを返します:
出力:['alertRule:29ab783f-d3b5-4d4e-8025-9d36f4e1d2ae', 'compactor:handler']
alertTenantId()🔗
alert レコードを解析し、テナントIDを返します。
以下の式は、アラートからテナントIDを返します:
出力:"12345"
alertThirdPartyDetail()🔗
alert レコードとサードパーティ詳細データを解析し、指定したパスに一致する最初の値を返します。
以下の式は、userStates.0.aadUserIdパスに関連付けられたサードパーティ詳細データを返します:
['F86DBD0D-6571-44A0-BAE1-43B83CF430AD']
alertTitle()🔗
alert レコードを解析し、タイトル値を返します。
以下の式は、アラートのタイトルを返します:
出力:"Taegis Watchlist Alert"
alertUpdatedAtNanos()🔗
alert レコードを解析し、アラートが変更された時刻のナノ秒値を返します。
以下の式は、アラート変更時刻のナノ秒値を返します:
出力:1678899090
alertUpdatedAtSeconds()🔗
alert レコードを解析し、更新時刻(updated_at)をエポックからの秒数で返します。
以下の式は、アラートが変更された時刻(秒)を返します:
出力:1697207995554
alertUsernames()🔗
alert レコードを解析し、エンティティフィールド内でusername(大文字・小文字無視)とラベル付けされたアラートエンティティから一意の小文字ユーザー名値のリストを返します。
以下の式は、アラート内で見つかったユーザー名のリストを返します:
出力:['sample_user', 'another_sample_user']
その他のデータ操作用マクロ🔗
以下のCELマクロは、さまざまなデータ(資産、インベスティゲーション、エンティティ、時刻)の操作用に設計されています。
entityValue()🔗
entity レコードを解析し、指定したエンティティプロパティの値のリストを返します。
以下の式は、user_nameプロパティに関連付けられた値のリストを返します:
["john"]
entityValues()🔗
entity レコードを解析し、エンティティに関連付けられた値のリストを返します。
以下の式は、エンティティに関連付けられた値のリストを返します:
出力:["example.com", "john@example.com", "john"]
investigationFieldChanged()🔗
investigation レコードを解析し、指定したフィールドが変更された場合にtrueを返します。
以下の式は、インベスティゲーションの優先度が変更された場合にtrueを返します:
出力:true
investigationPriority()🔗
investigation レコードを解析し、インベスティゲーションの優先度を単語(Low, Medium, High, Critical)で返します。
以下の式は、インベスティゲーションの優先度を単語で返します:
出力:"High"
now()🔗
現在のローカル時刻をタイムスタンプで返します。
以下の式は、ローカルシステムの現在時刻(この例ではUTC-5)を返します:
出力:"2023-10-13T14:06:47.059012-05:00"
nowUnixMilli()🔗
現在時刻をエポックからの秒数で返します。
以下の式は、ローカルシステムのエポックからのミリ秒数を整数で返します:
出力:1697224173109
random()🔗
0から0.99(両端含む)の間のランダム値を返します。
以下の式は、0から0.99の間のランダムな浮動小数点数(double)を返します:
出力:0.2