そうだ、TLS1.3のZabbixサーバを構築しよう(AlmaLinux9.2)

構築

0.前書き

お待たせしました。

今回こそZabbixサーバ構築編です。

 

第一弾である「AlmaLinux9.1をOpenSSL3.0.7にバージョンアップする」の続きになります。

AlmaLinux9.1をOpenSSL3.0.7にバージョンアップする
目次 前書き 環境説明 構築手順 後書き 参考サイト 0.前書き 私がインフラ園児ニアになって、1年が経ちました。 これまでいろいろな記事を揚げてきましたが、去年唯一できなかったTLS1.3を喋るサーバの構築を行おうと思います。とは言いつつ...

 

ちなみに、「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 6.2をAlmaLinux 8にインストール(MySQL編) - Qiita
Zabbix 6.2がリリースされました。Zabbix 6.2は、スタンダードリリースまたはポイントリリースと呼ばれるバージョンですので、サポート期間が短いことにご注意ください。基本的な手順はZ…

 

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つから選択できるようになります。

LOW Length >= 8
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を利用するという意味です。

 

認証プラグインについて説明されているサイトです。

MySQLの新認証方式について : DSAS開発者の部屋
MySQL の新しい認証方式について

 

そして認証プラグインを変更する場合の懸念については以下になります。

Zabbix 4.2 インストールメモ(CentOS7 + MySQL 8.0)
2019年3月29日、Zabbix 4.2がリリース されました。約半年ぶりのバージョンアップです。Zabbix 4.2 では、アイテムの保存前処理に JavaScript が使えるようになるなど、特に保存前処理に関する多くの機能が追加され

 

現在、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分ほどだった気がします。

 

3.参考サイト

Zabbix 6.2をAlmaLinux 8にインストール(MySQL編) - Qiita
Zabbix 6.2がリリースされました。Zabbix 6.2は、スタンダードリリースまたはポイントリリースと呼ばれるバージョンですので、サポート期間が短いことにご注意ください。基本的な手順はZ…
MySQLの新認証方式について : DSAS開発者の部屋
MySQL の新しい認証方式について
認証プラグインを指定してユーザーを作成する
MySQL ではユーザー認証を行うときに認証プラグインを使います。複数の認証プラグインが存在し、 MySQL 8.0.4 以前と以降ではデフォルトで使用される認証プラグインが変更になりました。ここでは MySQL でユーザーを作成する時に使...

コメント

タイトルとURLをコピーしました