搜尋指令¶
aws-ct-search 指令¶
使用此指令可在不撰寫 Sigma 規則的情況下,從 AWS CloudTrail 日誌中擷取所需的事件。
符合的事件會以與 aws-ct-timeline 相同的格式顯示或儲存,因此可以直接用熟悉的時間軸欄位檢視搜尋結果。
縮小事件範圍的方法有以下三種,並可組合使用:
| 選項 | 比對對象 | 多個值 |
|---|---|---|
-F, --filter FIELD:VALUE |
單一欄位的值,完全比對、區分大小寫 | 重複指定 -F;所有條件都必須符合(AND) |
-k, --keyword KEYWORD |
事件 JSON 中任意位置的子字串,不區分大小寫(加上 -c 時區分) |
重複指定 -k;符合任一關鍵字即可(OR) |
-r, --regex REGEX |
事件 JSON 中任意位置的正規表示式 | 單一模式(以未跳脫的管線字元 | 指定多個候選) |
每個事件依下列順序檢查,只有通過所有檢查的事件才會輸出:時間範圍(--timeline-start, --timeline-end, --time-offset)→ -F → -k → -r。
若已知值所在的欄位(例如 eventName:ConsoleLogin),請使用 -F;若只知道字串而不知道出現位置,請使用 -k 或 -r。
-F, --filter 的運作方式¶
- 格式為
FIELD:VALUE。引數會在第一個:處分割,因此像 ARN 這類含有冒號的值可以直接指定。 - 巢狀欄位以點記法表示(
userIdentity.type)。開頭的.可省略,因此.userIdentity.arn也可使用。 - 值前後的引號(
"..."或'...')會被移除。 - 數值與布林值會以字串進行比較,因此
-F readOnly:false與-F responseElements.user.userId:12345都可使用。 - 沒有該欄位的事件不會符合。
- 無法指定陣列中的元素(沒有
items.0.name這類語法)。 - 不含
:的篩選條件會在掃描開始前被拒絕:Invalid --filter 'eventName': expected FIELD:VALUE (e.g. eventName:ConsoleLogin)。
注意:
aws-ct-metrics的-F是--field-name,只接受欄位名稱。aws-ct-search的-F是--filter,一律使用FIELD:VALUE。
指令用法¶
Usage: suzaku aws-ct-search <INPUT> [OPTIONS]
Input:
-d, --directory <DIR> Directory of multiple gz/json/jsonl/csv/parquet files
-f, --file <FILE> File path to one gz/json/jsonl/csv/parquet file
Filtering:
-F, --filter <FILTER...> Filter by specific field(s)
-c, --preserve-case Case-sensitive keyword search
-k, --keyword <KEYWORD...> Search by keyword(s)
-r, --regex <REGEX> Search by regular expression
--timeline-start <DATE> Start time of the events to load (ex: "2022-02-22T23:59:59Z)
--timeline-end <DATE> End time of the events to load (ex: "2020-02-22T00:00:00Z")
--time-offset <OFFSET> Scan recent events based on an offset (ex: 1y, 3M, 30d, 24h, 30m)
--file-date-from <DATE> Filter files by start date based on AWSLogs S3 path date structure (ex: "20240101")
--file-date-to <DATE> Filter files by end date based on AWSLogs S3 path date structure (ex: "20241231")
Output:
-C, --clobber Overwrite files when saving
-G, --geo-ip <MAXMIND-DB-DIR> Add GeoIP (ASN, city, country) info to IP addresses
-o, --output <FILE> Save the results to a file
-t, --output-type <FORMAT,...> Output format(s) (only used with -o): csv (default), json, jsonl, duckdb. Comma-separate or repeat to write several at once, e.g. -t csv,duckdb [default: csv] [possible values: csv, json, jsonl, duckdb]
--raw-output Output the original JSON logs (only available in JSON formats or stdout)
--threads <THREAD NUMBER> Number of threads to use (default: same as CPU cores)
General Options:
-h, --help Show the help menu
Display Settings:
-K, --no-color Disable color output
-q, --quiet Quiet mode: do not display the launch banner
aws-ct-search 指令範例¶
依欄位篩選(-F):
- 找出主控台登入:
./suzaku aws-ct-search -d ../suzaku-sample-data -F eventName:ConsoleLogin - 找出 root 使用者的 API 呼叫(巢狀欄位):
./suzaku aws-ct-search -d ../suzaku-sample-data -F userIdentity.type:Root - 找出特定 IAM 使用者的所有操作(值中含有冒號):
./suzaku aws-ct-search -d ../suzaku-sample-data -F userIdentity.arn:arn:aws:iam::123456789012:user/alice - 找出被拒絕的呼叫:
./suzaku aws-ct-search -d ../suzaku-sample-data -F errorCode:AccessDenied - 找出
us-east-1中非唯讀的 IAM 呼叫(多個篩選條件為 AND):./suzaku aws-ct-search -d ../suzaku-sample-data -F eventSource:iam.amazonaws.com -F awsRegion:us-east-1 -F readOnly:false - 找出對特定 S3 儲存貯體的存取(API 專屬欄位):
./suzaku aws-ct-search -d ../suzaku-sample-data -F requestParameters.bucketName:my-bucket
依關鍵字(-k)與正規表示式(-r)搜尋:
- 找出任意位置提及某個 IP 位址的事件:
./suzaku aws-ct-search -d ../suzaku-sample-data -k 203.0.113.10 - 找出提及兩位使用者其中之一的事件(多個關鍵字為 OR):
./suzaku aws-ct-search -d ../suzaku-sample-data -k alice -k bob - 區分大小寫的關鍵字搜尋:
./suzaku aws-ct-search -d ../suzaku-sample-data -k AKIAIOSFODNN7EXAMPLE -c - 找出停用 CloudTrail 的嘗試:
./suzaku aws-ct-search -d ../suzaku-sample-data -r "(StopLogging|DeleteTrail|UpdateTrail)"
組合條件與儲存結果:
- 將關鍵字搜尋限定於單一事件來源:
./suzaku aws-ct-search -d ../suzaku-sample-data -F eventSource:s3.amazonaws.com -k delete - 最近 7 天內失敗的主控台登入:
./suzaku aws-ct-search -d ../suzaku-sample-data -F eventName:ConsoleLogin -k Failure --time-offset 7d - 加上 GeoIP 資訊並儲存為 CSV 與 DuckDB:
./suzaku aws-ct-search -d ../suzaku-sample-data -F eventName:ConsoleLogin -G ../GeoLite2-DBs -o console-logins -t csv,duckdb - 儲存符合事件的原始 JSON:
./suzaku aws-ct-search -d ../suzaku-sample-data -F userIdentity.type:Root -o root-events.jsonl -t jsonl --raw-output
aws-ct-search 輸出¶
輸出欄位與 aws-ct-timeline 相同,DuckDB 輸出也遵循相同的 DuckDB 輸出結構。
最後會顯示掃描的事件數與符合的事件數: