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

CentOS 8がリリースされましたので、改めてZabbixのインストールをしてみます。

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

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

- Zabbix : Zabbix 4.0.12
- OS : CentOS 8 (バージョン 8.0.1905)
- PHP : PHP 7.2.11 (CentOS 8標準)
- DBMS : MySQL 8.0.13 (CentOS 8標準)

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

インストールするパッケージは、「サーバー」にしておきます。
各種パッケージのインストールを行うために、インターネットへの接続とdnfコマンドが利用できるような環境を用意します。

CentOS 8をインストールし終えたら、必ずdnf updateでOSを最新の状態にしてください。

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

SELinuxは、enforcingのままで構築します。
SELinuxを使用しない方は、disabledにしてください。

また、dateコマンドを使用するなどして、タイムゾーンが使用する環境に合っているかも確認してください。
私は、日本時間(JST)で使用したいので、タイムソーンをAsia/Tokyoに変更します。

```shell-session
# timedatectl
# timedatectl set-timezone Asia/Tokyo
```


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

```shell-session
# reboot
```

# ３．firewalldの設定
rebootしたら、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にしてしまっているので、セキュリティを重視する環境であれば、もっとアクセス可能なゾーンを特定するなど厳密に設定した方が良いでしょう。

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

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

```shell-session
# dnf install http://repo.zabbix.com/zabbix/4.0/rhel/8/x86_64/zabbix-release-4.0-2.el8.noarch.rpm
```

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

```shell-session
# dnf install zabbix-server-mysql zabbix-web-mysql zabbix-web-japanese zabbix-agent
```

ZabbixサーバーやZabbixプロキシに関しては、利用するDBMSに合わせてパッケージを選択してください。
zabbix-web-japaneseというパッケージは、Webインターフェースで日本語のフォントを利用できるようにするための設定用パッケージです。


# ５．MySQLサーバーのインストール
CentOS 8から、標準でMySQLのサーバのパッケージ(mysql-server)がまた含まれるようになったので、MariaDBではなく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
#
```

テーブルの作成と初期データの投入を行います。

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

上記のデータベース作成用のファイルは、ソースからも取得できます。
ソースのtarball(zabbix-4.0.12.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
```

# ８．Zabbixの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 php-fpm httpd
# systemctl enable zabbix-agent zabbix-server php-fpm httpd
```

# １０．Webインターフェースにアクセス
ブラウザを利用して、
http://ZabbixサーバーのIPアドレス/zabbix/
にアクセスします。

最初のアクセス時は、Zabbix設定のウィザードが実行されるので、DBへのアクセス情報などを入力して次へ次へと進めてください。
「Configure DB connection」では、データベース作成時に指定したUserとPasswordを必ず入力してください。

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

# １１．Zabbix serverの監視を有効に設定
ログイン後、まずは日本語画面に切り替えます。

右上の人型のアイコンをクリックしてUser Profileを開き、LanguageとしてJapaneseを選択してSaveボタンを押してください。

# １２．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に以下のような記録があるはずです。

```
type=AVC msg=audit(1569556777.692:553): avc:  denied  { dac_override } for  pid=11496 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(1569556777.692:553): arch=c000003e syscall=21 success=no exit=-13 a0=55dc30c1e3e0 a1=6 a2=7ffea8d9d570 a3=55dc30c02010 items=0 ppid=1 pid=11496 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


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

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

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

1回ではZabbixサーバーの起動に必要な権限が十分ではない場合があるので、再度必要なポリシーの確認と追加、Zabbixサーバーの再起動を繰り返します。
最終的に必要な権限は以下のようになっているのではないでしょうか？

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


#============= zabbix_t ==============
allow zabbix_t self:capability dac_override;
allow zabbix_t self:unix_stream_socket connectto;
allow zabbix_t zabbix_var_run_t:sock_file { create unlink };
#
```


OSのバージョンやリビジョンによってデフォルトのポリシーが変更される場合があるので、異なる場合があるかもしれません。
これらの対応を行うことで、ダッシュボードの「Zabbixサーバーの起動」の状態が「はい」になるはずです。


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

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

「監視データ」->「最新データ」と辿り、ホストグループに「Zabbix servers」を選択してフィルタの「適用」ボタンをクリックすると、Zabbixエージェントから取得した各値が見えると思いますので、どのような値が取得できているか確認してみてください。