Zabbix 5.4をCentOS 8にインストール(MySQL編)

Zabbix 5.4がリリースされたので手順を公開します。基本的な手順はZabbix 5.0と同様ですが、一部異なる部分があるのでご注意ください。

# システム構成

CentOS 8上に標準のパッケージで用意されているMySQLサーバーを使用してZabbixサーバーを構築します。Zabbixエージェントもインストールすることで、そのZabbixサーバーの状態も監視できるような環境を構築します。

利用する主なソフトウェアとそのバージョンは以下の通りです。

- Zabbix : Zabbix 5.4.0
- OS : CentOS 8 (バージョン 8.3.2011)
- Webサーバー : Apache HTTP Server 2.4.37(httpd, CentOS 8標準)
- PHP : PHP 7.2.24 (CentOS 8標準)
- DBMS : MySQL 8.0.21 (CentOS 8標準)

# １．OSのインストール
最初にCentOS 8をインストールします。

OSをインストールする際、「ソフトウェアの選択」は、「サーバー」にしておきます。
各種パッケージのインストールを行うために、インターネットへの接続とdnfコマンドが利用できるような環境を用意します。
CentOS 8をインストールし終えたら、必ずdnf updateでOSを最新の状態にしてください。

```shell-session
# dnf update
```

SELinuxは有効な状態でインストールします。SELinuxの設定は後でまとめて行います。


# ２．OS再起動

dnfで更新したパッケージやカーネルなどを反映させるためにOSを再起動しておきます。

```shell-session
# reboot
```


# ３．Zabbix LLCのリポジトリ登録
Zabbix LLCが、RHEL 8用のyumのリポジトリを公開しているので、それを登録します。

5.4系用のリポジトリ登録は以下のように行います。

```shell-session
# dnf install https://repo.zabbix.com/zabbix/5.4/rhel/8/x86_64/zabbix-release-5.4-1.el8.noarch.rpm
```

新しいバージョンがリリースされている場合もありますので、公式のダウンロードサイトやリポジトリのディレクトリ内を確認し、より新しいバージョンのパッケージを使用してください。


# ４．Zabbix関連のパッケージインストール
Zabbixサーバーの本体と自分自身を監視するためのZabbixエージェントをインストールします。(ZabbixサーバーのWebインターフェース用のパッケージは別途インストールします。)
ここでインストールするのは、MySQLまたはMariaDB用です。

```shell-session
# dnf install zabbix-server-mysql zabbix-web-service zabbix-sql-scripts zabbix-agent
```

ZabbixサーバーやZabbixプロキシに関しては、利用するDBMSに合わせてパッケージを選択してください。
zabbix-web-serviceというのは、5.4で追加された定期レポート生成で使用します。zabbix-sql-scriptsというのは、5.4からデータベース作成用のSQL文が別パッケージとなったものです。
また、Zabbixエージェント2を使用したい場合は、zabbix-agentパッケージの代わりにzabbix-agent2パッケージをインストールしてください。

定期レポート生成を行う場合には、Google Chromwのインストールも忘れずに行ってください。
Linux用のパッケージは、以下のURLからダウンロードできます。

https://www.google.com/chrome/?platform=linux

ダウンロードしたパッケージをインストールします。

```shell-session
# dnf install ./google-chrome-stable_current_x86_64.rpm
```


# ５．MySQLサーバーのインストール
MySQLサーバーをインストールします。

```shell-session
# dnf install mysql-server
```

インストールしたら、rootのパスワード設定や不要な設定削除のため、セキュリティの初期設定を行いましょう。
設定には、mysql_secure_installationを使用します。

```shell-session
# systemctl start mysqld
# mysql_secure_installation

Securing the MySQL server deployment.

Connecting to MySQL using a blank password.

VALIDATE PASSWORD COMPONENT can be used to test passwords
and improve security. It checks the strength of password
and allows the users to set only those passwords which are
secure enough. Would you like to setup VALIDATE PASSWORD component?

Press y|Y for Yes, any other key for No: n
Please set the password for root here.

New password:

Re-enter new password:
By default, a MySQL installation has an anonymous user,
allowing anyone to log into MySQL without having to have
a user account created for them. This is intended only for
testing, and to make the installation go a bit smoother.
You should remove them before moving into a production
environment.

Remove anonymous users? (Press y|Y for Yes, any other key for No) : y
Success.


Normally, root should only be allowed to connect from
'localhost'. This ensures that someone cannot guess at
the root password from the network.

Disallow root login remotely? (Press y|Y for Yes, any other key for No) : y
Success.

By default, MySQL comes with a database named 'test' that
anyone can access. This is also intended only for testing,
and should be removed before moving into a production
environment.


Remove test database and access to it? (Press y|Y for Yes, any other key for No) : y
 - Dropping test database...
Success.

 - Removing privileges on test database...
Success.

Reloading the privilege tables will ensure that all changes
made so far will take effect immediately.

Reload privilege tables now? (Press y|Y for Yes, any other key for No) : y
Success.

All done!
#
```

