RTX1210のログをelasticsearchで扱う(前編)
windowsserverのイベントログをwinlogbeat, logstash, elasticsearch, kibana、いわゆるElastic Stackを使って収集、可視化してみたらなかなか良いものだったので、せっかくならRTXのログも見やすくならないかなと言うことで試行中。
構成配置としては、RTX1210配下にある端末でlogstash => elasticsearch <=kibanaという組立。
RTX1210からsyslogをこのElastic Stack端末に送り、logファイルをlogstashで捕捉する。
RTX1210 => rsyslog => log-file <= logstash => elasticsearch <= kibana
こんな感じ。
Elastic Stackの導入もさわりだけメモ。
環境は下記
$ sudo cat /etc/os-release
PRETTY_NAME=”Debian GNU/Linux 11 (bullseye)”
NAME=”Debian GNU/Linux”
VERSION_ID=”11″
VERSION=”11 (bullseye)”
VERSION_CODENAME=bullseye
ID=debian
オフィシャルサイトを参考にリポジトリを追加してaptで入れましょう。
elasticsearchの設定は必要最低限を設定
$ sudo cat /etc/elasticsearch/elasticsearch.yml | grep -v '\s*#'
node.name: pochi-node
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
network.host: _local_,_site_
discovery.type: single-node
kibanaの設定も必要最低限
$ sudo cat /etc/kibana/kibana.yml | grep -v '^\s*$' | grep -v '\s*#'
server.port: 5601
server.host: "0.0.0.0"
server.name: "pochi"
elasticsearch.hosts: ["http://pochi.reptec2.local:9200"]
i18n.locale: "ja-JP"
これだけでとりあえずelasticsearchとkibanaはちゃんと動きました。
続いてlogstashです。こちらはちょっとファイル所有権問題なのか、「変だな~?」といことがいろいろあったのでメモもちょっと違う箇所があるかもですが、一応一通り設定を示します。
installはaptで同様に入れます。
$ sudo cat /etc/logstash/logstash.yml | grep -v '^\s*$' | grep -v '^\s*#'
node.name: pochi-node
path.data: /var/lib/logstash
path.logs: /var/log/logstash
ここではノード名変えたただけです。
この後、systemctlで起動する前に動作確認をした方が良いのかもしれません。
systemctlで起動すると/var/log内のlogstashディレクトリはroot所有になりますが、この状態で構築を進めていたらlogstashのログが出力されませんでした。なぞ。
対応としては下記。
$ sudo -u logstash /usr/share/logstash/bin/logstash -e 'input { stdin { } } output { stdout {} }' --path.settings "/etc/logstash"
Using bundled JDK: /usr/share/logstash/jdk
OpenJDK 64-Bit Server VM warning: Option UseConcMarkSweepGC was deprecated in version 9.0 and will likely be removed in a future release.
Sending Logstash logs to /var/log/logstash which is now configured via log4j2.properties
[2021-09-23T14:21:32,511][INFO ][logstash.runner ] Log4j configuration path used is: /etc/logstash/log4j2.properties
[2021-09-23T14:21:32,518][INFO ][logstash.runner ] Starting Logstash {"logstash.version"=>"7.15.0", "jruby.version"=>"jruby 9.2.19.0 (2.5.8) 2021-06-15 55810c552b OpenJDK 64-Bit Server VM 11.0.11+9 on 11.0.11+9 +indy +jit [linux-x86_64]"}
[2021-09-23T14:21:32,538][INFO ][logstash.setting.writabledirectory] Creating directory {:setting=>"path.queue", :path=>"/var/lib/logstash/queue"}
[2021-09-23T14:21:32,547][INFO ][logstash.setting.writabledirectory] Creating directory {:setting=>"path.dead_letter_queue", :path=>"/var/lib/logstash/dead_letter_queue"}
[2021-09-23T14:21:32,804][WARN ][logstash.config.source.multilocal] Ignoring the 'pipelines.yml' file because modules or command line options are specified
[2021-09-23T14:21:32,827][INFO ][logstash.agent ] No persistent UUID file found. Generating new UUID {:uuid=>"3202e273-ef32-4c9b-917f-a296fc333a3a", :path=>"/var/lib/logstash/uuid"}
[2021-09-23T14:21:33,785][INFO ][logstash.agent ] Successfully started Logstash API endpoint {:port=>9600}
[2021-09-23T14:21:34,057][INFO ][org.reflections.Reflections] Reflections took 56 ms to scan 1 urls, producing 120 keys and 417 values
[2021-09-23T14:21:34,997][INFO ][logstash.javapipeline ][main] Starting pipeline {:pipeline_id=>"main", "pipeline.workers"=>4, "pipeline.batch.size"=>125, "pipeline.batch.delay"=>50, "pipeline.max_inflight"=>500, "pipeline.sources"=>["config string"], :thread=>"#<Thread:0x77e1c67e run>"}
[2021-09-23T14:21:35,660][INFO ][logstash.javapipeline ][main] Pipeline Java execution initialization time {"seconds"=>0.66}
WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by com.jrubystdinchannel.StdinChannelLibrary$Reader (file:/usr/share/logstash/vendor/bundle/jruby/2.5.0/gems/jruby-stdin-channel-0.2.0-java/lib/jruby_stdin_channel/jruby_stdin_channel.jar) to field java.io.FilterInputStream.in
WARNING: Please consider reporting this to the maintainers of com.jrubystdinchannel.StdinChannelLibrary$Reader
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release
[2021-09-23T14:21:35,729][INFO ][logstash.javapipeline ][main] Pipeline started {"pipeline.id"=>"main"}
The stdin plugin is now waiting for input:
[2021-09-23T14:21:35,771][INFO ][logstash.agent ] Pipelines running {:count=>1, :running_pipelines=>[:main], :non_running_pipelines=>[]}
hello! <== 入力
{
"message" => "hello!",
"@version" => "1",
"@timestamp" => 2021-09-23T05:21:46.537Z,
"host" => "pochi"
}
Ctrl+D <== 入力
[2021-09-23T14:21:55,179][INFO ][logstash.javapipeline ][main] Pipeline terminated {"pipeline.id"=>"main"}
[2021-09-23T14:21:55,345][INFO ][logstash.pipelinesregistry] Removed pipeline from registry successfully {:pipeline_id=>:main}
[2021-09-23T14:21:55,377][INFO ][logstash.runner ] Logstash shut down.
この確認でちゃんと動いてくれたら、systemctlでサービスとして起動させます。
ここまででelasticsearch, kibana, logstashがそれなりに動いています。
winlogbeatからlogstashで受信してelasticsearchへ送る設定を下記のように書いてみてlogstashを再起動すればちゃんとkibanaで確認できます。
$ sudo cat /etc/logstash/conf.d/server-log.conf | grep -v '^\s*$' | grep -v '^\s*#'
input {
beats {
id => "server-log"
port => 15045
tags => "winlogbeat"
}
}
output {
elasticsearch {
hosts => ["http://localhost:9200"]
index => "%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}"
}
}
logstashを再起動すると、ちゃんと15045ポートがあいているのがわかります。
$ ss -a -t | grep LISTEN
LISTEN 0 4096 *:15045 *:*
ただ、このままだとkibanaを使っているときにWarning299というセキュリティが!!といった表示が大量に表示されて穏やかではいられません。
仕方が無いのでBasic認証だけ設定しました。
$ sudo vim /etc/elasticsearch/elasticsearch.yml
追加
# --security--
xpack.security.enabled: true
xpack.security.audit.enabled: true
再起動後に自動でパスワード設定をさせます。
$ sudo systemctl restart elasticsearch.service
$ sudo /usr/share/elasticsearch/bin/elasticsearch-setup-passwords auto
Initiating the setup of passwords for reserved users elastic,apm_system,kibana,kibana_system,logstash_system,beats_system,remote_monitoring_user.
The passwords will be randomly generated and printed to the console.
Please confirm that you would like to continue [y/N]y
Changed password for user apm_system
PASSWORD apm_system = apm_system-pass
Changed password for user kibana_system
PASSWORD kibana_system = kibana_system-pass
Changed password for user kibana
PASSWORD kibana = kibana-pass
Changed password for user logstash_system
PASSWORD logstash_system = logstash_system-pass
Changed password for user beats_system
PASSWORD beats_system = beats_system-pass
Changed password for user remote_monitoring_user
PASSWORD remote_monitoring_user = remote_monitoring_user-pass
Changed password for user elastic
PASSWORD elastic = elastic-pass
elasticsearchへのアクセスに認証が必要になったので、接続しに行くサービスにはこれらを設定して回ります。
まずkibana
$ sudo vim /etc/kibana/kibana.yml
elasticsearch.username: "kibana_system"
$ sudo /usr/share/kibana/bin/kibana-keystore create
Created Kibana keystore in /etc/kibana/kibana.keystore
$ sudo /usr/share/kibana/bin/kibana-keystore add elasticsearch.password
Enter value for elasticsearch.password: kibana_system-pass
logstashも
$ sudo vim /etc/logstash/logstash.yml
xpack.monitoring.enabled: enable
xpack.monitoring.elasticsearch.username: logstash_system
xpack.monitoring.elasticsearch.password: logstash_system-pass
※ここでは設定ファイルにpassを書いていますが、logstash-keystoreも存在するので、kibanaのように設定すべきなんだと思います。
先ほどのwinlogbeatから待ち受けるlogstashのコンフィグファイルも下記のように変更。
$ sudo vim /etc/logstash/conf.d/reptecserver.conf
output {
elasticsearch {
hosts => ["http://pochi.reptec2.local:9200"]
index => "%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}"
user => "elastic"
password => "elastic-pass"
}
}
※こちらもsuper userのelasticを使っていますが、ロールと呼ばれる権限設定で必要な権限だけを持たせたlogstashからの書き込みユーザーを作るべきなのだと思います。
大分長くなったので肝心のRTX1210関連設定は次回!
詐欺的で失礼。
elasticsearchは簡単なようで結構はまりやすい気がするので、書籍を参照するのが早いのかも。