Zabbix 3.0をCentOS 6上で動かす(インストール編)

# 注意事項
先日公開していたAmazon Linux用のパッケージ「zabbix-3.0.1-2.amzn1.src.rpm」にはCentOS 6上でビルドする時に不備があったので、「zabbix-3.0.1-3.amzn1.src.rpm」を使ってください。

(2016/05/25追記)
[前回](http://qiita.com/atanaka7/items/cc381ad70c7ca7a0c993)、Zabbix LLCが公開しているRHEL/CentOS 6用パッケージにZabbixサーバーのモジュールが公開されていないと書きましたが、ディレクトリ構成からして非推奨ではあるものの、サーバー用のモジュールが公開されています。
これらのパッケージの利用方法に関して追記しました。

# はじめに
[先日のビルド編](http://qiita.com/atanaka7/items/cc381ad70c7ca7a0c993)の続きです。

インストールをする前に、先日ビルドしたパッケージを再確認しておきましょう。

ビルドされたパッケージのリストをみて、以前のバージョンのZabbixを利用してこられた方は、「zabbix」というパッケージがないことに気付かれたと思います。

Zabbix LLCから公開されるパッケージの構成が、Zabbix 3.0からzabbixというパッケージを利用しない構成に変更されています。

ですので、監視対象のサーバーに、以前であれば「zabbix」「zabbix-agent」の2つのパッケージを同時にインストールすることが必要でしたが、今回からは「zabbix-agent」だけのインストールで対応できるようになったわけです。

他にもパッケージ構成の違いとしては、データベースのテーブル作成と初期データ投入用のSQL文が1つのファイルに集約されるようになりました。

私のこれまでのZabbix 3.0インストールの記事では特に取り上げてはいませんでしたが、Zabbix LLCが公開しているZabbix 3.0のパッケージでは、1つにまとめられたファイルからデータベースのテーブルの作成と初期データの投入を行えるようになっていますのでご注意ください。

詳細な手順は、ここでも改めて紹介することとします。

もちろん、ソースから利用されている方は、ソースのtarball内に以前と同様に、schema.sql、image.sql、data.sqlと用意されているので、詳細を確認されたい方は、ソースを確認されるとよいと思います。


それでは、インストールの手順を確認してみましょう。


# CentOS 6用パッケージのインストール

## 実行環境用OSの準備
Zabbixを稼働させるサーバのOSをインストールして、yum updateなどを利用して最新の状態にしておきます。
ビルドした環境と一緒のサーバー機でも構いませんが、開発用ツールやライブラリなどで無駄にディスクを消費したりするので、本番環境はビルド環境とは分けることをお勧めします。

OSを最新の状態にすることは必須です。

脆弱性の問題への対処もそうですが、CentOS 6の古いバージョンだと、opensslのバージョンが古くて、Zabbix 3.0の新機能である通信暗号化が利用できない可能性があるという理由もあります。

あと、SELinuxはenableで進めます。
SELinuxの設定が不足していると、機能しなかったりデーモンの起動もできなかったりするのですが、後半でまとめて設定を行って問題を解決することとします。


## Zabbix LLCのリポジトリ登録
Zabbix LLCでは、CentOS 6用のZabbixサーバー関連のパッケージが公開されていないだけで、他の関連するパッケージなどはそのまま利用できます。
なので、Zabbix LLCのリポジトリを登録しておきます。

```
# yum install http://repo.zabbix.com/zabbix/3.0/rhel/6/x86_64/zabbix-release-3.0-1.el6.noarch.rpm
```


## SCLの有効化
SCL用のリポジトリの追加を行います。
ここでは、CentOS 6での手順となります。
RHEL 6を利用されている場合は、RHEL用の手順が必要です。

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

RHEL 6の場合は、先日ご紹介した参考リンク内のRed Hat Software Collections利用の手順を確認してください。


## パッケージのインストール
続いて、先日ビルドしたパッケージをインストールします。

ZabbixサーバーとZabbixサーバー自身を監視するためにZabbixエージェントをインストールします。
そして、Zabbixサーバーの設定を行うWebインターフェース関連のパッケージもインストールします。

MySQL用でインストールするパッケージのリストは以下の通りです。

```
zabbix-agent-3.0.1-3.el6.x86_64.rpm
zabbix-server-mysql-3.0.1-3.el6.x86_64.rpm
zabbix-web-3.0.1-3.el6.noarch.rpm
zabbix-web-japanese-3.0.1-3.el6.noarch.rpm
zabbix-web-mysql-3.0.1-3.el6.noarch.rpm
```

PostgreSQL用のパッケージをインストールしたいのであれば、ファイル名にmysqlと含まれるパッケージの代わりに以下のパッケージを利用してください。

```
zabbix-server-pgsql-3.0.1-3.el6.x86_64.rpm
zabbix-web-pgsql-3.0.1-3.el6.noarch.rpm
```


これらのファイルをビルドしたサーバーからコピーしてきて、以下のようにyumコマンドでインストールしてください。

```
# yum install zabbix-agent-3.0.1-3.el6.x86_64.rpm zabbix-server-mysql-3.0.1-3.el6.x86_64.rpm
# yum install zabbix-web-3.0.1-3.el6.noarch.rpm zabbix-web-mysql-3.0.1-3.el6.noarch.rpm zabbix-web-japanese-3.0.1-3.el6.noarch.rpm
```

色々な場所でご紹介していますが、「zabbix-web-japanese」というパッケージは、グラフ表示内の日本語の文字化けを防ぐためにフォントの設定を行うパッケージです。


## MySQLのインストール
ここで、Zabbixサーバーが利用するMySQLサーバーをインストールします。

```
# yum install mysql-server
```

インストールしたら、起動する前にデフォルトの文字コードなど最低限の設定をmy.cnf内に設定します。
メモリが十分にあるサーバー機を利用されているのであれば、別途、メモリに関する設定を追加してください。

```
# vi /etc/my.cnf
```

my.cnf内のmysqldセクションに以下の設定を追記します。

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

設定が終了したら、mysqld(MySQLサーバー)を起動します。
ついでに、OS起動時に自動的にmysqldが起動するようにもしておきます。

```
# service mysqld start
# chkconfig mysqld on
```

本来であれば、mysql_secure_installationコマンドを実行してセキュリティ強化を行うべきですが、ここでは、Zabbixのインストールの説明のみに注力するため割愛しています。


## データベースの作成
mysqldを起動したらデータベースの作成とアカウントの作成を行います。
説明を簡単にするため、rootでのパスワードを設定していない状態なので、rootのパスワードをきちんと設定されている方は、以下の説明内でのコマンド実行時に-pオプションでパスワードを指定することが必要になることにご注意ください。

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

続いて、Zabbix用のテーブルや初期データの投入を行います。

```
# zcat /usr/share/doc/zabbix-server-mysql-3.0.1/create.sql.gz | mysql -uroot zabbix
```

最初にも書きましたが、以前のバージョンのパッケージでは、schema.sql、images.sql、data.sqlと3つのファイルを順番に読み込ませていましたが、上記のように1つのファイルにまとめて投入できるようになっています。


## 設定ファイルの変更
データベースの準備ができたら、各種デーモンを起動するための設定です。

最低限の設定変更で動かすのであれば、Zabbixサーバーの設定とhttpdの設定を変更します。

まずは、Zabbixサーバーですが、データベースにアクセスするための情報を変更します。
ここまでの手順通りにやっていたのであれば、データベースにアクセスするためのパスワードの設定だけです。
変更するファイルは、/etc/zabbix/zabbix_server.confです。

```
# vi /etc/zabbix/zabbix_server.conf
```

このファイル内に、以下のようにパスワードの設定だけ追加します。

```
DBPassword=password
```

データベースアクセス用にアカウントを作成した時に指定したパスワードです。

続いて、httpdの設定で、PHPを利用する際のタイムゾーンの指定を変更します。
変更するファイルは、/etc/httpd/conf.d/zabbix.confです。

```
# vi /etc/httpd/conf.d/zabbix.conf
```

このファイルの内のコメントアウトされているdate.timezoneのコメントを外して設定を有効にし、利用するタイムゾーンを以下のように指定します。

```
php_value date.timezone Asia/Tokyo
```



## 各種デーモンの起動
各種デーモンを起動します。

```
# service zabbix-agent start
# service zabbix-server start
# service httpd start
```

しかし、現時点の設定では、アクセスできなかったり、zabbix_serverに関しては起動すらできない状態のはずです。

これは、デフォルトで設定されているiptablesやSELinuxの設定で制限されているためです。

そこで、それらの制限を外すこととします。


## iptablesの設定
iptablesに関しては、Webインターフェースに他のPCからもアクセスできるように設定することと、ZabbixサーバーとZabbixエージェントとの通信ができるように許可設定を追加します。

具体的には、Webインターフェースにアクセスできるよう、外部からポート番号80番でのアクセスを許可するのと、監視対象のZabbixエージェントからZabbixサーバーへ通知できるようポート番号10051番でのアクセスを許可します。

操作としては、既存のiptablesの設定が保存されていないかもしれないので、まずは保存します。
現時点の状態を保存したくないのであれば、設定保存の手順は飛ばしてください。

```
# service iptables save
```

これで、iptablesの設定が/etc/sysconfig/iptablesに保存されたはずです。
そして、その設定にZabbixを利用する上で必要となる設定を追加します。

```
# vi /etc/sysconfig/iptables
```

Zabbixサーバーを動かすサーバーに関しては、以下のような設定を22番(ssh)の設定の下に追加します。

```
-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 10051 -j ACCEPT
```

Zabbixエージェントを動かすサーバーで、外部のネットワークからZabbixサーバーがアクセスしてくるのであれば、以下のように設定を追加します。

```
-A INPUT -p tcp -m state --state NEW -m tcp --dport 10050 -j ACCEPT
```

設定を追加したらそれを読み込ませて反映します。

```
# service iptables reload
```


## SELinuxの設定
次に、SELinuxの設定も必要です。

SELinuxの論理値の設定で対応できるもののうち事前に分かっているものとしては、httpdからZabbixサーバーの状態を確認するためにhttpd_can_network_connectをonにすることと、Zabbixサーバーから他のネットワーク上のZabbixエージェントにアクセスするためにzabbix_can_networkをonにします。

```
# setsebool -P httpd_can_network_connect on
# setsebool -P zabbix_can_network on
```

しかし、これだけだとSELinuxが有効な場合には、以下のようなエラーが出てしまってzabbix_serverを起動できません。

```
 25766:20160404:163515.911 cannot set resource limit: [13] Permission denied
 25766:20160404:163515.911 cannot disable core dump, exiting...
```

audit.logには、以下のように記録されていると思います。

```
type=AVC msg=audit(1459755315.910:254): avc:  denied  { setrlimit } for  pid=25766 comm="zabbix_server" scontext=unconfined_u:system_r:zabbix_t:s0 tcontext=unconfined_u:system_r:zabbix_t:s0 tclass=process
type=SYSCALL msg=audit(1459755315.910:254): arch=c000003e syscall=160 success=no exit=-13 a0=4 a1=7ffdd96e5f00 a2=0 a3=7ffdd96e5c80 items=0 ppid=1 pid=25766 auid=0 uid=498 gid=499 euid=498 suid=498 fsuid=498 egid=499 sgid=499 fsgid=499 tty=(none) ses=1 comm="zabbix_server" exe="/usr/sbin/zabbix_server_mysql" subj=unconfined_u:system_r:zabbix_t:s0 key=(null)
```

つまり、setrlimitの権限を与えないといけないわけです。

そこで、設定を追加するために設定作成を補助するツールをインストールします。

```
# yum install policycoreutils-python
```

audit.logから必要な権限を確認してみましょう。

```
# grep zabbix_server /var/log/audit/audit.log | audit2allow


#============= zabbix_t ==============
allow zabbix_t self:process setrlimit;
#
```

というような出力が得られると思います。

確認できたら、この情報を元にポリシーファイルを生成して読み込ませます。
仮にポリシーの名前としてzabbix-limitとして以下のように実行します。

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

semodule -i zabbix-limit.pp

#
```

zabbix-limit.ppというファイルが生成されるので、それを表示されたメッセージの通り、semoduleコマンドで読み込ませます。

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

PostgreSQLを利用する場合や、SNMPトラップを受信したり、UserParameterで実行する内容によっては、さらに設定を追加することが必要になると思います。
setseboolで対応したり、audit.logからポリシーを生成して読み込ませて対応することになりますが、より厳密に制限したい場合は、SELinuxをより深く学んでみると良いでしょう。


## 各種デーモンの再起動
設定が終わったら、各種デーモンを再起動してみましょう。

```
# service zabbix-agent restart
# service zabbix-server restart
# service httpd restart
```

起動できていることが確認できたら、自動起動の設定もしておきます。

```
# chkconfig zabbix-agent on
# chkconfig zabbix-server on
# chkconfig httpd on
```


これで、基本的なZabbixの機能を利用するための設定が完了です。


## Webインターフェースの初期設定
各種セキュリティの設定が終了したら、Webブラウザでトップページにアクセスします。

最初は、初期設定のウィザードが実行されるので、表示される内容を確認して画面を進めてください。
ここからは、CentOS 7などと同様ですので詳細は割愛させて頂きます。


# 最後に
サポートは関係ないという方は、libcurlの新しいバージョンに入れ替えてepelやremiを活用すれば、RHEL/CentOS 6でもZabbix 3.0を動かすことはできます。
その方法は、他の方が書かれているのでそちらにお任せします。


# Zabbix LLCが公開したRHEL/CentOS 6用パッケージについて
利用者からの要望が多かったからか、RHEL/CentOS 6用のZabbixサーバー関連のパッケージも公開されています。

ただし、ディレクトリ構成として「deprecated」というディレクトリ下で公開されているので、非推奨のパッケージであるようです。

このパッケージを利用する際には、以下のような注意点があります。

- Zabbix 3.0の新機能であるSMTP認証は利用できない
- 一部のパッケージの依存関係が外されている
- 環境に合わせてファイルのコピーが必要

それぞれを簡単に説明します。

最初のSMTP認証が利用できないのは、RHEL/CentOS 6標準のlibcurlのバージョンが古いためです。
Zabbix LLCが公開しているパッケージでは、極力標準のパッケージで構成できるようになっているので、OS標準のライブラリを入れ替えるようにはしなかったようです。

2つめのパッケージの依存関係についてですが、これは、Zabbix 3.0からシステム要件として、PHPが5.4以上になったためだと思われます。
RHEL/CentOS 6の標準では、PHPのバージョンは5.3.3ですので、何らかの方法でPHP 5.4以上(PHP 7は未対応だったはず)の環境を用意することが必要になります。

極力サポートのあるパッケージでということであればSCLを利用する方法を選択するでしょうし、より最新のPHPを利用するためにOSの標準以外のリポジトリで公開されているパッケージを利用する方法やソースからインストールする方法などがあります。
パッケージ名を固定してしまうと、特定の条件で制限してしまうことになるため、あえてパッケージの依存関係としては外したようです。

そうすると、ZabbixサーバーのWebインターフェースのインストール時には、自分で選択してWebサーバーやPHPの環境を用意することが必要となることにご注意ください。

3つめですが、httpdの2.2系か2.4系であれば、より設定が簡単になるよう、Webサーバー用の設定ファイルが用意されています。
上記のようにhttpdの依存関係も設定されていませんので、Webサーバーとしてhttpd(Apache HTTP Server)を選択した場合は、用意されている設定ファイルを利用すると、以前のバージョンのパッケージと同様の設定を行うことができるようになります。

具体的に用意されているファイルは以下の2つです。

```
/usr/share/doc/zabbix-web-3.0.3/httpd22-example.conf
/usr/share/doc/zabbix-web-3.0.3/httpd24-example.conf
```

これらのファイルを利用するhttpdのバージョンに合わせて選択して、例えば、/etc/httpd/conf.d/zabbix.confというファイル名でコピーして利用することができます。


以下の手順は、標準のhttpd(2.2.15)、SCLのPHP 5.4、標準のMySQLサーバーを利用する方法です。

```shell-session
# yum install httpd
# yum install centos-release-SCL
# yum install php54-php php54-php-bcmath php54-php-gd php54-php-ldap php54-php-mbstring php54-php-xml
# yum install php54-php-mysqlnd
# yum install http://repo.zabbix.com/zabbix/3.0/rhel/6/x86_64/zabbix-release-3.0-1.el6.noarch.rpm
# yum install zabbix-agent zabbix-server-mysql zabbix-web-mysql
# cp /usr/share/doc/zabbix-web-3.0.3/httpd22-example.conf /etc/httpd/conf.d/zabbix.conf
# yum install mysql-server
# vi /etc/my.cnf
# service mysqld start
# mysql -uroot
mysql> create database zabbix character set utf8 collate utf8_bin;
mysql> grant all privileges on zabbix.* to zabbix@localhost identified by 'password' ;
mysql> exit
# zcat /usr/share/doc/zabbix-server-mysql-3.0.3/create.sql.gz | mysql -uroot zabbix
# vi /etc/zabbix/zabbix_server.conf
# vi /etc/httpd/conf.d/zabbix.conf
# service zabbix-agent start
# service zabbix-server start
# service httpd start
# chkconfig mysqld on
# chkconfig zabbix-agent on
# chkconfig zabbix-server on
# chkconfig httpd on
```

各コマンド行の詳細に関しては、これまでのインストール編の内容をご参照ください。

これまでのインストール編と異なるのは、httpdやphp関連のパッケージを個別にインストールする手順と、zabbix.confファイルのコピーだけです。