ELK Stackのインストール

FreeBSD上でELK Stackを使ったことが無いのと、何も無いところから作るのは未経験なので手探りの部分があり、この記事は公開後も暫く更新する予定。

ELK stackというのはElasticsearch(検索エンジン)とLogstack(ログ収集+加工+出力)とKibana(ウェブ検索UI)の3点セット。
データの流れとしてはLogstack→Elasticsearch→Kibanaなんだけど何でELKなんでしょね?
Logstackで何のログを取るかの部分はまた別の話。簡易な監視システムではSnortとかSuricataとかを使うけど、普通にSyslogやウェブサーバのログとかでも。

FreeBSDにはそれぞれ複数バージョン入っているが、今回は3つともバージョン5系を使用することにする。(6系のpkg/portsは無いみたい)
さらにX-Packも入れる。X-Packを入れるということは少なくとも1年単位で更新するBasicライセンス(無料)が必要になる。資金に余裕があるならさらに上のライセンスを購入。(ライセンスの種類と機能表)

インストール

FreeBSDでインストールするpkg/portsは以下5つ。

  • textproc/elasticsearch5   Full-text search engine for Java
  • textproc/elasticsearch5-x-pack   Elasticsearch X-Pack plugins
  • sysutils/logstash5   Data ingest and transfomation tool
  • textproc/kibana5   Browser based analytics and search interface
  • textproc/kibana5-x-pack   Kibana 5.0 X-Pack plugins
pkgでhoge/hageをインストールする例
# pkg install hoge/hage
portsでhoge/hageをインストールする例
# cd /usr/ports/hoge/hage
# make insall clean

ElasticSearchとLogstackはJavaのプログラムなので依存関係を満たすためにJDKをはじめ山のようにpackage or portsを入れられる。

OpenJDK8関係の設定

/etc/fstab (追記)
1
2
fdesc           /dev/fd         fdescfs rw      0       0
proc            /proc           procfs  rw      0       0

普段からJava/JDK使ってないと忘れやすい設定だけどやっとかないとおそらくLogstashが使えない。(特にproc側)

/boot/loader.conf (追記)
fdescfs_load="YES"

ネットワーク周りのチューニング

ELK Stackを入れたサーバで完結するなら別だけど、大抵は他の監視対象ホストからも情報を集めることになる筈。FreeBSD(Linuxも)初期値だとネットワーク周りが弱いので調整しておく。

/etc/sysctl.conf (追加)
1
2
3
kern.ipc.somaxconn=1024      #listen queue (TCP) 初期値128は少なすぎる
kern.ipc.maxsockbuf=8388608  #8MB
kern.ipc.nmbclusters=262144  #mbuf 
/boot/loader.conf (追加)
kern.ipc.maxsockets=524280

例えばkern.ipc.somaxconn=1024であれば sysctl -w kern.ipc.somaxconn=1024 のように実行すればOSを再起動せずに即適用できる(再起動したら消えるので/etc/sysctl.confにも書く)けど面倒なので/etc/sysctl.conf(と/boot/loader.conf)に書いたらOS再起動するかな。

ElasticSearchの設定

/usr/local/etc/elasticsearch/elasticsearch.yml
1
2
3
4
5
path.data: /var/db/elasticsearch
path.logs: /var/log/elasticsearch
path.scripts: /usr/local/libexec/elasticsearch
network.host: localhost
http.port: 9200

Logstackの設定と動作確認

logstashの動作に関わる設定ファイルは/usr/local/logstash/configにある(FreeBSDのpkg/portsでインストールした場合)。

メモリの割当てはjvm.optionsで行う。初期値は -Xms256m -Xmx1g なのであまり大きくはない。LS_hoge関係はstartup.optionsにある。

logstashのデータ取得関係の設定ファイルは/usr/local/etc/logstashにある(FreeBSDのpkg/portsでインストールした場合)

