0.前書き
お待たせしました。
今回こそZabbixサーバ構築編です。
第一弾である「AlmaLinux9.1をOpenSSL3.0.7にバージョンアップする」の続きになります。
ちなみに、「AlmaLinux9.1をOpenSSL3.0.7にバージョンアップする」にも追記しましたが、AlmaLinuxのライブラリにあるOpenSSLが更新されており、ソースコードからインストールなんぞしなくともdnfでバージョンアップ可能になっているようです。
さて今回はタイトル通り、TLS1.3をしゃべるZabbixサーバの構築になります。
LAN内での運用しかしないのにTLS1.3が必要か?って言われるとグーの音も出ません…
まぁセキュリティを高めるに越したことはないですし、作業も難しくないので自前で認証局をお持ちの組織、あるいは一般家庭にはニーズがあるかもしれません。
1.環境説明
①テストサーバ
構築システム:Zabbixサーバ
ホスト名:testserver
OS:AlmaLinux release 9.2
IPアドレス:172.16.1.8
※前回はホスト名zabbixserverとして構築しましたが、すでに構築済みのためtestserverとして別で構築しました。その影響でIPも前回と異なります。また、前回はAlmaLinux release 9.1で構築していましたが、LTSが更新されていたので最新版を使います。なおAlmaLinux release 9.1でも構築可能であることは確認済みです。
【各プログラムのバージョン】
zabbix_server(6.0.19)
zabbix_agent2(6.0.19)
zabbixのその他モジュールすべて6.0.19
Apache HTTP Server(2.4.53)
mod_ssl(2.4.53-11)
PHP(8.1.14)
MySQL(8.0.32)
Zabbixは2023年7月2現在、6.4.4が最新版ですが
LTS版は6.0.xなので今回はマイナーバージョンの最新である6.0.19で構築します。
2.構築手順
赤字の設定値は環境に合わせて変更してください。
インストール済パッケージの更新を行います。
# dnf update -y
すでにOpenSSLのバージョンが上がっていると思います。
# openssl version
OpenSSL 3.0.7 1 Nov 2022 (Library: OpenSSL 3.0.7 1 Nov 2022)
私はSELinuxを無効にしました。
有効の場合、後ほどmod_sslの部分で痛い目見るゾ★
# sed -i s/'SELINUX=enforcing'/'SELINUX=disabled'/g /etc/selinux/config
再起動
# reboot
Zabbixの構築自体はこちらのサイトを参考にさせていただきました。
zabbix-release-latest.el9.noarch.rpmをインストールして、Zabbix Official Repositoryレポジトリを有効にします。
# dnf install -y https://repo.zabbix.com/zabbix/6.0/rhel/9/x86_64/zabbix-release-latest.el9.noarch.rpm
phpをインストールします。
# dnf module install -y php:8.1
もろもろインストールします。
zabbix-web-serviceは定期レポート用なので必須ではないようです。
# dnf install -y zabbix-server-mysql zabbix-web-service zabbix-sql-scripts zabbix-agent2
定期レポート用にgoogle-chrome-stableが必要なのでインストールしておきます。
# dnf install -y https://dl.google.com/linux/direct/google-chrome-stable_current_x86_64.rpm
mysqlをインストールします。
# dnf install -y mysql-server
mysqld.serviceの起動と自動起動です。
※注意:起動までやたら長い場合があります。
あと、root以外のユーザで起動させてください。エラーが出ると思います。
$ systemctl enable mysqld --now
mysqlのセキュリティに関する初期設定を行います。
$ mysql_secure_installation
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?
パスワードポリシーを変更するか否か聞かれています。
今回はnにしました。
ちなみにyを選ぶと以下の3つから選択できるようになります。
MEDIUM Length >= 8, numeric, mixed case, and special characters
STRONG Length >= 8, numeric, mixed case, special characters and dictionary file
Please set the password for root here.
mysqlにおけるrootユーザのパスワード設定です。
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?
ビルトインで作成されている検証作業用の匿名ユーザを削除するか聞かれています。
yにします
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?
rootユーザへのリモート接続を禁止するかどうかです
yにします
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?
ビルトインで作成されている検証作業用のデータベースを削除するか聞かれています。
yにします
Reloading the privilege tables will ensure that all changes
made so far will take effect immediately.
Reload privilege tables now?
上記の内容を即時反映するか聞かれています。
yにします
続いて、mysql-server.cnfを編集します。
編集前にバックアップを取ってます。
# cp -p /etc/my.cnf.d/mysql-server.cnf /etc/my.cnf.d/mysql-server.cnf.old ;sudo vi /etc/my.cnf.d/mysql-server.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
log-error=/var/log/mysql/mysqld.log
pid-file=/run/mysqld/mysqld.pid
character-set-server = utf8mb4
collation-server = utf8mb4_bin
skip-character-set-client-handshake
innodb_file_per_table
log_bin_trust_function_creators = 1
default_password_lifetime = 0
max_allowed_packet = 16M
innodb_buffer_pool_size = 6G
innodb_log_file_size = 1G
key_buffer_size=0
innodb_buffer_pool_instances=1
本来データベースを最適化するためにチューニングが必要な部分ですが、私のデータベースに関する知識が乏しすぎるため、最低限の設定です…
設定反映のため、mysqlを再起動します。
※注意:起動までやたら長い場合があります。
あと、root以外のユーザで再起動させてください。エラーが出ると思います。
$ systemctl restart mysqld
mysqlの設定のためrootでログインします
-uはユーザを指定
-pはパスワードの指定(※ないとエラーになります)
$ mysql -u root -p
初期のデータベースを確認します。※やらなくていいです。
※やらなくていいです。あと、コマンド部分はすべて小文字でも可能ですが、変数との区別がついてわかりやすい上になんかデータベースいじってるっぽく見えるので大文字で行きます。
mysql> SHOW DATABASES;
+——————–+
| Database |
+——————–+
| information_schema |
| mysql |
| performance_schema |
| sys |
+——————–+
4 rows in set (0.01 sec)
4つ作成されているみたいですね。
では、zabbixという名前のデータベースを作成します。
mysql> CREATE DATABASE zabbix CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;
Query OK, 1 row affected (0.07 sec)
再度確認します。
mysql> SHOW DATABASES;
+——————–+
| Database |
+——————–+
| information_schema |
| mysql |
| performance_schema |
| sys |
| zabbix |
+——————–+
5 rows in set (0.00 sec)
zabbixというデータベースが作成されてますね。
ユーザの作成とパスワードの設定を行います。
ユーザ:zabbixdb
パスワード:password
IDENTIFIED WITH mysql_native_passwordは認証プラグインにmysql_native_passwordを利用するという意味です。
認証プラグインについて説明されているサイトです。
そして認証プラグインを変更する場合の懸念については以下になります。
現在、caching_sha2_passwordへのzabbixやPHPの対応ができるようになっているかどうかは検証できていません。passwordの部分はお好みのものに変更してください。
mysql> CREATE USER 'zabbixdb'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';
Query OK, 0 rows affected (0.24 sec)
つづいて権限の付与です。
ユーザであるzabbixdbにzabbixデータベースのすべての権限を与えます。
mysql> GRANT ALL PRIVILEGES ON zabbix.* TO 'zabbixdb'@'localhost';
Query OK, 0 rows affected (0.06 sec)
確認します。
# SELECT USER, HOST, PLUGIN FROM mysql.user WHERE USER = 'zabbixdb';
+———-+———–+———————–+
| USER | HOST | PLUGIN |
+———-+———–+———————–+
| zabbixdb | localhost | mysql_native_password |
+———-+———–+———————–+
1 row in set (0.00 sec)
mysqlの対話から抜けます。
mysql> exit
zabbixのモジュールを使って、MySQLに作成したzabbixデータベースにデータの初期投入を行います。接続するユーザはzabbixdbで、パスワードは先ほど設定したpasswordになります。
※注意:プロンプトが返ってこなくても諦めないでください。私は最長2時間かかりました…………
$ sudo zcat /usr/share/zabbix-sql-scripts/mysql/server.sql.gz | mysql -uzabbixdb -p zabbix
ちなみにバージョンによっては「server.sql.gz」のパスが異なるみたいなので、なければ「find /usr -name “server.sql.gz”などで探してみてください。」
このあとzabbix_server.confを編集するので、編集前にバックアップを取ります。
# cp -p /etc/zabbix/zabbix_server.conf /etc/zabbix/zabbix_server.conf.old
/etc/zabbix/zabbix_server.confの中身を置換して編集します。
当然viでも可能です。Emacsなんかではできません(大嘘)
# sed -i s/'DBUser=zabbix'/'DBUser=zabbixdb'/g /etc/zabbix/zabbix_server.conf
# sed -i s/'\# DBPassword='/'DBPassword=password'/g /etc/zabbix/zabbix_server.conf
# sed -i s/'\# StartReportWriters=0'/'StartReportWriters=3'/g /etc/zabbix/zabbix_server.conf
# sed -i s/'\# WebServiceURL='/'WebServiceURL=http:\/\/127.0.0.1:10053\/report'/g /etc/zabbix/zabbix_server.conf
再起動します
# systemctl restart zabbix-server.service
httpd関係で必要なもののインストールです。
# dnf install -y zabbix-web-mysql zabbix-apache-conf zabbix-web-japanese
firewalldの設定を変更します。
–permanentがないと恒久設定になりませんのでご注意ください。
# firewall-cmd --add-port=10051/tcp --zone=public --permanent
# firewall-cmd --add-service={http,https} --zone=public --permanent
zabbixサーバ→zabbixエージェントの通信:宛先ポートTCP/10050
zabbixエージェント→zabbixサーバの通信:宛先ポートTCP/10051
原則上記のルールで、zabbixサーバとzabbixエージェントが同居しているプロセス間通信の場合はTCP/10050を開けなくてよいみたいです。
設定反映します。
# firewall-cmd --reload
各サービスの起動と自動起動の設定です。
# systemctl enable zabbix-agent2 zabbix-server zabbix-web-service php-fpm httpd --now
ここまでの作業で、Zabbix君自体は終了です。
SSL化なんて必要ねぇよ!って方はこちらでアクセスしてみてください。
http://172.16.1.8/zabbix/
では続けます。
SSL化に必要なモジュールのインストール
# dnf install -y mod_ssl
httpd.confを編集する前にバックアップを取ります。
# cp -p /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf.old
httpd.confを置換して変更します。
# sed -i s/'\#ServerName www.example.com:80'/'ServerName testserver.home.miyamo83.com:80'/g /etc/httpd/conf/httpd.conf
ここからは証明書の発行です。
場所を移動します。
# cd /etc/pki/tls/private/
pemファイル(秘密鍵)を生成します。
# openssl genrsa -out key.pem 4096
その秘密鍵を使って、csrを作成します。
# openssl req -new -sha256 -key key.pem -out server.csr
※秘密鍵の生成とcsrの生成が一行で済むコマンドもあるみたいですが、今回検証できていません。
例)openssl req -new -newkey rsa:4096 -sha256 -nodes -keyout key.pem -out server.csr
また、csrの有効期限は825日ですが「-days 36500」で最大10年まで伸ばるみたいです。
認証局での署名は割愛します。
自前の認証局または認証機関から署名してもらってください。
認証局で署名したファイルを以下に保存します。
# /etc/pki/tls/certs/server.crt
ssl.confを編集するため、バックアップを取ります。
# cp /etc/httpd/conf.d/ssl.conf /etc/httpd/conf.d/ssl.conf.org -p
編集します。
# vi /etc/httpd/conf.d/ssl.conf
編集箇所は以下です。
SSLProtocol TLSv1.2 +TLSv1.3
SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5:!SEED:!IDEA:!3DES:!RC4:!DH
SSLCertificateFile /etc/pki/tls/certs/server.crt
SSLCertificateKeyFile /etc/pki/tls/private/key.pem
文法のチェック
# apachectl configtest
Syntax OK
以下でアクセスできるようになっているはずです。
https://testserver.home.miyamo83.com/zabbix/
データベース名:zabbix
ユーザ:zabbixdb
パスワード:password
ログイン画面
初期ユーザ:Admin
初期パスワード:zabbix
ダッシュボード
証明書も問題なさそうですね
おしまい
3.後書き
なんかMySQLの挙動怪しい気がするのは自分だけでしょうか…
「server.sql.gz」に時間がかかったのもおそらくMySQLが原因だと思っています。
とはいえ、うちの環境起因の可能性もあり得るので何とも言えませんが…
ちなみにAlmaLinux9.1でも2時間ほどかかったので、AlmaLinux9.2が悪いわけではなさそうです。
ただ、2月に構築したときはMySQLが遅いと感じることもなかったですし「server.sql.gz」も10分ほどだった気がします。
コメント