GuardDuty のログを Splunk で取り込む

## はじめに
Splunk を使って、GuardDuty のデータを収集するとの事。
出来るかどうか知らないので、調べて作ってみたのが今回のお話。

## GuardDuty？
AWS のマネージド型脅威検出サービス。
悪意のある操作や不正な動作を継続的に監視し、AWS アカウントとワークロードを保護する。

## Splunk？
スプランクと読む。
あらゆる種類のログ、テキスト、数値データをリアルタイムでインデックス化し、検索を出来るようにするソフトウェア。
GuardDuty のログを取り込む事が出来るとの事。

## 作ってみた

### Splunk のインストール
適当に Linux サーバを立てます。今回は、AmazonLinux2 を使いました。
Splunk は Enterprise 版が60日間試用出来るとの事なので、DL してみた。
https://www.splunk.com/ja_jp/download.html

RedHat 系 OS なので、rpm をダウンロードし、インストールした。

```bash
# wget のコマンドをコピペできるようになっていたので、そのまま使った
wget -O splunk-7.1.2-a0c72a66db66-linux-2.6-x86_64.rpm 'https://www.splunk.com/~~~~~~'
rpm -ivh splunk-7.1.2-a0c72a66db66-linux-2.6-x86_64.rpm 
```

ダウンロード完了後は、/opt 配下にインストールされるので、下記コマンドで Splunk を起動する。

```bash
# systemd の登録はめんどくさいからやらなかった
cd /opt/splunk/bin/
./splunk start
```

初回起動時は利用規約？の表示と管理者ユーザのパスワード設定がある。
起動後は、http://IPアドレス:8000 でコンソールにログイン出来る。
![screen_capture_08-21(11).png](https://qiita-image-store.s3.amazonaws.com/0/269938/5a64981f-4f90-0b4b-69fd-94be4417e482.png)

ログイン後、**/en-US/app/launcher/home** ってなっている URL を **/ja-JP/app/launcher/home** に変えると、日本語化される。
日本語表示をデフォルトにする方法は調べていない。


### プラグインの追加
GuardDuty はそのままでは取り込めないようで、プラグイン？を追加する必要がある
画面左側の Find More Apps をクリックし、**guardduty** で検索する。
すると、**Amazon GuardDuty Add-on for Splunk** が検索結果に表示されるので、インストールをする。
![screen_capture_08-21(4).png](https://qiita-image-store.s3.amazonaws.com/0/269938/b2871cbb-f4eb-d637-6382-c049fd0faca4.png)

インストールする際、Splunk をダウンロード時に作成したユーザID/パスワードを入力する必要あり。

### エンドポイントの作成
GuardDuty のログを受け付けるエンドポイント(のトークン)を作成する。
画面上部のメニューに表示されている**設定**から、**データ入力**を選択する。


**HTTP イベントコレクタ**を選択する。
**グローバル設定**から、全トークンを**有効**に設定する。
![screen_capture_08-21(7).png](https://qiita-image-store.s3.amazonaws.com/0/269938/ff029728-56ab-bb10-5606-c172fbe36ff2.png)

次に、新規トークンを作成する。
適当な名前を入力し、次の設定に進む。
![screen_capture_08-21.png](https://qiita-image-store.s3.amazonaws.com/0/269938/9115e498-2d0c-042a-25c3-9ebaa6110d9d.png)

ソースタイプを選択に設定し、**aws:cloudwatch:guardduty** に設定する。
App コンテキストは、**aws_guardduty(TA-aws_guardduty)** に設定する。
インデックスは分からないから全部選択。デフォルトインデックスもよく分からないから、**main** を選択した。
![screen_capture_08-21(6).png](https://qiita-image-store.s3.amazonaws.com/0/269938/be8fff05-c9f7-37a9-b797-fda9a3ff0649.png)

で、作成されたトークンは次のステップで使うから忘れないように。

### GuardDuty の有効化
前回、[CloudFormation](https://qiita.com/nis_nagaid_1984/items/d4c0c04673e4f71f3093) で有効化したから割愛。

### Lambda の用意
GuardDuty は CloudWatch Events でしか拾えない。拾ったものを Splunk に投げつけるには何かしらの仕組みが必要。
Lambda にそんな設計図(splunk-logging)があらかじめ用意されているので、それを使う。
![screen_capture_08-21(10).png](https://qiita-image-store.s3.amazonaws.com/0/269938/73553fc0-72d7-4fb5-ff5c-1d1d073ee8f8.png)

Lambda の環境変数に下記を設定する。
![screen_capture_08-21(1).png](https://qiita-image-store.s3.amazonaws.com/0/269938/2ad3123f-119d-3bfd-f939-45f06cd44aa6.png)

- SPLUNK_HEC_URL：http://IPアドレス:8088/services/collector
- SPLUNK_HEC_TOKEN：さっき作ったトークン

関数をデプロイ後、一部ソースを修正する。

```js
logger.logEvent({
        time: Date.now(),
        host: 'serverless',
        source: `lambda:${context.functionName}`,
        //sourcetype: 'httpevent', ←これを↓に
        sourcetype: 'aws:cloudwatch:guardduty',
        event: event,
    });
```

### CloudWatch Events の設定
ルールを作成し、GuardDuty に関するイベントを、さっき作った Lambda に紐づける。
![screen_capture_08-21(0).png](https://qiita-image-store.s3.amazonaws.com/0/269938/d1ea0029-63fb-1313-b1ef-122182580d4c.png)

## 完成
あとはデータが流れてくるのを待てばいいだけ。
最初から用意されているダッシュボードを眺めてよう。
あとは、これを使うなら、GuardDuty のマスターアカウントとメンバーの設定をやらないと。。
![screen_capture_08-21(3).png](https://qiita-image-store.s3.amazonaws.com/0/269938/e0f4c43f-521f-9ea7-28e0-2ec6c524b6bd.png)

## 最後にいつものやつ
弊社ではエンジニアを募集中です。インフラからアプリ、ユーザサポートまで幅広く業務を行ってます。
https://www.nittsu-infosys.com/recruit/2019/index.html