ここではpkg/portsインストールでインストールされた /usr/local/etc/logstash/logstash.confを利用する。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
input {
    file {
        type => "syslog"
        # path => [ "/var/log/*.log", "/var/log/messages", "/var/log/syslog" ]
        path => "/var/log/messages"
        start_position => "beginning"
    }
}

filter {
    #コメント行複数、暫くはFileterを使わないかも
}

output {
    stdout { codec => rubydebug }
    # elasticsearch { hosts => [ "localhost:9200" ] }
}

動作テストなのでoutputがstdoutになっていること。outputのelasticsearch行がコメントになっていること。(触らなくても最初からそうなってる筈)
これで入力がsyslog、フィルタ無し、出力が標準出力(コンソールに出力)となる。

# /usr/local/logstash/bin/logstash -f /usr/local/etc/logstash/logstash.conf
[2017-12-25T16:33:52,975][INFO ][logstash.pipeline        ] Starting pipeline {"id"=>"main", "pipeline.workers"=>2, "pipeline.batch.size"=>125, "pipeline.batch.delay"=>5, "pipeline.max_inflight"=>250}
[2017-12-25T16:33:53,236][INFO ][logstash.pipeline        ] Pipeline main started
[2017-12-25T16:33:53,297][INFO ][logstash.agent           ] Successfully started Logstash API endpoint {:port=>9600}

上は参考程度。こんな感じでコマンドの入力後に(数秒待たされてから)各行で[日時]や[INFO][logstash hoge]のような文字列から始まるのが出力されるならOK.
java.lang.InternalErrorのような表示があったり空白+fromで始まる行がズラズラ出るようならJDKの設定が不完全。

Logstashが正常に動くことが確認できたら、/usr/local/etc/logstash/logstash.confのoutputのstdout行をコメントにしてelasticsearchの行のコメントを外す(Elasticsearchに渡す)。
おそらく、プロンプトが返ってこないので[Ctrl]+[C]を2回押す。

何のログを収集して整形するかが重要だけどこの記事ではinputとfilterはやらない。

Kibanaの設定

Kibanaの設定をネットで検索すると例えば認証機能を付けるためなどの理由でNginxのリバースプロキシを噛ませるのなどが多いようだけど、この記事ではリバースプロキシは無しとする。
下の設定例だとURL http://192.168.52.20:5601/ でKibanaを表示させる。

/usr/local/etc/kibana.yml
1
2
3
4
5
6
server.port: 5601
#server.host: "localhost"
server.host: "192.168.52.20"  #Kibanaの動いているホストの(監視側セグメントの)IPアドレス
elasticsearch.url: "http://localhost:9200"
elasticsearch.preserveHost: true 
path.data: /var/db/kibana     #←無ければ追加
# mkdir /var/db/kibana
# chown -R www:www /var/db/kibana

FreeBSDのpkg/ports標準ではkibanaはwwwユーザーで動くのでKibanaのデータ置き場をwwwユーザーで作ってやる。
path.dataが存在しないと認証後は1つの画面(Dashboard)以外に遷移出来ない筈。
また、起動時にkibana.pidが作成できなくて起動失敗になることがあるようなのでパーミッションを確認・変更する。(初期値は/var/runの下の筈)

ELK Stackの起動

/etc/rc.conf (追記)
1
2
3
4
5
6
7
#ELK Stack
elasticsearch_enable="YES"
logstash_enable="YES"
kibana_enable="YES"

logstash_log="YES"
logstash_log_file="/var/log/logstash.log"

# service elasticsearch start
# service logstash start
# service kibana start

Kibanaの画面

Kibana 1
http://Kibanaの稼働しているホスト名orIPアドレス:5601 にブラウザでアクセス。
Username: elastic
Password: changeme

kibana起動直後はURLを入力しても応答無しかもしれないけど焦らない。
なお、この認証はこの後Basicライセンスを投入すると無くなる。(Basicライセンスでは使えなくなる?)

Kibana 2
左のメニューで[Monitoring]の画面。(上の画像はBasicライセンス投入済みだけど)

