Zabbix のインストール (CentOS Stream 9)

Zabbix のインストール前の準備

Web サーバはnginx、SQL サーバは MariaDB を使用するため、事前にインストールを実施する。
SNMP Trap は 【net-snmp-perl】を使って Zabbix と連携する。

dnf install −y net-snmp-utils net-snmp-perl net-snmp
dnf install langpacks-en langpacks-ja wget  (インストールされてない場合)
localectl set-locale en_US  (未設定の場合)


Firewalld であらかじめ Zabbix で使用する各種ポートを許可する。 snmp(161/udp), snmptrap(162/udp), zabbix-agent(10050/tcp), zabbix-trapper(10051/tcp) また、 HTTP/HTTPS も許可する。

firewall-cmd --permanent --zone=public --add-service=snmptrap --add-service=http --add-service=https
firewall-cmd --permanent --zone=public --add-port=10050/tcp --add-port=10051/tcp
firewall-cmd --reload

Zabbix のインストール

Zabbix 公式ホームページに表示されるインストール手順に従ってパッケージ (Zabbix server, frontend, agent) をインストールする。この時、レポジトリが Zabbix と EPEL で競合するため、EPEL 側に除外設定を行う。
また、SNMP Trap を Zabbix で読み込むためのスクリプトが Source ファイルにあるため、これも合わせてダウンロードする。

Download and install Zabbix

dnf config-manager --set-enabled crb
dnf install epel-release epel-next-release

vim /etc/yum.repos.d/epel.repo
================= epel.repo ================
[epel]
excludepkgs=zabbix*      (追記)
============================================
rpm -Uvh https://repo.zabbix.com/zabbix/6.4/rhel/9/x86_64/zabbix-release-6.4-1.el9.noarch.rpm

dnf clean all
wget https://cdn.zabbix.com/zabbix/sources/stable/6.4/zabbix-6.4.10.tar.gz

dnf install zabbix-server-mysql zabbix-web-mysql zabbix-nginx-conf zabbix-sql-scripts zabbix-selinux-policy zabbix-agent 

Zabbix 用 SQL データベースの作成

Zabbix 公式ホームページの手順に従って SQL のデータベースを作成する。
この時、SQL に新規で zabbix ユーザを作成する。
データベース内のテーブルは先ほど導入した Zabbix のスクリプトを使用して自動で作成する。

mysql -u root -p

mysql> create database zabbix character set utf8mb4 collate utf8mb4_bin;
mysql> create user zabbix@localhost identified by 'password';
mysql> grant all privileges on zabbix.* to zabbix@localhost;
mysql> set global log_bin_trust_function_creators = 1;
mysql> quit; 

zcat /usr/share/zabbix-sql-scripts/mysql/server.sql.gz | mysql --default-character-set=utf8mb4 -u zabbix -p zabbix

mysql -u root -p

mysql> set global log_bin_trust_function_creators = 0;
mysql> quit; 

Zabbix サーバ、フロントエンド (nginx) の設定

Zabbix サーバの設定ファイルを編集する。(先ほど作成した Zabbix ユーザのパスワード)
また、SNMP Trap の有効化、および読込みファイルを指定する。
【/etc/zabbix/zabbix_server.conf】

DBPassword=password

SNMPTrapperFile=/var/log/snmptrap/zabbix_traps.log
StartSNMPTrapper=1

必要に応じて HTTPS のために証明書の発行を行う。

# mkdir -p /etc/pki/nginx/private
# cd /etc/pki/nginx
# openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:4096 -out ./private/server.key
# chown nginx: ./private/server.key

# vi ./server_ext.txt
====================== server_ext.txt =====================
basicConstraints = CA:FALSE
keyUsage = critical, digitalSignature, keyEncipherment
extendedKeyUsage = critical, serverAuth
subjectAltName = DNS:zabbix.net.home, DNS:*.net.home, IP:192.168.1.10
# crlDistributionPoints = URI:http://www.net.home/revoke.crl
============================================================

# openssl req -new -key ./private/server.key -out server.csr -subj "/CN=zabbix.net.home"
# openssl x509 -in server.csr -out server.crt -req -days 730 -signkey ./private/server.key -extfile server_ext.txt

Zabbix フロントエンド (nginx) の設定ファイルを外部からアクセスする FQDN に編集する。また、必要に応じて HTTPS などの設定を行う。
【/etc/nginx/conf.d/zabbix.conf】

