Amazon GuardDuty の検出結果をクエリする
Amazon GuardDuty
Amazon GuardDuty の詳細については、「Amazon GuardDuty ユーザーガイド」を参照してください。
前提条件
-
Amazon S3 に結果をエクスポートするための GuardDuty 機能を有効にします。ステップについては、「Amazon GuardDuty ユーザーガイド」の「結果のエクスポート」を参照してください。
GuardDuty の検出結果のために Athena でテーブルを作成する
Athena から GuardDuty の結果をクエリするには、結果用のテーブルを作成する必要があります。
GuardDuty の結果のために Athena でテーブルをで作成する
https://console.aws.amazon.com/athena/
で Athena コンソールを開きます。 -
以下の DDL ステートメントを Athena コンソール内に貼り付けます。
LOCATION 's3://amzn-s3-demo-bucket
の値を、Amazon S3 にある GuardDuty の結果にポイントするように変更します。/AWSLogs/
account-id
/GuardDuty/'CREATE EXTERNAL TABLE `gd_logs` ( `schemaversion` string, `accountid` string, `region` string, `partition` string, `id` string, `arn` string, `type` string, `resource` string, `service` string, `severity` string, `createdat` string, `updatedat` string, `title` string, `description` string) ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe' LOCATION 's3://amzn-s3-demo-bucket/AWSLogs/
account-id
/GuardDuty/' TBLPROPERTIES ('has_encrypted_data'='true')注記
SerDe では、各 JSON ドキュメントが、レコード内のフィールドを区切る行終端文字なしの、1 行のテキストに収まっていることを想定しています。JSON テキストがプリティプリント形式の場合、テーブルを作成した後にクエリを実行しようとすると、以下のようなエラーメッセージが表示される場合があります。「
HIVE_CURSOR_ERROR: Row is not a valid JSON Object
」、または「HIVE_CURSOR_ERROR: JsonParseException: Unexpected end-of-input: expected close marker for OBJECT
」。詳細については、GitHub の OpenX SerDe のドキュメントで「JSON Data Files」(JSON データファイル) を参照してください。 -
Athena コンソールでクエリを実行して、
gd_logs
テーブルを登録します。クエリが完了すると、結果は Athena からクエリを実行できる状態になります。
クエリの例
以下の例は、Athena から GuardDuty の 結果をクエリする方法を示しています。
例 – DNS データの流出
以下のクエリは、DNS クエリを介してデータを流出している可能性がある Amazon EC2 インスタンスに関する情報を返します。
SELECT title, severity, type, id AS FindingID, accountid, region, createdat, updatedat, json_extract_scalar(service, '$.count') AS Count, json_extract_scalar(resource, '$.instancedetails.instanceid') AS InstanceID, json_extract_scalar(service, '$.action.actiontype') AS DNS_ActionType, json_extract_scalar(service, '$.action.dnsrequestaction.domain') AS DomainName, json_extract_scalar(service, '$.action.dnsrequestaction.protocol') AS protocol, json_extract_scalar(service, '$.action.dnsrequestaction.blocked') AS blocked FROM gd_logs WHERE type = 'Trojan:EC2/DNSDataExfiltration' ORDER BY severity DESC
例 – 不正な IAM ユーザーアクセス
以下のクエリは、すべてのリージョンからの IAM プリンシパルに関するすべての UnauthorizedAccess:IAMUser
結果タイプを返します。
SELECT title, severity, type, id, accountid, region, createdat, updatedat, json_extract_scalar(service, '$.count') AS Count, json_extract_scalar(resource, '$.accesskeydetails.username') AS IAMPrincipal, json_extract_scalar(service,'$.action.awsapicallaction.api') AS APIActionCalled FROM gd_logs WHERE type LIKE '%UnauthorizedAccess:IAMUser%' ORDER BY severity desc;
GuardDuty の結果のクエリに関するヒント
クエリを作成するときは、次の点に注意してください。
-
ネストされた JSON フィールドからデータを抽出するには、Presto
json_extract
関数、またはjson_extract_scalar
関数を使用します。詳細については、「文字列から JSON データを抽出する」(JSON からデータを抽出する) を参照してください。 -
JSON フィールドのすべての文字が小文字であることを確認します。
-
クエリ結果のダウンロードについては、「Athena コンソールを使用してクエリ結果ファイルをダウンロードする」を参照してください。