夜明け前の最も暗いとき

技術的なやったことをメモするブログ

Zabbixでログ監視環境を構築する

少し前に話題になった入門監視を読みました。

入門 監視 ―モダンなモニタリングのためのデザインパターン

入門 監視 ―モダンなモニタリングのためのデザインパターン

  • 作者:Mike Julian
  • 発売日: 2019/01/17
  • メディア: 単行本(ソフトカバー)

どういった監視項目があるのか、実用的な監視環境や方式についてノウハウを学べる良い書籍だと思います。 この本の中でsyslogについて触れられていました。

昔は、シンプルなsyslog受信サーバである中央ログサーバにすべてのログを送り、Unix系OSで標準的なツール(例えばgrepなど)でログを検索していました。これはログを検索しにくいという点で次善の策でした。この方法でログを保存すると、たいていの場合は誰もログを見ず、活用することもありません。(p. 127)

書かれている通りで、ログを収集してもいちいちログを確認したりはしないものです。とはいえ、再起動でログがリセットされるCisco系装置やサーバでログが失われるようなトラブルが発生したときにはログ収集サーバは有益です。

ここで重要なのは、2度と見られることはないので、ログをsyslogサーバに送ってはいけないということです。その代わり、ログを活用して価値を得られるしっかりしたログ管理システムに送りましょう。(p. 128)

ログ管理システムはクラウドやオンプレなど多岐に渡りますが、今回はZabbixで簡易的な管理・監視環境を構築してみます。

目次

syslogサーバの構築

Zabbixへは各サーバからログサーバへ収集後に送信します。そのため、まずはログサーバを構築します。以前の記事で作成した仮想環境に新しいVMとして作成します。

  • vCPU:1
  • メモリ:1GB
  • ディスク:30GB
  • OS:Debian 10
  • 割り当てIP:192.168.11.15/24

今回はDebian公式サイトからNetInstをダウンロードしてインストールしました。インストールが正常に終了しsshで対象VMにアクセスできればOKです。

まずは、zabbixエージェントをインストールします。

$ sudo apt-get install zabbix-agent

インストール後、zabbixエージェントの設定を編集します。

$ sudo vi /etc/zabbix/azabbix_agentd.conf

# Zabbixサーバのアドレス
Server=192.168.11.2
ServerActive=192.168.11.2

設定完了後、Zabbixエージェントを再起動して設定を反映します。

sudo systemctl restart zabbix-agent

続いて、ログサーバであるrsyslogの設定をします。rsyslogはデフォルトのログシステムとしてLinuxにインストールされています。UDPTCPでログを受け付けるようコメントアウトを外します。

$ sudo vi /etc/rsyslog.conf

# 外部からTCP/UDP接続によるログを受け付ける
# provides UDP syslog reception
module(load="imudp")
input(type="imudp" port="514")

# provides TCP syslog reception
module(load="imtcp")
input(type="imtcp" port="514")

# ログフォーマットを指定
#$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat
$ActionFileDefaultTemplate RSYSLOG_SyslogProtocol23Format

また、ログフォーマットを従来の形式からIETF のインターネットドラフト ietf-syslog-protocol-23に変更しています。これによる違いは下記のとおりです。

  • RSYSLOG_TraditionalFileFormat
May 16 18:01:40 vm-server chronyd[660]: System clock wrong by 1.305585 seconds, adjustment started
May 16 18:01:40 vm-server chronyd[660]: System clock was stepped by 1.305585 seconds
  • RSYSLOG_SyslogProtocol23Format
<28>1 2020-05-16T18:01:40+09:00 vm-server chronyd 660 - -  System clock wrong by 1.305585 seconds, adjustment started
<28>1 2020-05-16T18:01:40+09:00 vm-server chronyd 660 - -  System clock was stepped by 1.305585 seconds

RSYSLOG_SyslogProtocol23Formatではログエントリの頭にプライオリティレベルが出力されるなど従来のものよりも情報が多くなっています。従来のフォーマットかietf-syslog-protocol-23にするかはお好みで良いと思います。

次に、ログファイルの生成ルールを設定します。この新規ルールで抜き出したログファイルをZabbixで監視し、アラートとして通知します。どういったログを保守者に通知するのかは様々な考え方がありますが、今回は警告(warn)のみ抜き出すように設定を追加します。

$ sudo vi /etc/rsyslog.conf

# warn以上のログをalertファイルに書き出し
*.warn                          -/var/log/alert

以上で、syslogサーバの設定は完了です。rsyslogを再起動し設定を反映させます。

$ sudo systemctl restart rsyslog

rsyslogの次はlogrotateの設定をします。logrotateは一定期間経過したログを別ファイルへとリネームする機能(ローテーション)があります。rsyslogのログは/etc/logrotate.d以下にあらかじめ設定されています。今回は新たにalertファイルへログを書き出すようにしたので、ローテーションの設定を加えます。

$ sudo vi /etc/logrotate.d/rsyslog

# alertファイル用のローテーション設定
/var/log/alert
{
        rotate 90
        daily
        missingok
        dateext
        dateyesterday
        notifempty
        compress
        delaycompress
        sharedscripts
        postrotate
                /usr/lib/rsyslog/rsyslog-rotate
        endscript
}

送信元ホストが増えた場合に探しやすいよう毎日(daily)ローテーションするようにします。また、後から見返すことができるよう90日分保存します。

ログ送信設定

続いて各サーバにてsyslogサーバへログを投げるように設定します。

$ sudo vi /etc/rsyslog.conf

# syslogサーバにログを送信
*.*  action(type="omfwd" target="192.168.11.15" port="514" protocol="tcp")

設定が完了したらrsyslogを再起動し、ログが送信されているか確かめます。設定したサーバで以下のコマンドを打ちます。

$ logger -p warn test

syslogサーバでalertファイルの中身を確認し、記録されていれば設定は良好です。

<12>1 2020-05-17T22:02:02+09:00 vm-sesrver user - - -  test

また、ciscoルータについても下記のように設定をすることでログ送信が可能です。

logging facility local5
logging host 192.168.11.15
Zabbix設定

Zabbixサーバにて、構築したsyslogサーバが監視できるよう設定を追加します。上部メニューのConfigurationからHostsを選び、「Create host」ボタンでsyslogサーバを追加します。

f:id:jianlan:20200517221151j:plain

今回はTemplate OS Linuxを使ってサーバを監視します。正常に通信ができるとAvailabilityのZBXが緑色になります。

次にalertファイルを監視対象に加えます。ホスト詳細画面からItemsををクリックし「Create item」ボタンから新しく作成します。

f:id:jianlan:20200517221745j:plain

今回はログファイルの監視であり、すべての内容を取得するためkeyは「log[/var/log/alert,.*]」と指定します。

続いてアラーム通知を発生させるtriggerを設定します。Triggersををクリックし「Create trigger」ボタンから新しく作成します。

f:id:jianlan:20200517222019j:plain

発生条件式として「{log-server:log[/var/log/alert,.*].nodata(3h)}=0」を指定します。これは、先程登録したitemに3時間の間新しいログエントリがあるかどうか監視します。

以上で設定は完了です。正常に値が取得できているかMonitoringからLatest dataを選び確認します。Hostsに今回登録したlog-serverを指定し適用します。

f:id:jianlan:20200517222636j:plain

LogCheckのアイテムが追加されているはずです。右側のHistoryリンクからは今まで発生したログの詳細が確認できます。

これでログ監視の設定は完了です。いままでのログを集めて終わりからは脱却できるはずです。ログ監視はSaaS機械学習を組み合わせたソリューションなどありますので、時間があれば色々試してみたいところです。