listen          443 ssl http2;

server_name zabbix.net.home;

ssl_certificate "/etc/pki/nginx/server.crt";
ssl_certificate_key "/etc/pki/nginx/private/server.key";
ssl_session_cache shared:SSL:1m;
ssl_session_timeout  10m;
ssl_ciphers PROFILE=SYSTEM;
ssl_prefer_server_ciphers on;

Zabbix と SNMP Trap の連携

先ほど取得した Zabbix のソースファイルから SNMP Trap 整形用スクリプトを抽出する。
スクリプトの配備先は好みの場所でOK。
ここで、スクリプト内の SNMP Trap 出力先を Zabbix Server で指定したファイル名に合わせる。
ついでにディレクトリも作成する。
※この時、SELinuxが有効な場合は Zabbix 側から 【$SNMPTrapperFIle】 が読み込めないため注意する。

ソースファイル【zabbix-6.4.10.tar.gz】
スクリプト【zabbix_trap_receiver.pl】
配備場所【/usr/local/bin】

tar -zxf zabbix-6.4.10.tar.gz
cp zabbix-6.4.10/misc/snmptrap/zabbix_trap_receiver.pl ~/
cp ~/zabbix_trap_receiver.pl /usr/local/bin/
chmod 755 /usr/local/bin/zabbix_trap_receiver.pl

vim /usr/local/bin/zabbix_trap_receiver.pl
$SNMPTrapperFile = '/var/log/snmptrap/zabbix_traps.log';

mkdir /var/log/snmptrap

SNMP Trapd の設定

SNMP Trapd で受信した際に Zabbix のスクリプトを実行するように設定を行う。
実行ファイルは先ほど配備したスクリプトの場所。
【/etc/snmp/snmptrapd.conf】
【lab-snmp】 は SNMP の好きなコミュニティ名を指定。

vim /etc/snmp/snmptrapd.conf
authCommunity  log,execute,net lab-snmp
perl do "/usr/local/bin/zabbix_trap_receiver.pl";

SNMP Trap ログの Logrotate 設定

SNMP Trapd で受信したログファイルはそのままでは肥大化し続けるため、適切にログローテーションするように設定する。
【/etc/logrotate.d/snmptrap】

vim /etc/logrotate.d/snmptrap
/var/log/snmptrap/snmptrap.log {
    daily
    rotate 7
    compress
    delaycompress
    missingok
    notifempty
}

Zabbix の起動

それぞれのサービスを起動する。
【http://localhost/】にアクセスすることで、Zabbix の初期セットアップウィザードが開始される。
完了後の Zabbix 初期ログインは【user:Admin, password:zabbix】
Zabbix の SNMP Community 設定は【Administration > General > Macros】から設定。

systemctl restart zabbix-server zabbix-agent nginx php-fpm snmptrapd
systemctl enable zabbix-server zabbix-agent nginx php-fpm snmptrapd

SNMP Trap は Linux Server から【snmptrap -v 2c -c lab-snmp localhost 0 linkUp.99】等を実行して【/var/log/snmptrap/snmptrap.log】にファイルが保存されることを確認する。

Zabbix からの SNMP Trap 確認は【Monitoring > Latest data】でNameにSNMP traps等でフィルタリングして確認。

snmptrap -v 2c -c lab-snmp localhost 0 linkUp.99
less /var/log/snmptrap/snmptrap.log

20:34:25 2022/10/16 ZBXTRAP 127.0.0.1
PDU INFO:
  community                      lab-snmp
  requestid                      1948544203
  transactionid                  518
  errorstatus                    0
  receivedfrom                   UDP: [127.0.0.1]:42638->[127.0.0.1]:162
  notificationtype               TRAP
  messageid                      0
  errorindex                     0
  version                        1
VARBINDS:
  DISMAN-EVENT-MIB::sysUpTimeInstance type=67 value=Timeticks: (0) 0:00:00.00
  SNMPv2-MIB::snmpTrapOID.0      type=6  value=OID: IF-MIB::linkUp.99

【参考URL】
Zabbix Manual > 7.Configuration > 2 Items > 3 Item types > 3 SNMP traps
SNMP Traps in Zabbix
snmptrapd 設定方法
ZabbixでSNMP trapを受信する [SNMPTT] の構成手順
SNMPトラップのハンドリング(CentOS 8編)
Extra Packages for Enterprise Linux (EPEL)