osqueryで収集したサーバー情報をAWS Athenaで分析する

# この記事でやること
[前回の記事](https://qiita.com/nakaniko/items/4770718dd7a8b931bf69)では osquery でサーバー情報をJSON形式のログに出力できるところまで確認しました。
この記事では出力されたログを AWS Firehose 経由で S3 に転送し、AWS Athena で分析してみようと思います。

# 参考にしたページ
[Capturing Osquery query results with AWS Firehose (Kinesis) and AWS Athena](https://zercurity.medium.com/capturing-osquery-query-results-with-aws-firehose-kinesis-and-aws-athena-25b3430a4471)

# 動作環境
[前回の記事](https://qiita.com/nakaniko/items/4770718dd7a8b931bf69)で作成した Amazon Linux 2 のEC2インスタンスをそのまま利用します。サーバー内で実行する作業があるのでセッションマネージャー等で接続できるようにしておいてください。

# AWS S3 バケットを作成

まずはS3のマネジメントコンソールでログを保管先(=Firehoseの転送先)とするS3バケットを作成します。
作成するバケットに特別な権限を付与する必要はありません。

![S3バケット作成.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13485/23ff1726-59d1-82a2-42da-a233baecc668.png)

# Kinesis Firehose の配信ストリームを作成

サーバーから osquery のログを転送する Kinesis Firehose 配信ストリームを作成します。

* マネジメントコンソールからKinesisダッシュボードを開き「今すぐ始める - Kinesis Data Firehose」を選択して「配信ストリームを作成」を押します。

![Kinesis Data Firehose配信ストリームの作成.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13485/371d345b-25db-e2d1-2dde-484537f8491c.png)

* Create a delivery stream 画面で必要事項を入力して「Create delivery stream」を押します。
  * Choose source and destination
      * Source: Direct PUT
      * Destination: Amazon S3
  * Delivery stream name： osquery-test　※任意の名前
![Firehose Create delivery stream 1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13485/1bfb5193-5b7b-c59a-b579-7ba90dfbfa90.png)
  * Destination settings：
      * S3 bucket: 先に作成したS3バケットを選択
![Firehose Create delivery stream 2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13485/91d0959e-3555-24fc-5d9e-05ecf987bf2e.png)
  * Advanced settings：
      * Permissions: Create or update IAM role KinesisFirehoseServiceRole-** を選択
![Firehose Create delivery stream 3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13485/6303bdb1-b369-86cc-bdfe-30b1383e0ad9.png)

# Firehose にデータ送信する IAM ユーザーを作成

osquery が Firehose へデータをプッシュする権限を持つ IAM ユーザーを作成します。

* IAM のマネジメントコンソールから IAM ポリシーを作成します。
  * ポリシーの作成画面の入力項目
      * サービス： Firehose
      * アクション： PutRecordBatch　※キャプチャでは他のアクションを含めてますがこれだけでいいはず
      * リソース： 先に作成した配信ストリームのARN

![IAMポリシー編集_ぼかし.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13485/00707f3d-f966-e171-cbdd-d59d35d0dfc5.png)

* IAM ユーザーを作成します。クレデンシャル情報は記録しておきましょう。
  * ユーザーの作成画面の入力項目
      * ユーザー名： osquery-test　※任意の名前
      * AWS 認証情報タイプを選択: アクセスキー - プログラムによるアクセス をチェック

![IAMユーザー作成.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13485/433cddc6-d34d-0fd9-7abc-de590519782a.png)

* また、作成した IAM ユーザーには先ほどのポリシーをアタッチしてください。

![IAMユーザー作成2_ぼかし.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13485/dc71d06a-1078-b159-2287-24a3ecf44446.png)


# osquery から Firehose にデータを送信する

osquery を実行するサーバーに接続してシェルから osquery を設定していきます。

* 設定ファイル（/etc/osquery/osquery.conf）に Firehose へログ送信する aws_firehose プラグインの設定を追加します。

```bash
sh-4.2$ sudo vi /etc/osquery/osquery.conf

  "options": {
    "config_plugin": "filesystem",
    // Firehoseにログを送信するplugin：aws_firehose を追加
    "logger_plugin": "filesystem,aws_firehose",
    // aws_firehoseプラグイン用の設定を追加
    "aws_access_key_id": "作成したIAMユーザーのアクセスキー",
    "aws_secret_access_key": "作成したIAMユーザーのシークレットアクセスキー",
    "aws_region": "配信ストリームを作成したリージョン",
    "aws_firehose_stream": "osquery-test",　 // 作成した配信ストリームの名前
    ・・・
  }
  // テスト結果を確認しやすくするために以下も変更
  "schedule": {
    "system_info": {
      "query": "SELECT hostname, cpu_brand, physical_memory FROM system_info;",
      //"interval": 3600
      "interval": 60, 　// 取得間隔を60秒に変更
      "snapshot": true  // ログの形式をスナップショットに変更
    }
```

* osqueryd を起動します。

```bash
sh-4.2$ sudo systemctl start osqueryd
```

* しばらく待つと Firehose 配信ストリームの宛先に指定した S3 バケットにログが溜まっていきます。
  * osqueryでは1分単位でログを取得しますがS3へは5分位の間隔で送信されていました。osqureyd側でバッファリングして送っているのでしょうか？

![S3バケットに格納されたログ_ぼかし.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13485/8bbded05-53d7-108f-c2d9-6a044174768a.png)

* ログの中身を覗いてみましょう。ここでは見やすいよう改行していますが実際のログには1イベント1行で出力されています。

![ログの中身.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13485/37a1ab14-3728-2681-bb39-c8f0a7a6741a.png)

# 前半戦終了

ここまでで osquery のログを AWS Firehose 経由で S3 バケットに集約することができました。
ここからは S3 バケットに保存されたログを Athena で分析する手順を記載していきます。

# AWS Glue を設定

* Athenaのマネジメントコンソールから「データソース - データソースを接続」を開き、以下を選択して「AWS Glueの作成」を押します。
  * データソースの選択： S3 - AWS Glue データカタログ
  * AWS Glue データカタログを選択：このアカウントの AWS Glue データカタログ
  * テーブルの作成方法を選択：AWS Glue でクローラを作成

![Athenaデータソースの接続.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13485/9561d851-4739-c9d8-c621-d73ba796ac93.png)
![Athenaデータソースの接続2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13485/c1c3c938-ae63-e73e-67ce-6d02b3362b6b.png)

* AWS Glue Consoleが立ち上がったら「今すぐ始める」を押し、「テーブル - クローラを使用してテーブルを追加」を押します。

![Glueコンソール.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13485/f703f2bf-a43b-d4c5-a234-64508e6487eb.png)

* クローラの追加画面からクローラを作成していきます。
  * クローラの名前：osquery-test　※任意の名前
![Glueクローラの情報.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13485/4f5d877b-3a2c-b0f0-d8ad-5e21642da6c9.png)
  * Crawler source type：Data stores
  * Repeat crawls of S3 data stores：Crawl all folders
![Glueクローラソースタイプ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13485/fca9c91b-efb1-4d2b-f9c0-494c4878ffb4.png)
  * データストアの選択：S3
  * インクルードパス：ログが格納されているS3バケットを選択
![Glueデータストア.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13485/a7a0c6fc-1a4b-e207-628f-b4bf0a9e51eb.png)
  * IAMロールの選択：IAMロールを作成する
  * IAMロール：AWSGlueServiceRole-osquery-test　※任意の名前を設定
![Glue IAMロール.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13485/a60d9b79-fa00-2947-132b-ca8d36641daa.png)
  * 頻度：オンデマンドで実行
![Glueクローラスケジュール.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13485/56fe0859-72cd-0b80-a1a7-c9e1058227a6.png)
  * クローラの出力を設定する
　データベース：osquery-test　※データベースの追加から新たに作成
![Glueクローラ出力.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13485/54104825-c508-9667-170d-2a375d7a8ab9.png)

* 作成されたクローラを選択してクローラの実行を押しましょう。

![Glueコンソール_クローラ実行後.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13485/c5bf0094-6965-c130-1377-b1f7030e2012.png)

* クローラの実行が終わるとテーブルが作成されています。

![Glueコンソール_テーブル.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13485/8f91d133-a4bb-2f93-fd26-85bd3b454d48.png)

# AWS Athena でクエリを実行

クローラで作成されたテーブルに対して Athena でクエリを実行してみましょう。

* Athenaのマネジメントコンソールからクエリエディタを開きます。
  * あらかじめ「設定 - クエリの結果と暗号化の設定」でクエリ実行結果を保存するバケットフォルダを選択しておいてください

* クエリエディタからクエリを実行します。

![Athenaクエリ実行.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13485/f8dcc432-b70e-428b-2551-cbccc77b1f14.png)

これで必要な作業は完了です！
osquery でサーバーから収集する情報を増やしつつ、いろんなAthenaクエリを実行して分析していきましょう。

# まとめ
この記事では osquery で収集したサーバー情報のログを AWS Firehose 経由で S3 に転送し AWS Athena で分析しました。

osquery には標準で AWS Kinesis Firehose や Kinesis Stream にログを転送するプラグインが組み込まれているので、あまり手間をかけずに Athena で分析可能な形に集約することが可能です。一度試してみてはいかがでしょうか。