Amazon GuardDuty の結果のクエリ - Amazon Athena

Amazon GuardDuty の結果のクエリ

Amazon GuardDuty は、AWS 環境内での不正または悪質である可能性がある予期しないアクティビティを識別するために役立つ、セキュリティをモニタリングするサービスです。悪意のある可能性がある予期しないアクティビティが検出されると、GuardDuty がストレージと分析のために Amazon S3 にエクスポートできるセキュリティ結果を生成します。結果を Amazon S3 にエクスポートしたら、Athena を使用してそれらをクエリできます。この記事は、GuardDutyの 結果用のテーブルを Athena で作成し、それらをクエリする方法を説明します。

Amazon GuardDuty の詳細については、「Amazon GuardDuty ユーザーガイド」を参照してください。

前提条件

  • Amazon S3 に結果をエクスポートするための GuardDuty 機能を有効にします。ステップについては、「Amazon GuardDuty ユーザーガイド」の「結果のエクスポート」を参照してください。

GuardDuty の 結果のための Athena でのテーブルの作成

Athena から GuardDuty の結果をクエリするには、結果用のテーブルを作成する必要があります。

GuardDuty の結果のために Athena でテーブルをで作成する

  1. https://console.aws.amazon.com/athena/ で Athena コンソールを開きます。

  2. 以下の DDL ステートメントを Athena コンソール内に貼り付けます。LOCATION 's3://findings-bucket-name/AWSLogs/account-id/GuardDuty/' の値を、Amazon S3 にある 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://findings-bucket-name/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 データファイル) を参照してください。

  3. 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 の結果のクエリに関するヒント

クエリを作成するときは、次の点に注意してください。