Kibana 3
左のメニューで[Monitoring]の中のNodeの画面。
とりあえずグラフが描かれてれば動いているといえる。

この時点ではKibanaは特に触らなくて良い。

ライセンス投入

ライセンス 1
Basicライセンス申し込みページで名前、メールアドレス、会社名、国名を入力・選択して[Send]を押す。

ライセンス 2
この画面が表示されてすぐにメールが送信されてくる。

ライセンス 3
メールのリンクをクリックすると上のページが表示されるので了承のチェックを付けて[Send]を押す。

ライセンス 4
使用するElasticsearchのバージョンに応じてダウンロードボタンを押す。この記事的にはElasticsearch5を使用するので右のダウンロードボタンを押す。
JSONファイルがダウンロードされる。

試用時のライセンス表示

# curl -XGET 'http://localhost:9200/_xpack/license'
{
  "license" : {
    "status" : "active",
    "uid" : "abcdef12-345a6789-b01c-234567890123",
    "type" : "trial",
    "issue_date" : "2017-12-24T00:00:00.000Z",
    "issue_date_in_millis" : 0000000000000,
    "expiry_date" : "2018-01-23T00:00:00.000Z",
    "expiry_date_in_millis" : 0000000000000,
    "max_nodes" : 1000,
    "issued_to" : "elasticsearch",
    "issuer" : "elasticsearch",
    "start_date_in_millis" : -1
  }
}

取得したライセンスのJSONファイルを使う。(説明ページ)

$ curl -XPUT -u elastic 'http://localhost:9200/_xpack/license' -H "Content-Type: application/json" -d @/path/hoge/Elastic _License.json

おそらく上のコマンドでは This license update requires acknowledgement. ・・・のようなメッセージ入りのレスポンスが来てライセンスが通らないので下。

$ rl -XPUT -u elastic 'http://localhost:9200/_xpack/license?acknowledge=true' -H "Content-Type: application/json" -d @/path/hoge/Elastic_License.json

/path/hogeはライセンスファイルを置いたPath。貰ったライセンスファイルの名前は全然違う筈。

Enter host password for user 'elastic': changeme
{"acknowledged":true,"license_status":"valid"}

elasticアカウントのパスワードを尋ねられるので初期パスワードから未変更ならchangemeを入力して[Enter]
短いレスポンスが返ってきたらおそらく成功。
もう一度ライセンスを確認する。

$ curl -XGET 'http://localhost:9200/_xpack/license'
{
  "license" : {
    "status" : "active",
    "uid" : "abcdefab-1234-5678-cdef-90123456789a",
    "type" : "basic",
    "issue_date" : "2017-12-24T00:00:00.000Z",
    "issue_date_in_millis" : 0000000000000,
    "expiry_date" : "2018-12-24T23:59:59.999Z",
    "expiry_date_in_millis" : 0000000000000,
    "max_nodes" : 100,
    "issued_to" : "Hoge Hage (EXAMPLE.INC)",
    "issuer" : "Web Form",
    "start_date_in_millis" : 0000000000000
  }
}

statusがactive(有効)でtype(ライセンス種類)がbasicもしくは契約したライセンス種類、issued_toにライセンス登録時に入力した名前が入っていてexpiry_date(期限)が1年後であることを確認する。

elasticsearchでxpackの設定

/usr/local/etc/elasticsearch/elasticsearch.yml (追記)
xpack.security.enabled: false
基本的に使用しない機能をfalseにするだけのよう。

追記 LogstashにX-Packをインストール

Logstash用のX-PackはFreeBSDのports/pkgが用意されていないので手動で入れることになるらしい。

# cd /usr/local/logstash/bin
# chmod +x logstash-plugin
# ./logstash-plugin install x-pack
# service logstash restart

Kibana 4
kibanaの左列メニューでmonitoringをクリックし、右列にLogstashの項目が表示されていたらOKの筈。

関連記事: