AWS GuardDuty ログを Athena + Redash で可視化する

2020年6月24日

概要

やりたいこと

以前 GuardDuty ログを Athena で検索できるようにした。この GuardDuty ログを可視化したい。

QuickSight が使いにくかったので Redash で可視化する。

Redash

Redash はクエリ発行、可視化、ダッシュボード・アラート作成を行うツール。
ダッシュボードツールや BI ツールの一種。

実践

Redash 用 EC2 インスタンス作成

AMI が配布されている。Redash のバージョンは 8.0。
アクセスしたいデータソース(S3バケット)と同じ region の AMI を選択する(今回は ap-northeast-1 )。

EC2 コンソールより、新規インスタンスを作成する。

  • AMI : ami-060741a96307668be
  • インスタンスタイプ : t2.small以上
  • セキュリティグループ : 22 (SSH), 80 (HTTP), 443 (HTTPS) のインバウンドを許可
  • 自動割り当てパブリック IP : 有効

インスタンスが起動したら、パブリックDNSにアクセスし、Redashが起動していることを確認。

クエリ結果保存用 S3 バケット作成

クエリ結果保存用バケットを、以下の名前で作成する。S3 Staging Path と呼ばれている。

  • athena-redash-results

IAM Policy 作成

公式を参考に、Athena で検索するバケットへのアクセス権ポリシーを作成する。
前回 GuardDuty をエクスポートした guardduty-alert バケットに対して読み込み可能な権限をつける。

さらに上で作成したクエリ結果保存用バケット( athena-redash-results )に対してもアクセス権を付けておく。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:GetObject"
      ],
      "Resource": [
        "arn:aws:s3:::guardduty-alert/*",
        "arn:aws:s3:::athena-redash-results/*"
      ]
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:GetBucketLocation",
        "s3:ListBucket"
      ],
      "Resource": [
        "arn:aws:s3:::guardduty-alert",
        "arn:aws:s3:::athena-redash-results"
      ]
    }
  ]
}

IAM User 作成

以下の権限で IAM を作成する。アクセスキーとシークレットキーをメモしておく。

  • プログラムからのみアクセス許可
  • 以下2つのポリシーをアタッチ
    • AWSQuicksightAthenaAccess
    • 上で作ったポリシー

Redash と Athena を連携

Redash のデータソースに Athena を追加する。

「S3 Staging (Query Results) Bucket Path」は Redashが実行した結果を出力する場所。

  1. 右上の Setting のアイコン
  2. Data Sources
  3. New Data Source
  4. Amazon Athena
    1. Name : 好きな名前
    2. AWS Region : ap-northeast-
    3. AWS Access Key
    4. AWS Secret Key
    5. S3 Staging (Query Results) Bucket Path : s3://athena-redash-results
  5. Save

Test Connection で OK がでればOK。

Redash からクエリを発行

試しに Redash からクエリを打ってみる。

SELECT
    type,
    COUNT(*) AS COUNT
FROM
    gd_logs
GROUP BY type
ORDER BY COUNT DESC;

結果が返却され、ページ下部に Table が作成されることを確認。

Redash で可視化

クエリ結果が返ってきている状態で

  • New Visualization
    • Chart Type : Bar
    • X Column : type
    • Y Column : COUNT

以下のようにグラフが表示されれば大丈夫。

Terraform にしたい。

エラー

Error running query: failed communicating with server. Please check your Internet connection and try again.

巨大なクエリを実施するとこのエラーが起きる。

SELECT するカラムを絞る、パーティションを絞るなどする。
SELECT count でやるのもいい。

Parquet 形式に変換するとデータ量がかなり減るのでこちらもオススメ。

Connection Test Failed:Access denied when writing output to url: s3://athena-redash-results/redash-waf/3e952317-fed6-44ea-bf92-6973b2d1da24.csv . Please ensure you are allowed to access the S3 bucket. If you are encrypting query results with KMS key, please ensure you are allowed to access your KMS key

IAM User の権限に、クエリ結果保存バケット(S3 Staging (Query Results) Bucket Path)へのアクセス権がないと、Test Connection で表示される。

参考

AWSにRedashを設置

RedashからAmazon Athenaのクエリを実行できるようにする

Amazon Athena

EC2のRedashからAmazon Athenaを使うときに詰まったこととか