MySQL用の設定を行っておきます。

```shell-session
# vi /etc/my.cnf.d/mysql-server.cnf
```

変更内容は以下の通りです。

```
[mysqld]
character-set-server = utf8
collation-server     = utf8_bin
skip-character-set-client-handshake
innodb_file_per_table
```

メモリに余裕がある場合は、メモリの割り当てなどの設定も行うようにしてください。
設定を追加したら、データベースの起動と自動起動の設定を行います。

```shell-session
# systemctl restart mysqld
# systemctl enable mysqld
```


# ６．初期データベースの作成
DBMS上にデータベースとそれにアクセスするためのユーザを作成します。
以下のzabbixユーザーのパスワードはサンプルですので、適宜きちんと変更して設定してください。

```shell-session
# mysql -uroot -p
mysql> create database zabbix character set utf8 collate utf8_bin;
mysql> create user 'zabbix'@'localhost' identified with mysql_native_password by 'password';
mysql> grant all privileges on zabbix.* to 'zabbix'@'localhost';
mysql> exit
#
```

上記の例では、MySQL上のzabbixユーザーのパスワードを「password」としていますが、パスワードは、それぞれの環境に合わせて適宜設定してください。
続いて、テーブルの作成と初期データの投入を行います。

```shell-session
# zcat /usr/share/doc/zabbix-sql-scripts/mysql/create.sql.gz | mysql -uzabbix zabbix -p
```

