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もあるので、余裕があれば試してみたいと思います。
コメントを残す