ElasticSearch + Logstash + FileBeat + KibanaでUnboundのクエリログを解析してみました。UnboundはキャッシュDNSサーバなので、DHCPで配布するDNSサーバをこれに向けることでログを収集します。
※細かなコマンドやファイアウォールの設定手順は他のサイトにも書いてあるので省略します。
環境
- キャッシュDNSサーバ
- Ubuntu 18.04.2 LTS
- unbound 1.6.7
- rsyslogd 8.32.0
- logrotate 3.11.0
- ElasticSearchサーバ
キャッシュDNSサーバのセットアップ
Unboundの設定
Unboundはパフォーマンスの観点からか、デフォルトではクエリログを出力しません。そのため、設定にuse-syslog: yes
を追加します。
unbound.confの例
server:
username: unbound
use-syslog: yes
# verbosity: 1 # uncomment and increase to get more logging.
log-queries: yes
interface: 0.0.0.0
interface: ::0
access-control: 192.168.254.0/24 allow
access-control: eeee:eeee:eeee:1::/64 allow
forward-zone:
name: "."
forward-addr: 8.8.8.8
forward-addr: 8.8.4.4
Rsyslogの設定
このままでは/var/log/syslog
がUnboundのクエリログで肥大化するためsyslogの設定を変更します。rsyslogでunboundの出力するログを別ファイルへ保存するよう設定します。
以下の設定ファイル(30-unbound.conf)を/etc/rsyslog.d
に設置します。
if $syslogfacility-text == 'daemon' and $programname contains 'unbound' then
-/var/log/unbound
& ~
Logrotateの設定
ログの出力先を分けることができるものの、ログのローテーションがされていません。そのため、ログファイルのサイズが巨大に成長してしまいます。そこで、ログのローテーションを設定します。
以下のファイル(unbound)を/etc/logorate.d
へ配置します。
/var/log/unbound
{
rotate 30
daily
copytruncate
nocompress
olddir unbound.old
su syslog adm
postrotate
/usr/lib/rsyslog/rsyslog-rotate
endscript
}
FileBeatの設定
ログ・ファイルを監視してLogstashへ送るためにFileBeatを導入します。インストールは公式のドキュメントを見ながら行います。
Repositories for APT and YUM | Filebeat Reference [6.6] | Elastic
以下はFilebeat設定ファイル(filebeat.yml)の例です。ElasticSearchのIPアドレスを 192.168.254.200 に設定しています。
#=========================== Filebeat inputs =============================
filebeat.inputs:
- type: log
enabled: true
paths:
- /var/log/unbound
- /var/log/unbound.old/*
exclude_lines: ['message repeated']
filebeat.config.modules:
path: ${path.config}/modules.d/*.yml
reload.enabled: false
#==================== Elasticsearch template setting ==========================
setup.template.settings:
index.number_of_shards: 3
#============================== Kibana =====================================
setup.kibana:
host: "192.168.254.200:5601"
#----------------------------- Logstash output --------------------------------
output.logstash:
# The Logstash hosts
hosts: ["localhost:5044"]
#================================ Processors =====================================
processors:
- add_host_metadata: ~
- add_cloud_metadata: ~
LogStashの設定
LogstashではFilebeatから受け取ったデータをパースしてElasticSearchへ送ります。以下のガイドを見ながらインストールを行います。
Installing Logstash | Logstash Reference [6.6] | Elastic
以下は/etc/logstash/conf.d
に配置したLogstashの設定ファイル(unbound.conf)の例です。inputとoutputをそれぞれ stdin, stdoutにするとデバッグ時に便利です。
input {
beats {
port => "5044"
type => "beats"
}
# stdin {}
}
filter {
grok {
patterns_dir => ["/etc/logstash/patterns.d"]
match => { "message" => "%{PATTERN}" }
}
}
output {
if "_grokparsefailure" not in [tags] {
elasticsearch {
hosts => ["192.168.254.200:9200"]
index => "unbound-%{+YYYY.MM.dd}"
}
# stdout {}
}
}
クエリログ用のパターンファイル(unbound)を作成して/etc/logstash/patterns.d
へ配置します。以下はその設定ファイルの例です。
PATTERN %{SYSLOGTIMESTAMP:timestamp} %{SYSLOGHOST:logsource} %{SYSLOGPROG:prog}: [%{INT:pid}:%{INT:tid}] %{LOGLEVEL:loglevel}: %{IP:ip_src} %{HOSTNAME:domain} %{WORD:record} %{GREEDYDATA}
ElasticSearchサーバのセットアップ
DockerでElasticSearchとKibanaを導入
ElasticSearchとKibanaはDockerを使って構築します。
Docker-CEをインストールします。aptでそのまま入れるとバージョンが古いので注意が必要です。docker-composeもインストールします。
以下のdocker-copose.yml(例)を作成しました。ulimitsでファイルディスクリプタの設定を変更しないと起動しないため注意が必要です。
version: '3'
services:
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:6.6.0
ports:
- 9200:9200
- 9300:9300
#volumes:
# - ./elasticsearch/data:/usr/share/elasticsearch/data
ulimits:
nproc: 65535
nofile:
soft: 65536
hard: 65536
kibana:
image: docker.elastic.co/kibana/kibana:6.6.0
ports:
- 5601:5601
links:
- elasticsearch
environment:
- ELASTICSEARCH_URL=http://elasticsearch:9200/
KibanaにWebからアクセス
ElasticSearchをインストールしたホストの5601/tcpへアクセスします。
DashBoardを作り込むとドメインのトップ100を表示することもできます。
これを見るとAWS S3が顕著なことがよくわかります。
今回はElasticSearchへログの投入を行いました。この他にログ解析に特化したGraylogもあるので、余裕があれば試してみたいと思います。
コメントを残す