Zabbix 5.0をCentOS 7にインストール(SCL編)

ついに、待望のZabbix 5.0がリリースされたようですので手順を公開します。
先に[CentOS 8での手順](https://qiita.com/atanaka7/items/282a3499e135e00edcdc)を紹介しましたので、今度は、CentOS 7に極力標準のパッケージを使用して環境を構築します。

注意点としては、Zabbix 5.0からは、PHP 7.2以降であることが必要になったので、標準のPHP 5.4の環境ではZabbix 5.0は稼働させることができません。

対策方法の1つとして、Zabbix公式のパッケージは、SCLを使用して環境を構築できるようなパッケージの依存関係が設定されています。
少し特殊な環境になるので、RHEL 8(CentOS 8)やUbuntuなどのより新しいプラットフォームへの移行もご検討ください。

# システム構成

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

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

- Zabbix : Zabbix 5.0.0
- OS : CentOS 7 (バージョン 7.8.2003)
- Webサーバー : Apache HTTP Server 2.4.6 (httpd, CentOS 7標準)
- PHP : PHP 7.2.24 (SCL)
- DBMS : MariaDB 5.5.65 (CentOS 7標準)

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

インストールするパッケージは、デフォルトの「最小限のインストール」で構いません。
各種パッケージのインストールを行うために、インターネットへの接続とyumコマンドが利用できるような環境を用意します。

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

```shell-session
# yum update
```

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


# ２．OS再起動

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

```shell-session
# reboot
```

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

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

```shell-session
# yum install https://repo.zabbix.com/zabbix/5.0/rhel/7/x86_64/zabbix-release-5.0-1.el7.noarch.rpm
```

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


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

```shell-session
# yum install zabbix-server-mysql zabbix-agent
```

ZabbixサーバーやZabbixプロキシに関しては、利用するDBMSに合わせてパッケージを選択してください。

# ４．MariaDBサーバーのインストール
CentOS 7から、標準のパッケージとしてはMySQLのパッケージが削除されてしまっているので、MariaDBのサーバーのパッケージ(mariadb-server)を使用することとします。


```shell-session
# yum install mariadb-server
```

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

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

NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!

In order to log into MariaDB to secure it, we'll need the current
password for the root user.  If you've just installed MariaDB, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.

Enter current password for root (enter for none):
OK, successfully used password, moving on...

Setting the root password ensures that nobody can log into the MariaDB
root user without the proper authorisation.

Set root password? [Y/n] y
New password:
Re-enter new password:
Password updated successfully!
Reloading privilege tables..
 ... Success!


By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB 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? [Y/n] 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? [Y/n] y
 ... Success!

By default, MariaDB 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? [Y/n] 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? [Y/n] y
 ... Success!

Cleaning up...

All done!  If you've completed all of the above steps, your MariaDB
installation should now be secure.

Thanks for using MariaDB!
#
```

MariaDBのデフォルト設定を行っておきます。

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

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

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

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

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

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

```shell-session
# mysql -uroot -p
MariaDB [(none)]> create database zabbix character set utf8 collate utf8_bin;
MariaDB [(none)]> grant all privileges on zabbix.* to zabbix@localhost identified by 'password';
MariaDB [(none)]> exit
#
```

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

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

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


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

ここが、CentOS 7を使用する際の注意点です。
デフォルトでは、CentOS 7上には設定を追加し、必要となるリポジトリ情報を別途追加しないとWebインターフェースをインストールできません。
これは、Zabbix 5.0.0からPHP 7.2以降が必要になったためです。

この資料では、SCLを使用してPHP 7.2の環境を用意して、Webサーバーとしては標準のApache HTTP Server(httpd)を使用することとします。

まず、Webインターフェースのパッケージを使用できるように設定を変更します。
具体的には、/etc/yum.repos.d/zabbix.repo内の「zabbix-frontend」を有効にします。

```shell-session
# vi /etc/yum.repos.d/zabbix.repo
```

具体的な変更点は以下のブロックです。

```shell-session
[zabbix-frontend]
name=Zabbix Official Repository frontend - $basearch
baseurl=http://repo.zabbix.com/zabbix/5.0/rhel/7/$basearch/frontend
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-ZABBIX-A14FE591
```

enabledの値を「0(= diabled)」から「1(= enabled)」に変更するわけです。
そして、SCLを使用するためにパッケージをインストールします。

```shell-session
# yum install centos-release-scl
```

CentOS 7以外のRHEL 7やRHEL 7互換のOSの場合のSCLの使用に関しては、以下のドキュメントの情報を参考にしてください。

- [RHEL/CentOS 7 frontend installation](https://www.zabbix.com/documentation/current/manual/installation/install_from_packages/frontend_on_rhel7)

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

```shell-session
# yum install zabbix-web zabbix-web-deps-scl zabbix-web-mysql-scl zabbix-apache-conf-scl zabbix-web-japanese
```

ZabbixのWebインターフェースも、利用するDBMSに合わせてパッケージを選択してください。
*-sclというパッケージは、SCLのPHP 7.2と組み合わせて使用する際にインストールするパッケージです。
zabbix-web-japaneseというパッケージは、Webインターフェースで日本語のフォントを利用できるようにするための設定用パッケージです。

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

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

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

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

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

```shell-session
# systemctl start zabbix-agent zabbix-server rh-php72-php-fpm httpd
# systemctl enable zabbix-agent zabbix-server rh-php72-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/
にアクセスします。

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

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

# １１．Webインターフェースの日本語化

ログイン後、まずは日本語画面に切り替えます。

メインメニューが左側に変更されているので、左下の人型のアイコンのある「User settings」をクリックしてUser profileを開き、LanguageとしてJapaneseを選択してUpdateボタンを押してください。

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

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

まず、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
# yum install policycoreutils-python
```

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

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


#============= zabbix_t ==============
allow zabbix_t zabbix_var_run_t:sock_file create;
#
```

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

```shell-session
# grep zabbix_server /var/log/audit/audit.log | audit2allow -M zabbix-policy
To make this policy package active, execute:

semodule -i zabbix-policy.pp

```

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

```shell-session
# 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エージェントから取得した各値が見えると思いますので、どのような値が取得できているか確認してみてください。


# 最後に

この記事では、Zabbix公式のパッケージを極力使用するためにSCLを使用した記事とさせて頂きました。remiなどのPHPのパッケージを使用しても環境は構築できると思うので、調べてみて手順が確認できたら別途ご紹介しようと思います。