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 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
|
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.yml1 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を表示させる。
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の画面
http://Kibanaの稼働しているホスト名orIPアドレス:5601 にブラウザでアクセス。
Username: elastic
Password: changeme
kibana起動直後はURLを入力しても応答無しかもしれないけど焦らない。
なお、この認証はこの後Basicライセンスを投入すると無くなる。(Basicライセンスでは使えなくなる?)
左のメニューで[Monitoring]の画面。(上の画像はBasicライセンス投入済みだけど)
左のメニューで[Monitoring]の中のNodeの画面。
とりあえずグラフが描かれてれば動いているといえる。
この時点ではKibanaは特に触らなくて良い。
ライセンス投入
Basicライセンス申し込みページで名前、メールアドレス、会社名、国名を入力・選択して[Send]を押す。
この画面が表示されてすぐにメールが送信されてくる。
メールのリンクをクリックすると上のページが表示されるので了承のチェックを付けて[Send]を押す。
使用する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
追記 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の左列メニューでmonitoringをクリックし、右列にLogstashの項目が表示されていたらOKの筈。
- TelegrafでElasticsearchにメトリクス送信+Kibanaで可視化 (後編)
- TelegrafでElasticsearchにメトリクス送信+Kibanaで可視化 (中編)
- TelegrafでElasticsearchにメトリクス送信+Kibanaで可視化 (前編)
- Metricbeatで収集したメトリクスデータをKibanaで可視化する
- Kibanaを操作する前にユーザーを作成する
- Metricbeat 8.6.0のインストールと設定
- Elastic Stack 8系をFreeBSDにインストール
- Elastic Stack 6.4.2への更新 FreeBSD ports用メモ
- WinlogbeatでWindowsイベントログを可視化 後編
- WinlogbeatでWindowsイベントログを可視化 中編
- WinlogbeatでWindowsイベントログを可視化 前編
- Elastic Stackを6.3.2に更新する
- Elastic Stackでシステム監視 Heartbeatで収集した死活情報をKibanaで可視化
- Elastic Stackでシステム監視 Heartbeatを使う準備
- Elastic Stackでシステム監視 FreeBSDのportsで6.2.3に更新
- ELK Stackでシステム監視 Filebeatで収集したVolumioのログから時系列の再生曲名リストを表示
- ELK Stackでシステム監視 Rspamd 1.7系のElasticsearchモジュールを試す
- ELK Stackでシステム監視 FilebeatでNTP統計ログ取得 Logstashで加工
- ELK Stackでシステム監視 FilebeatでRaspberry Pi Zero WのVolumio楽曲再生ランキング
- ELK Stackでシステム監視 MeticbeatでRaspberry Pi Zero WのVolumioを監視
- ELK Stackでシステム監視 FilebeatでFreeBSDのCPU温度取得+Kibanaグラフ化
- ELK Stackでシステム監視 FilebeatでFail2banのBan情報+地図表示
- ELK Stackでシステム監視 MetricbeatでNginxのステータス情報を取得+グラフ化
- ELK Stackでシステム監視 FreeBSDのportsでELK Stack6系をインストール
- ELK Stackでシステム監視 FreeBSDにMetricbeatをインストールしてみる
- ELK Stackでシステム監視 elasticsearchインデックスのスキーマが勝手に変わる対処 テンプレート作成
- NanoPi NEO2(arm64)用にFilebeatをビルド
- ELK Stackでシステム監視 kibanaでDNSサーバの情報表示
- ELK Stackでシステム監視 kibanaのTimelion,Timeseriesでグラフ作成
- ELK Stackでシステム監視 collectdでDNSサーバの情報収集