winlogbeat + Elasticsearch + Kibana で Windowsシステムログを可視化する ~ インストールも自動化 ~

# 0.はじめに
Elastic社より提供されている[winlogbeat(ver.1.2.3)](https://www.elastic.co/downloads/beats/winlogbeat)について試してみました。

本記事では主に以下を記載します。
- winlogbeatのインストールを自動化するAnsible playbook
- Elasticsearch及びKibanaの環境を構築するdocker-compose

なお、十分な検証が行えているわけではありませんので検証環境等でのデモ、素振り用などに限定してお使いください。

## 1.1.winlogbeatとは
winlogbeatはWindowsのイベントログを収集し、Elasticsearchへ投げてくれるものです。
いわゆるELKスタックのlogstathにあたる部分を担います。
なお、beatsとlogstathは連携可能ですが、今回logstashは利用していません。

 [elastic社の公式サイトドキュメント](https://www.elastic.co/guide/en/beats/winlogbeat/current/winlogbeat-getting-started.html)を参考にしてAnsibleよりWindowsServerへwinlogbeat(ver.1.2.3)をインストールするplaybookを作成しました。

## 1.2.Elasticsearch及びKibanaについて
[こちらの記事](http://qiita.com/narumi_/items/ec1c4cbbc65ec26b46f8)を参考にfluentdの部分を除いたものを別途作成しdocker-composeでDocker上に構築しています。

## 2.環境
- Windows Server
  - WindowsServer2012 R2
  - winlogbeat ver. 1.2.3

- Elasticsearch / Kibana Server
  - CentOS7.2
  - Docker ver. 1.12.0
  - Docker-compose ver. 1.8.0
  - Elasticsearch ver. 2.3.4
  - Kibana Ver. 4.5.3

- Ansible server
  - CentOS6.7
  - Ansible ver. 2.2.0 (devel 3c65c03a67)

## 3.インストール
### 3.1.Elasticsearch および Kibanaの環境構築
既にElasticsearch および Kibanaの環境がある場合は本項目は読み飛ばしてください。
winlogbeatのインストール時に必要なElasticsearch および Kibanaの環境を先に構築します。
今回はDocker-composeを利用してDocker上に構築します。

#### 3.1.1.資材のダウンロード(Docker-compose.ymlなど)
Docker-composeが利用できるサーバ上の任意のディレクトリで以下を実行します。

```
git clone https://github.com/tbuchi888/elasticsearch-kibana-docker-compose.git
cd elasticsearch-kibana-docker-compose
```

gitが使えない環境の場合は以下githubからZipなどでダウンロードしたもの利用するか
https://github.com/tbuchi888/elasticsearch-kibana-docker-compose

以下のソースファイルをご利用ください。

*ファイル構成*

```
docker-compose.yml
elasticsearch/
  - Dockerfile
```

*docker-compose.yml*

``` docker-compose.yml
elasticsearch:
  build: elasticsearch
  ports:
    - 9200:9200
kibana:
  image: kibana
  ports:
    - 9204:5601
  environment:
      - ELASTICSEARCH_URL=http://elasticsearch:9200
  links:
      - elasticsearch
```

*elasticsearch/Dockerfile*

```
FROM elasticsearch
RUN bin/plugin install mobz/elasticsearch-head
EXPOSE 9200
CMD  ["bin/elasticsearch", "-Des.insecure.allow.root=true"]
```

#### 3.1.2.Dockerの起動
docker-compose.ymlのあるディレクトリでdockerを起動します。

```
docker-compose up -d
```

なお、停止のコマンドは以下となります。

```
docker-compose stop
```
以上でelasticsearch-kibanaのインストールは完了です。


### 3.2.winlogbeatのインストール
Ansibleサーバ上の任意のディレクトリで以下を実行します。

#### 3.2.1 資材のダウンロード(winlogbeat本体zip、win_unzipモジュール用pscx.msi)
以下ファイルをあらかじめダウンロードし、filesディレクトリに配置します。

- files/winlogbeat-1.2.3-windows.zip
  - [winlogbeat-1.2.3-windows.zip](https://download.elastic.co/beats/winlogbeat/winlogbeat-1.2.3-windows.zip)
  - [sha1](https://download.elastic.co/beats/winlogbeat/winlogbeat-1.2.3-windows.zip.sha1.txt)
- files/pscx.msi
  - [pscx.msi](http://download-codeplex.sec.s-msft.com/Download/Release?ProjectName=pscx&DownloadId=923562&FileTime=130585918034470000&Build=20959)
  - **ブラウザ等でダウンロードしてください。wgetではうまくダウンロードできませんでした。**
  - **こちらの環境でダウンロードしたファイルは`Pscx-3.2.0.msi`でしたのでファイルをfilesディレクトリへ配置する際に`pscx.msi`へrenameしてご使用ください。**

#### 3.2.2 資材のダウンロード（Ansible Playbookなど）と自環境に合わせた変更

```
git clone https://github.com/tbuchi888/ansible_winlogbeat.git
cd ansible_winlogbeat/
```

gitが使えない環境の場合は以下githubからZipなどでダウンロードしたもの利用するか
https://github.com/tbuchi888/ansible_winlogbeat

以下のソースファイルをご利用ください。

ファイル構成

```
files/
 - pscx.msi # 項番3.2.1.でダウンロードしたもの win_unzipモジュールで利用します
 - winlogbeat-1.2.3-windows.zip # 項番3.2.1.でダウンロードしたもの winlogbeat本体
hosts # Ansibleのインベントリファイル
install_winlogbeat.yml # Ansible playbook
templates/
 - winlogbeat.yml.j2 # AnsibleのJinja2テンプレート
```

*hosts*
以下環境に合わせて適時書き換えてください。
**git clone やgithubからzipダウンロードした場合も同様に**

```
[win]
win01 # インストール対象windowsサーバ
win02 # インストール対象windowsサーバ 

[win:vars]
ansible_user=ansible_user
ansible_password=ansible_password
ansible_port=5985
ansible_connection=winrm
```

*install_winlogbeat.yml*
以下環境に合わせてElasticsearchの変数を適時書き換えてください。
**git clone やgithubからzipダウンロードした場合も同様に**

``` install_winlogbeat.yml
---
- hosts: win
# Don't gather hosts facts for performance
  gather_facts: no
  vars:
# Elasticsearch hosts
    elas_hosts: 192.168.33.100 #Elasticsearch(Dockerサーバ)のwindowsサーバから名前解決可能なホスト名またはIPアドレス 自分の環境に合わせて変更してください
    elas_hosts_port: 9200 #Elasticsearchのport番号
# reinstall winlogbeat
    reinstall: true #再インストールする場合はtrueを指定

# Setting the task
  tasks:

#以下は再インストール用の設定です。かなり強引なことをしているので。
#不要な場合は削除するかreinstallをfalseに設定してください。
# ここから　----
   - name: Preparing for Step Winlogbeat Stopped with ignore errors
     win_service:
       name: winlogbeat
       start_mode: auto
       state: stopped
     ignore_errors: true
     when: reinstall==true

   - name: Preparing for Step Remove directory
     raw: Remove-Item -Path C:\progra~1\winlogbeat\ -Force -Recurse -ErrorAction SilentlyContinue
     ignore_errors: true
     when: reinstall==true
# ここまで　----

   - name: Preparing for Step Create work directory
     win_file:
       path: "C:/work/"
       state: "directory"

   - name: Preparing for Step Copy zip file of Winlogbeat
     win_copy:
       src: "files/winlogbeat-1.2.3-windows.zip"
       dest: "C:/work/winlogbeat-1.2.3-windows.zip"

   - name: Preparing for Step Copy PSCX msi
     win_copy:
       src: "files/pscx.msi"
       dest: 'C:\work\pscx.msi'

   - name: Preparing for Step Install PSCX
     win_msi:
       path: 'C:\work\pscx.msi'

   - name: Preparing for Step Decompression zip file
     win_unzip:
       src: "C:/work/winlogbeat-1.2.3-windows.zip"
       dest: "C:/work/winlogbeat"

   - name: Preparing for Step Move directory
     raw: Move-Item -Path "C:\work\winlogbeat\winlogbeat-1.2.3-windows\" -Destination "C:\progra~1\winlogbeat\"

   - name: Preparing for Step Change config of Winlogbeat
     win_template:
       src: templates/winlogbeat.yml.j2
       dest: C:/progra~1/winlogbeat/winlogbeat.yml

   - name: Winlogbeat Step1 Installing Winlogbeat
     raw: PowerShell.exe -ExecutionPolicy UnRestricted -File C:\progra~1\winlogbeat\install-service-winlogbeat.ps1

   - name: Winlogbeat Step2 Configuring Winlogbeat
     raw: C:\progra~1\winlogbeat\winlogbeat.exe -c C:\progra~1\winlogbeat\winlogbeat.yml -configtest -e

   #  Skip Winlogbeat Step3 Configuring Winlogbeat to Use Logstash

   - name: Winlogbeat Step4 Loading the Index Template in Elasticsearch
     raw: Invoke-WebRequest -Method Put -InFile C:\progra~1\winlogbeat\winlogbeat.template.json -Uri http://{{ elas_hosts }}:{{ elas_hosts_port }}/_template/winlogbeat?pretty -UseBasicParsing
   - name: Winlogbeat Step5 Starting Winlogbeat
     win_service:
       name: winlogbeat
       start_mode: auto
       state: started
```

*templates/winlogbeat.yml.j2*
長いのでこちらを参照してください。
https://raw.githubusercontent.com/tbuchi888/ansible_winlogbeat/master/templates/winlogbeat.yml.j2

winlogbeat-1.2.3-windows.zipの中にある`winlogbeat.yml`を
Elasticsearchのホスト情報について
以下のようにAnsibleのplaybookで定義している変数へ変更したJinja2テンプレートです。

```
#diff winlogbeat.yml winlogbeat.yml.j2
42c42
<     hosts: ["localhost:9200"]
---
>     hosts: ["{{ elas_hosts }}:{{ elas_hosts_port }}"]
```

#### 3.2.3.Ansible playbookの実行
Ansibleサーバ上で以下playbookを実行し、windowsサーバへwinlogbeatをインストールします。

```
ansible-playbook -i hosts install_winlogbeat.yml -v
```

以上でwinlogbeatのインストールは完了です。

## 4. kibanaの初期設定とログ確認
ブラウザよりKibana（http://192.168.33.100:9204/ ※192.168.33.100はDockerのIP）へアクセスして、`Setting`タブでindexパターンを登録します。

![kibana_index.png](https://qiita-image-store.s3.amazonaws.com/0/117986/b0cd8805-b977-742b-a970-d4a5873f8323.png)

(logstash-*となっている部分を)`winlogbeat-*`に書き換えて`Create`ボタンを押下します。

![kibana_index2.png](https://qiita-image-store.s3.amazonaws.com/0/117986/1b7e3b11-5460-1ac0-347a-7a4613c59c41.png)

`discover`タブでログが収集できていることを確認します。

![kibana_discover.png](https://qiita-image-store.s3.amazonaws.com/0/117986/ea9aa798-0838-f4a0-47e7-1c9d1c898111.png)


以上