docker-elkを使って過去のCloudTrailのログをサクッと分析してみた
こんにちは、佐伯です。CloudTrailのログを分析をする機会がありました。どうやって分析しようかなと考えていたところ、GitHubでdocker-elkを発見し、お手軽で便利だったので紹介させて頂きます。
環境
以下の環境で実施しています。
- macOS High Sierra version 10.13.5
- Docker CE for Mac version 18.03.1-ce-mac65
- Docker Compose version 1.21.1
やってみた
docker-elkのclone
docker-elkをcloneします。
1 2 3 4 5 6 | $ git clone git@github.com:deviantony/docker-elk.gitCloning into 'docker-elk'...remote: Counting objects: 1317, done.remote: Total 1317 (delta 0), reused 0 (delta 0), pack-reused 1317Receiving objects: 100% (1317/1317), 272.64 KiB | 254.00 KiB/s, done.Resolving deltas: 100% (519/519), done. |
Logstashの設定変更
logstash/pipeline/logstash.conf のinputにcodec => "json_lines"を追加します。
1 2 3 4 5 6 7 8 9 10 11 12 | $ git diffdiff --git a/logstash/pipeline/logstash.conf b/logstash/pipeline/logstash.confindex 10e442e..ea959de 100644--- a/logstash/pipeline/logstash.conf+++ b/logstash/pipeline/logstash.conf@@ -1,6 +1,7 @@ input { tcp { port => 5000+ codec => "json_lines" } } |
Dockerイメージのビルド
docker-compose build コマンドでElasticsearch, Logstash, KibanaのDockerイメージをビルドします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | $ docker-compose buildBuilding elasticsearchStep 1/1 : FROM docker.elastic.co/elasticsearch/elasticsearch-oss:6.3.06.3.0: Pulling from elasticsearch/elasticsearch-oss7dc0dca2b151: Pull completea50481268b4a: Pull completeee5228de771f: Pull completeda55b983e8eb: Pull complete143eb5dd5e49: Pull complete29d8a2d8ea47: Pull completebe99c5384de1: Pull completeDigest: sha256:0e0d73cb8bdce88c25adb9426aecabf89db4235d44ea29402f5f28b813f23d2eStatus: Downloaded newer image for docker.elastic.co/elasticsearch/elasticsearch-oss:6.3.0 ---> 345a3630eed8Successfully built 345a3630eed8Successfully tagged docker-elk_elasticsearch:latestBuilding logstashStep 1/1 : FROM docker.elastic.co/logstash/logstash-oss:6.3.06.3.0: Pulling from logstash/logstash-oss7dc0dca2b151: Already exists49bfedd6a110: Pull completea64a68a73a51: Pull complete1cd2ef8fceec: Pull complete9c36f545c69b: Pull complete56834e932068: Pull complete5cddbd76eb86: Pull completec3bb761ee199: Pull complete1d22756d288c: Pull complete73e34c1b50e9: Pull complete054f809e4ee2: Pull completeDigest: sha256:3bb06bac6367163d0e62476a92b93a24391b7d6a0bb9ac775031902eb67bee1cStatus: Downloaded newer image for docker.elastic.co/logstash/logstash-oss:6.3.0 ---> 77bdbc2dc566Successfully built 77bdbc2dc566Successfully tagged docker-elk_logstash:latestBuilding kibanaStep 1/1 : FROM docker.elastic.co/kibana/kibana-oss:6.3.06.3.0: Pulling from kibana/kibana-oss7dc0dca2b151: Already existsb9645d7e6c1f: Pull completeb302e33a173a: Pull completedc79440b74ce: Pull complete630d27689874: Pull completefeca8dd48a11: Pull complete294e4e758537: Pull complete7200ec2d04f1: Pull complete0728d5722948: Pull completeDigest: sha256:61c80292ce97b05f460efe26409f176c20d8f493b9ec4bdd9da0a8fa78ff8f0aStatus: Downloaded newer image for docker.elastic.co/kibana/kibana-oss:6.3.0 ---> 135bf752e257Successfully built 135bf752e257Successfully tagged docker-elk_kibana:latest |
コンテナの起動
docker-compose up -dでElasticsearch, Logstash, Kibanaのコンテナを起動します。
1 2 3 4 5 | $ docker-compose up -dCreating network "docker-elk_elk" with driver "bridge"Creating docker-elk_elasticsearch_1 ... doneCreating docker-elk_logstash_1 ... doneCreating docker-elk_kibana_1 ... done |
CloudTrailログのダウンロード
AWS CLIを使って分析したい期間分のログをダウンロードします。今回は traillogs/ 配下に7/1〜7/7分のログをダウンロードしています。
1 | $ aws s3 cp s3://<S3 Bucket Name>/AWSLogs/<AWS Account ID>/CloudTrail/<AWS Region>/2018/07/ traillogs/ --exclude "*" --include "*2018070[1234567]*.json.gz" --recursive |
CloudTrailのログをLogstashへ送信
以下のコマンドでCloudTrailのログをLogstashへ送信します。
1 | $ find traillogs -name *.json.gz | xargs gzcat | jq -r -c -M .Records[] | nc localhost 5000 |
docker-compose.ymlを見てもらえばわかりますが、Logstashは5000番ポートでListenしています。CloudTrailのログをgzcatで開き、更にjqで各イベントが一行ずつとなるようにして、標準出力をncコマンドを使って、localhostの5000番ポートへ渡しています。
Kibanaへアクセス
http://localhost:5061 をブラウザで開き、Kibanaにアクセスします。左メニューからDiscover, Visualize, Dashboardのいずれかをクリックするとインデックスパターン作成の画面が表示されます。
インデックスパターンの作成
今回は対象のログのみを送信しており、インデックスの分割もしてないので*を入力し全てのインデックスを対象にしました。
[Time Filter field name]はタイムスタンプが含まれているeventTimeを選択します。
ログの可視化
グラフなどの作成はVisualizeより作成します。今回は簡単に、私が使用しているIAMユーザーによってAPIコールされたイベントのグラフを作ってみました。特に理由はないですが円グラフを選択しました。
先程作成したインデックスパターン*を選択します。
送信したCloudTrailのログと同じ期間になるように、タイムレンジを2018/07/01-07に指定しました。ざっくりと[This year]などを選択しても問題ないです。
[Add a filter]からuserIdentity.userName is <Username>のフィルタを追加し、私の使用しているIAMユーザーでフィルタを行います。
[Buckets]は以下のような設定にして、[Apply changes]をクリックするとグラフが表示されました!
あとは作ったVisualizeを保存して、Dashboardに追加すればおっけーです。
Elasticsearchのデータ保持について
docker-compose downでコンテナを削除するとElasticsearchのデータは削除されます。データを保持したい場合は以下リンクのように、Dockerホストのディレクトリをマウントするように設定します。
How can I persist Elasticsearch data?
まとめ
Amazon Athena + Amazon QuickSightでの可視化も検討しましたが、過去のCloudTrailのログを分析するにあたりリアルタイム性や継続的な可視化は不要だったので、今回はお手軽に使えるdocker-elkを使用しました。(ログの量が多いと大変だけど…)