ELKスタックでDNSサーバ(Unbound)のクエリログを解析する

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へアクセスします。

Discoverの様子

DashBoardを作り込むとドメインのトップ100を表示することもできます。

Dashboardの様子

これを見るとAWS S3が顕著なことがよくわかります。

今回はElasticSearchへログの投入を行いました。この他にログ解析に特化したGraylogもあるので、余裕があれば試してみたいと思います。

Industry Leading Log Management | Graylog

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です