目的
– Elasticsearch,Kibana,filebeat,Logstashを構築してaccesslogを解析、視覚化する
– ※ 3/22 kibanaにてログを検出しない事象切り分け中(手順:accesslogを収集テスト1(logstash設定))
環境
– Elasticsearch + Kibanaサーバ
– ホスト:192.168.y.y
– Ubuntu 20.04
– Elasticsearch 8.12.2
– Kibana 8.12.2
– accesslog収集対象クライアント(filebeat + logstash)
– ホスト:192.168.x.x
– filebeat 8.12.2
– logstash 1.8.12.2-1
– 収集対象ログ /var/log/test_accesslog.log
参考
– filebeat
– https://192.168.y.y:5601/app/home#/tutorial/logstashLogs
– logstash
– https://www.elastic.co/guide/en/logstash/7.17/logstash-settings-file.html
– https://blog.estampie.work/archives/2265
– https://wisdom-gate.jp/blog/2019/04/30/elastic-stack%E3%81%AE%E6%AD%A9%E3%81%8D%E3%81%8B%E3%81%9F5/
Elasticsearch導入
インストール
– GPG公開鍵ダウンロード
$ wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo gpg --dearmor -o /usr/share/keyrings/elasticsearch-keyring.gpg
– apt-transport-https install
$ sudo apt-get install apt-transport-https
– apt list更新
$ echo "deb [signed-by=/usr/share/keyrings/elasticsearch-keyring.gpg] https://artifacts.elastic.co/packages/8.x/apt stable main" | sudo tee /etc/apt/sources.list.d/elastic-8.x.list
– apt update
$ sudo apt update
– elasticsearch install
$ sudo apt install elasticsearch
--------------------------- Security autoconfiguration information ------------------------------
Authentication and authorization are enabled.
TLS for the transport and HTTP layers is enabled and configured.
The generated password for the elastic built-in superuser is : Fhde3Z0NxCbKY6OH_GQy
※パスワードはメモしておく。kibanaからelasticsearchにアクセスする際に必要
サービス起動
– 自動起動ON
$ systemctl enable elasticsearch.service
– サービス起動
$ systemctl start elasticsearch.service
Elasticsearch設定
– rootユーザで変更する
/etc/elasticsearch/elasticsearch.yml
– ホスト情報
node.name: elastic01.murci.local
network.host: 0.0.0.0
http.port: 9200
– SSL無効化(クライアントからの接続にはhttpを使用)
xpack.security.enabled: false
xpack.security.enrollment.enabled: false
xpack.security.http.ssl: enabled: false
xpack.security.transport.ssl: enabled: false
– 接続許可対象
http.host: 0.0.0.0
サービス再起動
# systemctl restart elasticsearch.service
Kibana導入
– クライアントからKibanaへhttpsでアクセスさせるため、事前に自己署名証明書を作成する
SSL自己署名証明書の作成
– rootユーザで実行する
– ドメイン定義
# vi /etc/ssl/openssl.cnf
-----追記
[ murci.local ]
subjectAltName = DNS:murci.local
– 作業ディレクトリ(/etc/ssl/private)に移動
# pwd
/etc/ssl/private
– 秘密鍵の生成
# openssl genrsa -aes128 2048 > server.key
– パスワードを消す
# openssl rsa -in server.key -out server.key
– CSRの生成
# openssl req -utf8 -new -key server.key -out server.key -out server.csr
– 自己署名証明書の生成
# openssl x509 -in server.csr -out server.crt -req -signkey server.key -extfile /etc/ssl/openssl.cnf -extensions murci.local -days 3650
Kibanaインストール
– apt install
$ sudo apt install kibana
– SSL証明書、秘密鍵をコピー
# cp /etc/ssl/private/{server.crt,server.key} /etc/kibana/
# chown kibana /etc/kibana/{server.crt,server.key}
# ll /etc/kibana
:
total 36
-rw-r--r-- 1 kibana kibana 1419 Mar 7 02:47 server.crt
-rw------- 1 kibana kibana 1675 Mar 7 02:47 server.key
Kibana設定
– rootユーザで変更する
/etc/kibana/kibana.yml
# =================== System: Kibana Server ===================
server.port: 5601
server.host: "0.0.0.0" ※すべてのホストからのアクセスを許可
# =================== System: Kibana Server (Optional) ===================
server.ssl.enabled: true
server.ssl.certificate: /etc/kibana/server.crt
server.ssl.key: /etc/kibana/server.key
# =================== System: Elasticsearch ===================
elasticsearch.hosts: ["http://localhost:9200"]
サービス起動
– 自動起動ON
$ systemctl enable kibana.service
– サービス起動
$ systemctl start kibana.service
ブラウザでKibanaへアクセス
– 下記URLへログインする
– https://192.168.y.y:5601
– Username : elastic
– Password : Elasticsearchのインストール時にメモしたパスワード
Filebeat導入
– accesslogを収集する対象のクライアントにて実行する
Filebeatインストール
– パッケージダウンロード、インストール
$ curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-8.12.2-darwin-x86_64.tar.gz
$ tar xzvf filebeat-8.12.2-darwin-x86_64.tar.gz
$ cd filebeat-8.12.2-darwin-x86_64/
$ dpkg -i filebeat-8.12.2-amd64.deb
Filebeat設定
– rootユーザで変更する
/etc/filebeat/filebeat.yml
– Outputは、直接Elasticsearchに送信するか、logstashでデータ加工を行うか選択できる
# ============================== Filebeat inputs ===============================
filebeat.inputs:
# filestream is an input for collecting log messages from files.
#- type: filestream
- type: log
# Unique ID among all inputs, an ID is required.
id: test_accesslog
# Change to true to enable this input configuration.
enabled: true
paths:
- /var/log/test_accesslog.log ※収集対象のログファイルを指定
# ---------------------------- Elasticsearch Output ----------------------------
output.elasticsearch:
# Array of hosts to connect to.
hosts: ["192.168.y.y:9200"]
# Authentication credentials - either API key or username/password.
#api_key: "id:api_key"
username: "elastic"
password: "xxxxxxxxxxxx" ※Elasticsearchのインストール時にメモしたパスワード
# ------------------------------ Logstash Output -------------------------------
#output.logstash:
# The Logstash hosts
hosts: ["localhost:5044"]
サービス起動
– 自動起動ON
$ systemctl enable filebeat.service
– サービス起動
$ systemctl start filebeat.service
Logstash導入
– accesslogを収集する対象のクライアントにて実行する
Logstashインストール
– apt-transport-https install
$ sudo apt-get install apt-transport-https
– apt list更新
$ echo "deb [signed-by=/usr/share/keyrings/elastic-keyring.gpg] https://artifacts.elastic.co/packages/8.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-8.x.list
– logstash install
$ sudo apt install logstash
Logstash設定
– rootユーザで変更する
/etc/logstash/logstash.yml
– 下記追記する
input {
file {
# path => "/usr/share/logstash/example-data/apache_log"
path => "/var/log/test_accesslog.log"
mode => "read"
file_completed_action => "log"
file_completed_log_path => "/var/log/test_accesslog.log"
}
}
filter {
grok { ※grokでログの各カラムのデータ型を定義する
match => { "message" => '%{IPORHOST:clientip} %{USER:ident} %{USER:auth} \[%{HTTPDATE:timestamp}\] "%{WORD:verb} %{DATA:request} HTTP/%{NUMBER:httpversion}" %{NUMBER:response:int} (?:-|%{NUMBER:bytes:int}) %{QS:referrer} %{QS:agent}' }
}
date {
match => [ "timestamp", "dd/MMM/yyyy:HH:mm:ss Z" ]
locale => "en"
}
}
output {
elasticsearch {
hosts => [ "192.168.y.y:9200" ]
index => "test_accesslog"
}
}
input {
file {
# path => "/usr/share/logstash/example-data/apache_log"
path => "/var/log/test_accesslog.log"
mode => "read"
file_completed_action => "log"
file_completed_log_path => "/var/log/test_accesslog.log"
}
}
filter {
grok { ※grokでログの各カラムのデータ型を定義する
match => { "message" => '%{IPORHOST:clientip} %{USER:ident} %{USER:auth} \[%{HTTPDATE:timestamp}\] "%{WORD:verb} %{DATA:request} HTTP/%{NUMBER:httpversion}" %{NUMBER:response:int} (?:-|%{NUMBER:bytes:int}) %{QS:referrer} %{QS:agent}' }
}
date {
match => [ "timestamp", "dd/MMM/yyyy:HH:mm:ss Z" ]
locale => "en"
}
}
output {
elasticsearch {
hosts => [ "192.168.y.y:9200" ]
index => "test_accesslog"
}
}
サービス起動
– 自動起動ON
$ systemctl enable logstash.service
– サービス起動
$ systemctl start logstash.service
accesslogを収集テスト1(logstash設定)
– accesslogを収集する設定を行う
ブラウザでKibanaへアクセス
– 下記URLへログインする
– https://192.168.y.y:5601
– Username : elastic
– Password : Elasticsearchのインストール時にメモしたパスワード
Index Management
– Indexを作成する
– 「≡」> 「Management」 > 「Data」 > 「Index Management」 > 「Create index」 >
– Name : test_accesslog
Data Views
– Data Viewsを作成する
– 「≡」>「Management」>「Kibana」>「DataViews」>「Create data view」>
– Name : test_accesslog
– Index Pattern : test_accesslog ※前述で作成したIndexを指定する
– Timestamp field : timestamp ※logstash.ymlで設定した「type:date」が反映されていれば、プルダウンから選択可能
Dashboard
– 前述の設定後に、実際にaccesslogが取り込まれているかを確認する
– 「≡」>「Analytics」>「Dashboard」>「Create Dashboard」>「Create visualization」>左上のプルダウンから「Find a data view」で「test_accesslog」を検索する
– 右上のプルダウンから日時指定をする(デフォルトで直近15分前までのログ)
– データがグラフで表示されることを確認
– ※ 3/22時点で未運用、kibanaにてログを検出しない事象切り分け中
accesslogを収集テスト2(手動コマンド)
– コマンドでIndexとMappingを作成する
– クライアントからデータを送信して、Elasticsearchが正常に受領できるか確認する
– Elasticsearchサーバ(localhost)にて下記コマンド実行する場合を想定
Index作成
– index作成
– 認証する場合は、”curl -u elastic ~”
$ curl -X PUT "http://127.0.0.1:9200/test_accesslog?pretty"
{
"acknowledged" : true,
"shards_acknowledged" : true,
"index" : "test_accesslog"
}
– index作成確認
$ curl http://127.0.0.1:9200/test_accesslog/_settings?pretty
{
"test_accesslog" : {
"settings" : {
"index" : {
"routing" : {
"allocation" : {
"include" : {
"_tier_preference" : "data_content"
}
}
},
"number_of_shards" : "1",
"provided_name" : "test_accesslog",
"creation_date" : "1711600014873",
"number_of_replicas" : "1",
"uuid" : "g1uXv1E4RMGCM4PPbwzlTQ",
"version" : {
"created" : "8500010"
}
}
}
}
}
– index削除
$ curl -X DELETE "http://127.0.0.1:9200/test_accesslog"
Index,mapping作成
– indexとmapping作成
– 下記の11フィールドを設定する
$ curl -X PUT "127.0.0.1:9200/test_accesslog" -H 'Content-Type: application/json' -d '{
"mappings": {
"properties": {
"clientip": { "type": "ip" },
"ident": { "type": "keyword" },
"auth": { "type": "keyword" },
"timestamp": { "type": "date", "format": "dd/MMM/yyyy:HH:mm:ss Z" },
"verb": { "type": "keyword" },
"request": { "type": "text" },
"httpversion": { "type": "float" },
"response": { "type": "integer" },
"bytes": { "type": "integer" },
"referrer": { "type": "text" },
"agent": { "type": "text" }
}
}
}'
– mapping作成確認
– fieldは自動でアルファベット順にソートされる
# curl "http://127.0.0.1:9200/test_accesslog/_mapping/?pretty"
Enter host password for user 'elastic':
{
"test_accesslog" : {
"mappings" : {
"properties" : {
"agent" : {
"type" : "text"
},
"auth" : {
"type" : "keyword"
},
"bytes" : {
"type" : "integer"
},
"clientip" : {
"type" : "ip"
},
"httpversion" : {
"type" : "float"
},
"ident" : {
"type" : "keyword"
},
"referrer" : {
"type" : "text"
},
"request" : {
"type" : "text"
},
"response" : {
"type" : "integer"
},
"timestamp" : {
"type" : "date",
"format" : "dd/MMM/yyyy:HH:mm:ss Z"
},
"verb" : {
"type" : "keyword"
}
}
}
}
}
root@host1
Data Views作成
– Data Viewsを作成する(GUI)
– 「≡」>「Management」>「Kibana」>「DataViews」>「Create data view」>
– Name : test_accesslog
– Index Pattern : test_accesslog ※前述で作成したIndexを指定する
– Timestamp field : timestamp ※mapping作成で設定した「type:date」が反映されていれば、プルダウンから選択可能
– 保存する
実データ送信
– 実データをコマンドで送信する
– ※ mappingに存在するfieldと一致しないと取り込まれない
$ curl -X POST "192.168.y.y:9200/test_accesslog/_doc" -H 'Content-Type: application/json' -d '
{
"clientip": "192.168.1.3",
"ident": "-",
"auth": "-",
"timestamp": "27/Mar/2024:00:59:33 +0000",
"verb": "GET",
"request": "/api/project/taten/detail/?cdnkn2=2023&cdnkn3=132159&sugyu=1",
"httpversion": "1.1",
"response": 200,
"bytes": 60,
"referrer": "http://192.168.10.8:9082/",
"agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36"
}'
正常性確認
Dashboard
– 前述の設定後に、実際にaccesslogが取り込まれているかを確認する
– 「≡」>「Analytics」>「Dashboard」>「Create Dashboard」>「Create visualization」>左上のプルダウンから「Find a data view」で「test_accesslog」を検索する
– 右上のプルダウンから日時指定をする(デフォルトで直近15分前までのログ)
– データがグラフで表示されることを確認
– ※ 3/28正常に取り込まれることを確認