検索コマンド¶
aws-ct-searchコマンド¶
このコマンドは、Sigmaルールを書かずに、AWS CloudTrailログから目的のイベントを抽出するために使用します。
マッチしたイベントはaws-ct-timelineと同じ形式で表示・保存されるため、検索結果をそのまま見慣れたタイムラインの列で確認できます。
イベントの絞り込み方法は次の3つで、組み合わせて使用できます。
| オプション | マッチ対象 | 複数指定 |
|---|---|---|
-F, --filter FIELD:VALUE |
1つのフィールドの値に対する完全一致(大文字・小文字を区別) | -Fを繰り返し指定。すべての条件にマッチする必要がある(AND) |
-k, --keyword KEYWORD |
イベントのJSON全体に対する部分一致。大文字・小文字を区別しない(-c指定時は区別する) |
-kを繰り返し指定。いずれかにマッチすればよい(OR) |
-r, --regex REGEX |
イベントのJSON全体に対する正規表現 | 1つのパターン(複数の候補はエスケープしないパイプ文字|で指定) |
各イベントは次の順に判定され、すべてを通過したイベントだけが出力されます: 時間範囲(--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> 複数gz/json/jsonl/csv/parquetファイルのディレクトリパス
-f, --file <FILE> gz/json/jsonl/csv/parquetファイルのパス
Filtering:
-F, --filter <FILTER...> 特定のフィールドで絞り込む
-c, --preserve-case 大文字・小文字を区別してキーワード検索する
-k, --keyword <KEYWORD...> キーワードで検索する
-r, --regex <REGEX> 正規表現で検索する
--timeline-start <DATE> 読み込むイベントの開始時刻 (例: "2022-02-22T23:59:59Z)
--timeline-end <DATE> 読み込むイベントの終了時刻 (例: "2020-02-22T00:00:00Z")
--time-offset <OFFSET> オフセットに基づいて直近のイベントをスキャン (例: 1y, 3M, 30d, 24h, 30m)
--file-date-from <DATE> AWSLogsのS3パスの日付構造に基づいて開始日でファイルを絞り込む (例: "20240101")
--file-date-to <DATE> AWSLogsのS3パスの日付構造に基づいて終了日でファイルを絞り込む (例: "20241231")
Output:
-C, --clobber 保存時にファイルを上書きする
-G, --geo-ip <MAXMIND-DB-DIR> IPアドレスにGeoIP情報(ASN、市、国)を追加する
-o, --output <FILE> 結果をファイルに保存する
-t, --output-type <FORMAT,...> 出力形式(-o指定時のみ有効): csv (デフォルト), json, jsonl, duckdb。カンマ区切りまたは複数回指定で同時に出力する (例: -t csv,duckdb) [デフォルト: csv]
--raw-output 元のJSONログを出力する (JSON形式または標準出力のみ)
--threads <THREAD NUMBER> 使用するスレッド数 (デフォルト: CPUコア数)
General Options:
-h, --help ヘルプメニューを表示する
Display Settings:
-K, --no-color カラーで出力しない
-q, --quiet Quietモード: 起動バナーを表示しない
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 - 2人のユーザーのいずれかが含まれるイベントを抽出(複数のキーワードは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)"
条件の組み合わせと結果の保存:
- 1つのイベントソースに限定してキーワード検索:
./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出力スキーマに従います。
最後に、スキャンしたイベント数とマッチしたイベント数が表示されます: