nagiosログ監視の設定をしてみた

## はじめに
nagiosのログ監視の設定は、以下のQiitaの投稿がとても参考になりました。
有難うございました。今回、以下のサイトの手順通りにログ監視設定を試しました。
https://qiita.com/mitzi2funk/items/cedb106a8fba23796960

dockerの構築は、infracollegeでご教示いただきました。
https://infracollege.vamdemicsystem.black/membership-login/

## 前提条件
VirtualBoxでnagiosサーバとnagios ClientはCentOS7で構築してます。
nagiosはdockerで構築しました。


## nagiosサーバーの構築

#### ネットワーク関連のコマンドとコマンド補完等の便利なツールをインストールしました。
```
# yum -y install vim bash-completion net-tools bind-utils
```

#### yumのユーティリティパッケージがインストール
```
# yum -y install yum-utils
```

#### Dockerリポジトリを登録
```
# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
読み込んだプラグイン:fastestmirror
adding repo from: https://download.docker.com/linux/centos/docker-ce.repo
grabbing file https://download.docker.com/linux/centos/docker-ce.repo to /etc/yum.repos.d/docker-ce.repo

repo saved to /etc/yum.repos.d/docker-ce.repo
```
#### Dockerをインストールする
```
# yum install docker-ce
```

#### Dockerを自動起動設定する
```
# systemctl enable docker
```
#### dockerでnagiosのイメージから、nagiosコンテナを起動する
コンテナ名「nagios4」　ローカルIP 0.0.0.0 ローカルポート8888 コンテナのポート番号 80
イメージ名「jasonrivers/nagios:latest」
```
# docker run -d --name nagios4 -p 0.0.0.0:8888:80 jasonrivers/nagios:latest
```

## nagios clientの構築とログ監視設定

以下の記事で対応しました
https://qiita.com/mitzi2funk/items/cedb106a8fba23796960

拡張リポジトリのインストール
```
# yum -y install epel-release
```
#### nagiosプラグインとnrpeをインストール
```
# yum --enablerepo=epel -y install nagios-plugins-ntp
# yum --enablerepo=epel install nagios-plugins-nrpe nrpe
```

#### ログ監視のスクリプトをダウンロードする
「check_log3.pl」を以下のURLからダウンロードした。
https://exchange.nagios.org/directory/Plugins/Log-Files/check_log3-2Epl/details
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599002/9244ccde-35e7-4591-83c2-b8b0eb82d4a1.png)


ダウンロードした「check_log3.pl」をWinSCPで利用して、nagios clientにアップロードしました。

check_log3を別のフォルダへ移動させた
```
# mv /root/check_log3.pl /usr/lib64/nagios/plugins/check_log3
```
#### check_log3の権限を変更した
```
# chmod 755 /usr/lib64/nagios/plugins/check_log3
```
コマンドの動作確認でhelpページを表示したら、perlのエラーメッセージが出た
```
# /usr/lib64/nagios/plugins/check_log3 --help
-bash: /usr/lib64/nagios/plugins/check_log3: /usr/bin/perl: bad interpreter: No such file or directory
```
#### perlをインストールした
```
# yum install perl
```
#### コマンドの動作確認でhelpページを表示させました
```
# /usr/lib64/nagios/plugins/check_log3 --help
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
        LANGUAGE = (unset),
        LC_ALL = (unset),
        LANG = "C.UTF-8"
    are supported and installed on your system.
perl: warning: Falling back to the standard locale ("C").
Can't locate utils.pm in @INC (@INC contains: /usr/local/nagios/libexec /usr/local/libexec/nagios /usr/lib64/nagios/plugins /usr/lib/nagios/plugins /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at /usr/lib64/nagios/plugins/check_log3 line 496.
BEGIN failed--compilation aborted at /usr/lib64/nagios/plugins/check_log3 line 496.
[root@localhost plugins]#
```
#### nagiosのプラグインをインストール
```
# yum install nagios-plugins-all
```
#### コマンドの動作確認でhelpページを表示出来ました
```
# /usr/lib64/nagios/plugins/check_log3 --help
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
        LANGUAGE = (unset),
        LC_ALL = (unset),
        LANG = "C.UTF-8"
    are supported and installed on your system.
perl: warning: Falling back to the standard locale ("C").
This is check_log3 version 3.16.1

Usage: check_log3 [ -v | --version ]
Usage: check_log3 [ -h | --help ]
Usage: check_log3 --manual
Usage: check_log3 --list-encodings
Usage: check_log3 -l log_file|log_directory (-p pattern [-p pattern ...])|-P patternfile)
        [-i] [-n negpattern|-f negpatternfile ] [-s seek_file|seek_base_dir] [--show-filename]
        ([-m glob-pattern] [-t most_recent|first_match|last_match] [--timestamp=time-spec] [-S string])
        [-d] [-D] [-a] [-C {-|+}n] [-q] [--ultraq] [-Q] ([-e '{ eval block }'|-E script_file]|--secure)
        ([-N|--report-max=N]|[--report-only=N])|([-1|--stop-first-match]|[--report-first-match])
        [--ok]|([-w warn_count] [-c crit_count] [--negate])
        [--input-enc=encoding] [--output-enc=encoding] [--crlf]
        [--missing=STATE [--missing-msg=message]]
        [-R|--restartcommand] [-M|--returnmessage]

```
#### nrpe.cfgのバックアップを取得した
```
# cp -p /etc/nagios/nrpe.cfg /etc/nagios/nrpe.cfgbk
```
#### nrpe.cfgを設定変更しました
```
# vi /etc/nagios/nrpe.cfg

以下を設定
#dont_blame_nrpe=0　※コメントアウト
dont_blame_nrpe=1  ※nrpeが引数を受け付けるように1に設定した
#allowed_hosts=127.0.0.1,192.168.40.118,::1　※コメントアウト

check_log3コマンドを追加した
command[check_log3]=/usr/lib64/nagios/plugins/check_log3 -l $ARG1$ -s $ARG2$ -P $ARG3$ -f $ARG4$ -c $ARG5$ -i
command[check_log3w]=/usr/lib64/nagios/plugins/check_log3 -l $ARG1$ -s $ARG2$ -P $ARG3$ -f $ARG4$ -w $ARG5$ -i
```
以下のサイトも参考にしました。
https://think-t.hatenablog.com/entry/20111231/p1


#### 修正後の設定ファイルとデフォルトの設定ファイルの差分を取得した
```
※nrpe.cfgがあることを確認した
# ls -tlr /etc/nagios/nrpe*
-rw-r--r--. 1 root root 12835 Mar 12  2021 /etc/nagios/nrpe.cfgbk
-rw-r--r--. 1 root root 13077 Oct 23 23:23 /etc/nagios/nrpe.cfg

※差分を取得した
# cd /etc/nagios/
# diff nrpe.cfg nrpe.cfgbk
106c106
< #allowed_hosts=127.0.0.1,192.168.40.118,::1
---
> allowed_hosts=127.0.0.1,::1
122,123c122
< #dont_blame_nrpe=0
< dont_blame_nrpe=1
---
> dont_blame_nrpe=0
349,351d347
<
< command[check_log3]=/usr/lib64/nagios/plugins/check_log3 -l $ARG1$ -s $ARG2$ -P $ARG3$ -f $ARG4$ -c $ARG5$ -i
< command[check_log3w]=/usr/lib64/nagios/plugins/check_log3 -l $ARG1$ -s $ARG2$ -P $ARG3$ -f $ARG4$ -w $ARG5$ -i
[root@localhost nagios]#
```
#### nrpeサービスを起動する
```
# systemctl start nrpe
# systemctl status nrpe

#nrpeの自動起動設定
systemctl enable nrpe
```
#### ファイヤーウォールを起動し、自動起動する設定にした
```
# systemctl start firewalld
# systemctl enable firewalld
```
#### ファイヤーウォール　nagios通信用のポートを許可した
```
# firewall-cmd --add-port=5666/tcp --permanent
success
# firewall-cmd --reload
success

# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: enp0s3
  sources:
  services: dhcpv6-client ssh
  ports: 5666/tcp
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:
```
#### SElinuxを無効化した
```
# getenforce
Enforcing
# setenforce permissive
```
#### ログ監視対象のログファイルを中身が空ですが作成した
```
# touch /var/log/test.log
# ls -tlr  /var/log/test.log
-rw-r--r--. 1 root root 5 Oct 24 00:13 /var/log/test.log
```
#### seekファイルを作成した
※seekファイルは何行ログを走査したか分かるファイルです。
```
# mkdir /etc/nagios/seek
# echo 0 > /etc/nagios/seek/test.seek
読み取りと書き込みの権限を付けた
# chmod 666 /etc/nagios/seek/*.seek
```
#### crontabに設定した
```
# crontab -e
1 0 * * * /bin/echo "0" > /etc/nagios/seek/test.seek >/dev/null 2>&1
```
#### 検知するキーワードを設定した
```
# mkdir /etc/nagios/keyword
# echo 'WARN|CRIT|ERROR|FAIL|error' > /etc/nagios/keyword/test-keyword
```
#### 除外キーワードを設定した
```
# vi /etc/nagios/seek/test.exclude
log_default_
shadowWarning
/warning
```
権限を変更した
```
# chmod 644 /etc/nagios/seek/*.exclude
```
ログにerrorの文字列を設定にした
Seekファイルを0に設定した
```
# echo "error" >> /var/log/test.log
# echo 0 > /etc/nagios/seek/test.seek
```

## nagios経由でnagios clientにログ監視の動作を確認した
#### nagiosサーバー側でコマンドを実行した
コンテナ名を確認する
```
# docker ps
何も表示されない場合は、コンテナが停止しています。
```
コンテナを起動した
```
# docker start nagios4　※nagios4はコンテナ名です。
```
コンテナが起動されたことを確認する
```
# docker ps
CONTAINER ID   IMAGE                       COMMAND                  CREATED        STATUS          PORTS                            NAMES
fb470a7a23a7   jasonrivers/nagios:latest   "/usr/local/bin/star…"   26 hours ago   Up 11 seconds   5667/tcp, 0.0.0.0:8888->80/tcp   nagios4
```
コンテナ(nagios)の中に入る
```
# docker exec -it <コンテナ名> /bin/bash
プロンプトの表示がCONTAINER IDの表示になる。
# docker exec -it nagios4 /bin/bash
root@4088b7eebb06:/#
```
#### nagios client側のログファイルに「TEST」という文字列を設定する
```
※nagios client
# cat /var/log/test.log
TEST
```
#### nagiosサーバーでコマンド実行
nagiosサーバー経由で、nagiosクライアント「192.168.40.119」でcheck_log3を実行したところ、OKと出力された
```
#/opt/nagios/libexec/check_nrpe -H 192.168.40.119 -c check_log3 -a /var/log/test.log /etc/nagios/seek/test.seek /etc/nagios/keyword/test-keyword /etc/nagios/seek/test.exclude 1
OK: Found 0 lines (limit=1/1): No matches found.|lines=0
```

#### 再度コマンドを実行する場合は、nagios clientにあるseekファイルを0に設定する必要がある
※ログを一行づつ走査するため、最初の行からチェックするため、0にする必要があります。
```
# vi  /etc/nagios/seek/test.seek
0
```
#### nagios clientの以下のログファイルに「error」という文字列を入れる。
```
# cat /var/log/test.log
ERROR
```
#### nagiosサーバーでコマンド実行
※192.168.40.119のnagiosクライアントIPアドレスは例です。検証する環境によっては、IPアドレスは異なります。

nagiosサーバー経由で、nagiosクライアント「192.168.40.119」でcheck_log3を実行したところ、CRITICALと出力された
```
/opt/nagios/libexec/check_nrpe -H 192.168.40.119 -c check_log3 -a /var/log/test.log /etc/nagios/seek/test.seek /etc/nagios/keyword/test-keyword /etc/nagios/seek/test.exclude 1
CRITICAL: Found 1 lines (limit=1/1): mitzi error|lines=1
```
## check_log3 を実行するとエラーが出る場合の切り分けの仕方
以下はエラーの例です。※nagiosクライアント「192.168.40.119」
```
/usr/lib64/nagios/plugins/check_nrpe -H　192.168.40.119 -c check_log3 -a /var/log/test.log /etc/nagios/seek/test.seek /etc/nagios/keyword/test-keyword /etc/nagios/seek/test.exclude 1
NRPE: Unable to read output
```
nagios経由でnagiosクライアント「192.168.40.119」に対して、5666のポート接続できるかの確認をしました。
```
nc -vz 192.168.40.119 5666
Ncat: Version 7.50 ( https://nmap.org/ncat )
Ncat: Connected to...             [::]:*                  LISTEN
```

エラーの切り分けのため、nagiosサーバーでcheck_nrpeの動作してるか確認しました。
以下の様にバージョンが表示されたら、check_nrpeが動作しています。
```
# opt/nagios/libexec/check_nrpe -H 192.168.40.119　　※nagiosクライアント「192.168.40.119」
NRPE v4.0.3
```
次に、check_usersの動作するかどうか試してみました。
以下の場合は、OKと表示されているため、正常に動作しています。
```
# opt/nagios/libexec/check_nrpe -H 192.168.40.119  -c check_users
USERS OK - 2 users currently logged in |users=2;5;10;0
```
上記のcheck_usersコマンドが正常に動作したら、エラーの原因はcheck_nrpeにあるのではなく、
「check_log3」の設定にあると思います。

結局、原因が分からずに、nagiosサーバーを作り直して本投稿のdockerのnagiosサーバーを構築したら上手くいきました。


## まとめ
ログ監視は一行づつログを、検知するキーワードが含まれるかチェックしています。そのため、各行は一回チェックしたら、次の行に進むため、
ログ監視が、仮に一行目にerror文字を一文字検知した場合は、CRITICALのメッセージは一回だけ出力されて、次の行のチェックに進みます。

ログ監視は、seekファイルにチェックしている現在のログの行が出力されます。最初の行からログをチェックし直す場合は、seekファイルに0を入れました。

また、ログ監視を使用するため、検知したくないキーワードと検知したいキーワードを設定します。

今回、nagiosのログ監視の設定が上手くいかずに苦労しました。
この記事が参考になれば幸いです。