

# Amazon GuardDuty の検出結果をクエリする
<a name="querying-guardduty"></a>

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

Amazon GuardDuty の詳細については、「[Amazon GuardDuty ユーザーガイド](https://docs.aws.amazon.com/guardduty/latest/ug/)」を参照してください。

## 前提条件
<a name="querying-guardduty-prerequisites"></a>
+ Amazon S3 に結果をエクスポートするための GuardDuty 機能を有効にします。ステップについては、「Amazon GuardDuty ユーザーガイド」の「[結果のエクスポート](https://docs.aws.amazon.com/guardduty/latest/ug/guardduty_exportfindings.html)」を参照してください。

## GuardDuty の検出結果のために Athena でテーブルを作成する
<a name="querying-guardduty-creating-a-table-in-athena-for-guardduty-findings"></a>

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

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

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

1. 以下の DDL ステートメントを Athena コンソール内に貼り付けます。`LOCATION 's3://amzn-s3-demo-bucket/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://amzn-s3-demo-bucket/AWSLogs/account-id/GuardDuty/'
    TBLPROPERTIES ('has_encrypted_data'='true')
   ```
**注記**  
SerDe では、各 JSON ドキュメントが、レコード内のフィールドを区切る行終端文字なしの、1 行のテキストに収まっていることを想定しています。JSON テキストがプリティプリント形式の場合、テーブルを作成した後にクエリを実行しようとすると、以下のようなエラーメッセージが表示される場合があります。「HIVE\$1CURSOR\$1ERROR: Row is not a valid JSON Object」、または「HIVE\$1CURSOR\$1ERROR: JsonParseException: Unexpected end-of-input: expected close marker for OBJECT」。詳細については、GitHub の OpenX SerDe のドキュメントで「[JSON Data Files](https://github.com/rcongiu/Hive-JSON-Serde#json-data-files)」(JSON データファイル) を参照してください。

1. Athena コンソールでクエリを実行して、`gd_logs` テーブルを登録します。クエリが完了すると、結果は Athena からクエリを実行できる状態になります。

## クエリの例
<a name="querying-guardduty-examples"></a>

以下の例は、Athena から GuardDuty の 結果をクエリする方法を示しています。

**Example – 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
```

**Example – 不正な 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 の結果のクエリに関するヒント
<a name="querying-guardduty-tips"></a>

クエリを作成するときは、次の点に注意してください。
+ ネストされた JSON フィールドからデータを抽出するには、Presto `json_extract` 関数、または `json_extract_scalar` 関数を使用します。詳細については、「[文字列から JSON データを抽出する](extracting-data-from-JSON.md)」(JSON からデータを抽出する) を参照してください。
+ JSON フィールドのすべての文字が小文字であることを確認します。
+  クエリ結果のダウンロードについては、「[Athena コンソールを使用してクエリ結果ファイルをダウンロードする](saving-query-results.md)」を参照してください。