上記のデータベース作成用のファイルは、ソースからも取得できます。
ソースのtarball(zabbix-5.4.0.tar.gz)の方には、schema.sql、images.sql、data.sqlがありますので、それぞれのファイルを確認されたい場合は、tarballを展開してご確認ください。
tarballのダウンロードは[ここ](http://www.zabbix.com/download.php)からできます。

データベース作成用のファイルのパス名は、バージョンごとにバージョン番号をパスに含むなど異なる場合がありますので、インストールしたバージョンに合わせてパスを確認して変更してください。

# ７．Zabbixの設定ファイルの更新
ここまでの設定のままであれば、最低限の設定としては、DBPasswordを設定するだけです。
DB作成時のパスワードをDBPasswordに設定してください。

```shell-session
# vi /etc/zabbix/zabbix_server.conf
```

設定内容は以下の通りです。

```shell-session
DBPassword=password
StartReportWriters=3
WebServiceURL=http://127.0.0.1:10053/report
```

StartReportWritersとWebServiceURLの設定は、定期レポート生成用の設定です。
StartReportWritersは、レポート処理用のプロセスをいくつ起動しておくかを指定します。WebServiceURLは、zabbix-web-serviceという新しいサービス呼び出し用のURLを指定します。デフォルトでは、「http://localhost:10053/report 」のようなのですが、CentOS 8のデフォルトの設定のままや環境によっては名前解決で問題が発生する場合があるようなので、127.0.0.1を指定しています。


# ８．ZabbixのWebインターフェースのインストール

WebサーバーとしてApache HTTP Server(httpd)を使用する場合は、Webインターフェースを以下のコマンドラインを実行してインストールします。

```shell-session
# dnf install zabbix-web-mysql zabbix-apache-conf zabbix-web-japanese
```

ZabbixのWebインターフェースも、利用するDBMSに合わせてパッケージを選択してください。
zabbix-apache-confというパッケージは、WebサーバーとしてApache HTTP Server(httpd)を使用する際にインストールするパッケージです。(Webサーバーとしてnginxを使用する場合は、zabbix-apache-confの代わりにzabbix-nginx-confというパッケージをインストールします。※別途説明予定)
zabbix-web-japaneseというパッケージは、Webインターフェースで日本語のフォントを利用できるようにするための設定用パッケージです。

Zabbixのパッケージのデフォルトでは、PHPのtimezoneの設定がコメントアウトされているので、設定を有効にしてタイムゾーンが日本ならば、Asia/Tokyoに設定します。

```shell-session
# vi /etc/php-fpm.d/zabbix.conf
```

設定箇所は以下の部分です。

```shell-session
php_value[date.timezone] = Asia/Tokyo
```


# ９．各種デーモン起動
以下のコマンドで、各サービスを起動して自動起動も設定します。

```shell-session
# systemctl start zabbix-agent zabbix-server zabbix-web-service php-fpm httpd
# systemctl enable zabbix-agent zabbix-server zabbix-web-service php-fpm httpd
```

zabbix-agentパッケージの代わりに、zabbix-agent2パッケージをインストールしていた場合は、起動するサービス名もzabbix-agent2と入れ替えるようにしてください。


# １０．firewalldの設定
デフォルトの設定では、Zabbixで使用するポート番号での接続が許可されていませんので、firewalldの設定を行います。
Zabbixサーバーが外部から接続を受けるのは、Zabbixエージェントからのアクセスと、Webインターフェースへのアクセスです。
SNMPトラップや他のアクセスを許可する場合は、それらも許可するようにしてください。

つまり、Zabbixサーバーには、以下のような設定を行います。

```shell-session
# firewall-cmd --add-port=10051/tcp --zone=public --permanent
# firewall-cmd --add-service=http --zone=public --permanent
# firewall-cmd --reload
```

そして、Zabbixエージェントをインストールしたサーバーがfirewalldを利用しているなら、以下のような設定を行います。

```shell-session
# firewall-cmd --add-port=10050/tcp --zone=public --permanent
# firewall-cmd --reload
```

Zabbixエージェントへのアクセスが、ローカルのループバックを利用するのであれば、10050をあける必要はありません。つまり、Zabbixエージェントが外部のIPアドレスからアクセスされる場合には、10050をあけます。
Zabbixサーバーが、各監視対象にインストールしたZabbixエージェントからのアクセスを外部から受ける時には、10051をあけます。

上記のコマンド実行例では、publicからならアクセスOKにしてしまっているので、セキュリティを重視する環境であれば、もっとアクセス可能なゾーンを特定するなど厳密に設定した方が良いでしょう。


# １１．Webインターフェースにアクセス

ブラウザを利用して、
http://ZabbixサーバーのIPアドレス/zabbix/
にアクセスします。

インストール直後ですと、英語の表示でセットアップウィザードを開始することになります。
最初の画面の「Default language」で日本語を選択すれば、日本語のウィザードでセットアップを行うことができます。

セットアップウィザード内で設定が必要なのは、「データベース接続設定」もしくは「Configure DB connection」です。この記事ではローカルにインストールしたデータベースを使用するので、データベース作成時に指定したユーザーとパスワードを必ず入力してください。

それ以外は、「次のステップ」もしくは「Next step」をクリックして次々の画面に進めてセットアップを終了させて構いません。

設定が終わるとログイン画面になります。アカウント「Admin」、パスワード「zabbix」でログインしてください。


# １２．SELinuxの制限解除

ここまでの手順をそのまま行うと、Webインターフェースにログイン後に表示されるダッシュボードで、「Zabbixサーバーの起動」の状態が「いいえ」になっていると思います。
これは、SELinuxによって、httpdプロセスからzabbix_serverプロセスへの接続が拒否されているからです。
/var/log/audit/audit.log にもエラーが記録されているはずです。

そこで、httpdからzabbix_serverにアクセスできるよう、SELinuxの設定を変更します。
CentOS 8であれば、こんな時のための設定が用意されています。

まず、zabbix用にどんな設定があるか確認してみましょう。
確認には、getseboolコマンドを利用します。zabbix関連に限定したいので、ついでにgrepしてしまいましょう。

```shell-session
# getsebool -a|grep zabbix
httpd_can_connect_zabbix --> off
zabbix_can_network --> off
zabbix_run_sudo --> off
#
```

1つめの「httpd_can_connect_zabbix」は、さきほどのhttpdからzabbix_serverにアクセスを許可するかどうかですので、これをonにします。
ついでに、zabbix_serverプロセスから他のネットワークにアクセスできるよう2番目の設定もonにします。

```shell-session
# setsebool -P httpd_can_connect_zabbix on
# setsebool -P zabbix_can_network on
```

Zabbix経由でsudoを使用したコマンドの実行を行うのであれば、zabbix_run_sudoもonにしておいてください。

さらに、SELinuxを有効にしている場合は、先ほどの起動コマンドでZabbixサーバー(zabbix-server)の起動に失敗しているはずです。
例えば、/var/log/audit/audit.logに以下のような記録があるはずです。

```shell-session
type=AVC msg=audit(1621816546.141:360): avc:  denied  { dac_override } for  pid=2633 comm="zabbix_server" capability=1  scontext=system_u:system_r:zabbix_t:s0 tcontext=system_u:system_r:zabbix_t:s0 tclass=capability permissive=0
type=SYSCALL msg=audit(1621816546.141:360): arch=c000003e syscall=21 success=no exit=-13 a0=562bced21e40 a1=6 a2=7ffde164c250 a3=0 items=0 ppid=1 pid=2633 auid=4294967295 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=(none) ses=4294967295 comm="zabbix_server" exe="/usr/sbin/zabbix_server_mysql" subj=system_u:system_r:zabbix_t:s0 key=(null)ARCH=x86_64 SYSCALL=access AUID="unset" UID="root" GID="root" EUID="root" SUID="root" FSUID="root" EGID="root" SGID="root" FSGID="root"
```

これを解決するために、SELinuxのポリシーの設定を追加します。
ポリシー設定用のコマンドがインストールされていない場合は、以下のコマンドを実行してaudit2allowコマンドやsemoduleコマンドが使用できるようにしてください。

```shell-session
# dnf install policycoreutils-python-utils
```

必要な権限を確認してみると、以下のような結果が得られるはずです。

```shell-session
# grep zabbix_server /var/log/audit/audit.log | audit2allow


#============= zabbix_t ==============
allow zabbix_t self:capability dac_override;
#
```

このポリシーを許可するためには、以下のようにコマンドを実行します。

```shell-session
# grep zabbix_server /var/log/audit/audit.log | audit2allow -M zabbix-policy
******************** 重要 ***********************
このポリシーパッケージを有効にするには、以下を実行して下さい:

semodule -i zabbix-policy.pp

#
```

表示されるメッセージの通り、ポリシーを読み込みます。

```shell-session
# semodule -i zabbix-policy.pp
```

そして、Zabbixサーバーを再起動します。

```shell-session
# systemctl restart zabbix-server
```

1回ではZabbixサーバーの起動に必要な権限が十分ではない場合があるので、再度必要なポリシーの確認と追加、Zabbixサーバーの再起動を繰り返します。
MySQL用のZabbixのデフォルトの設定の場合、以下のルールの追加が必要でした。

```shell-session
#============= zabbix_t ==============

allow zabbix_t self:capability dac_override;
allow zabbix_t self:unix_stream_socket connectto;
```

監視設定の内容によっては、さらにポリシー変更が必要となる場合があります。監視内容に合わせてポリシーを設定するようにしてください。



# １３．定期レポート生成用の設定追加

定期レポート生成の為には、もう1つ設定を行っておく必要があります。

「管理」->「一般設定」->「その他」にある「WebインターフェースURL」に、Webインターフェースにアクセスする際のURLを指定してください。
例：「http://192.168.1.1/zabbix 」

定期レポートの配信先のユーザーやグループに、Emailなどの送信用のメディアの設定しておくこともお忘れなく。


# １４．Zabbixサーバー自体の監視開始

ZabbixエージェントとZabbixサーバーのインストールと起動が成功すれば、自動的に「Zabbix server」というホストの名前でZabbixサーバー自体の監視が開始されます。

「監視データ」->「最新データ」と辿るとZabbixエージェントから取得した各値が見えると思いますので、どのような値が取得できているか確認してみてください。全くアイテムが表示されない場合は、ホストグループやホストを指定して「適用」ボタンをクリックしてみてください。


# 最後に

今後も同様に、メジャーバージョンごとにリポジトリが用意されると思うので、使用したいZabbixのバージョンに合わせてリポジトリを登録すれば、それぞれのバージョンのパッケージを簡単にインストールできます。

パッケージの構成が変更される場合もあるのですが、大きく変化する場合は、また手順をご紹介します。