Zabbix 3.0 通信の暗号化設定(RSA証明書ベースの暗号化)

Zabbix
Zabbix
スポンサーリンク

Zabbix3.0 では、Zabbixモジュール間(Zabbixサーバー、Zabbixプロキシ、Zabbixエージェント)で行われる通信を暗号化できるようになりました。これまでは、インターネットを通じてサーバを監視する場合は、別途VPNやSSHトンネリングを使って、通信を暗号化する(又はあきらめる(^^;))必要がありましたが、Zabbix3.0には、証明書や事前共有鍵を使った、通信の暗号化機能が追加されています。そこで今回は、RSA証明書ベースの暗号化を試してみました。

サーバ構成

Zabbixサーバ1台と、Zabbixエージェントをインストールするサーバ1台の構成です。どちらもサーバOSは、CentOS7.2です。今回は、Zabbixサーバ上に、プライベート認証局(CA)を構築し、暗号化に使う証明書を発行することにします。

Zabbixサーバのインストールと基本設定は「Zabbix 3.0 を yumでインストール」をご参照ください。

プライベート認証局(CA)の構築

証明書ベースの暗号化を使う場合は「プライベート認証局(CA)の証明書」と、そのプライベート認証局が署名した「サーバ・クライアント証明書」と「サーバ・クライアント秘密鍵」の3点が必要になりますので、まず初めに、プライベート認証局(CA)を構築します。

・認証局(CA)構築用に openssl の設定を変更します。
vim /etc/pki/tls/openssl.cnf

[ usr_cert ]
(略)
basicConstraints=CA:FALSE
 ↓
basicConstraints=CA:TRUE
 
[ v3_ca ]
(略)
# nsCertType = sslCA, emailCA
 ↓
nsCertType = sslCA, emailCA

・認証局(CA)構築スクリプトを編集し、有効期限を10年に変更します。
vim /etc/pki/tls/misc/CA

CADAYS="-days 1095" # 3 years
 ↓
CADAYS="-days 3650" # 10 years

「/etc/pki/CA/」ディレクトリ下に(もし無かったら作成してください)証明書のラベル付けに使用するシリアルファイルを作成します。

echo '1000' > /etc/pki/CA/serial

・認証局(CA)を作成します。青文字の箇所以外は<空エンター>でOKです。
/etc/pki/tls/misc/CA -newca

CA certificate filename (or enter to create)
<空エンター>
(略)
Enter PEM pass phrase: 1234 ←表示されません
Verifying - Enter PEM pass phrase: 1234 ←表示されません
(略)
Country Name (2 letter code) [XX]: JP
State or Province Name (full name) []: Tokyo
Locality Name (eg, city) [Default City]:
Organization Name (eg, company) [Default Company Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []: Zabbix CA
Email Address []:
 
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Using configuration from /etc/pki/tls/openssl.cnf
Enter pass phrase for /etc/pki/CA/private/./cakey.pem: 1234 ←表示されません
Check that the request matches the signature
Signature ok
 
(略:入力したCA情報が表示されます)
 
Certificate is to be certified until Feb 18 01:08:53 2026 GMT (3650 days)
 
Write out database with 1 new entries
Data Base Updated

認証局(CA)秘密鍵のパスフレーズ除去

cd /etc/pki/CA/private/
openssl rsa -in cakey.pem -out cakey.pem
Enter pass phrase for cakey.pem: 1234 ←表示されません

認証局(CA)秘密鍵のパーミションを変更

chmod 400 /etc/pki/CA/private/cakey.pem

以上で、プライベート認証局(CA)の構築完了です。「/etc/pki/CA/cacert.pem」が「プライベート認証局(CA)の証明書」になりますので、Zabbix用に適当な場所にコピーしておきます。

Zabbix用の証明書保存場所の作成(場所はどこでも構いません)

mkdir /var/lib/zabbix
chown zabbix:zabbix /var/lib/zabbix/
chmod 700 /var/lib/zabbix/

プライベート認証局(CA)の証明書をリネームしてコピー

cp -i /etc/pki/CA/cacert.pem /var/lib/zabbix/zabbix_ca_file

Zabbix用のサーバ・クライアント証明書の作成

続いて、構築したプライベート認証局(CA)を使って、Zabbix用のサーバ・クライアント証明書を作成(署名)します。今回は、通信の暗号化が目的なので、ここで作成した証明書と秘密鍵を、ZabbixサーバとZabbixエージェント共通で使います。

Zabbix用の証明書保存場所へ移動します。

cd /var/lib/zabbix/

秘密鍵の作成

openssl genrsa -out zabbix.key 2048

・証明書発行要求(CSR)の作成。CA構築の時と同じく、青文字の箇所以外は<空エンター>でOKです。
openssl req -new -key zabbix.key -out zabbix.csr

(略)
Country Name (2 letter code) [XX]: JP
State or Province Name (full name) []: Tokyo
Locality Name (eg, city) [Default City]:
Organization Name (eg, company) [Default Company Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []: Zabbix
Email Address []:
 
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

・サーバ・クライアント証明書の作成用に openssl の設定を変更します。※nsCertType は、必ず「server, client」としてください。
vim /etc/pki/tls/openssl.cnf

[ CA_default ]
(略)
default_days = 365
 ↓
default_days = 3650
 
[ usr_cert ]
(略)
basicConstraints=CA:TRUE
 ↓
basicConstraints=CA:FALSE
 
# nsCertType = server
 ↓
nsCertType = server, client

【補足】
nsCertType を「server」サーバ証明書のみ、または「client」クライアント証明書のみとして作成した証明書を、Zabbixの通信暗号化に使用すると、以下のようなエラーが発生し、正常に通信が出来なくなることがあります。

10170:20160218:085828.988 failed to accept an incoming connection: from 127.0.0.1: unsupported certificate purpose: TLS handshake returned error code 1: file s3_srvr.c line 3297: error:140890B2:SSL routines:SSL3_GET_CLIENT_CERTIFICATE:no certificate returned: TLS write fatal alert "unsupported certificate"

Zabbixの公式マニュアルに記載を見つけられなかったので、あくまで推測ですが、パッシブチェックの場合は、証明書の関係で見ると、Zabbixサーバがクライアント、Zabbixエージェントがサーバになるので(ややこしい説明ですみません)Zabbixサーバにクライアント証明書、Zabbixエージェントにサーバ証明書が必要になるのに対して、アクティブチェックではその逆になるため、サーバ証明書とクライアント証明書を兼ねた証明書が必要なのかもしれません。

・補足が長くなりましたが、作成した証明書発行要求(CSR)を元に、証明書(CRT)を作成します。
openssl ca -in zabbix.csr -out zabbix.crt

Using configuration from /etc/pki/tls/openssl.cnf
Check that the request matches the signature
Signature ok
 
(略:入力したCSRの内容が表示されます)
 
Certificate is to be certified until Feb 18 02:26:26 2026 GMT (3650 days)
Sign the certificate? [y/n]: y
 
1 out of 1 certificate requests certified, commit? [y/n] y
Write out database with 1 new entries
Data Base Updated

証明書発行要求(CSR)の削除(削除しなくても構いませんが crt と間違えやすいので)

rm zabbix.csr

以上でZabbix用のサーバ・クライアント証明書の作成完了です。/var/lib/zabbix/ 下に、証明書ベースの暗号化設定に必要な、3つのファイルが出来ていると思います。

ls -1 /var/lib/zabbix/
 
zabbix.crt・・・・「サーバ・クライアント証明書」
zabbix.key・・・・「サーバ・クライアント秘密鍵」
zabbix_ca_file・・「プライベート認証局(CA)の証明書」

セキュリティのため証明書/秘密鍵のオーナーとパーミッションを変更しておきましょう。

chown zabbix:zabbix /var/lib/zabbix/zabbix*
chmod 400 /var/lib/zabbix/zabbix*

下準備が長くなってしまいましたが、続いて本題のZabbixの設定です。

Zabbixサーバの設定

Zabbixサーバの設定ファイルで、先ほど作成した証明書/秘密鍵の3点セットのパスを指定します。

vim /etc/zabbix/zabbix_server.conf

TLSCAFile=/var/lib/zabbix/zabbix_ca_file
TLSCertFile=/var/lib/zabbix/zabbix.crt
TLSKeyFile=/var/lib/zabbix/zabbix.key

TLSCAFile
 プライベート認証局(CA)の証明書を指定

TLSCertFile
 サーバ・クライアント証明書を指定

TLSKeyFile
 サーバ・クライアント秘密鍵を指定

設定が終わったら Zabbixサーバを再起動します。

systemctl restart zabbix-server

アクティブチェックに使うポート(10051/tcp)を開けておきます。

firewall-cmd --add-port=10051/tcp --permanent
firewall-cmd --reload

暗号化設定の詳細は公式マニュアル「1 Using certificates | Zabbix Documentation 3.0」をご参照ください。

Zabbixエージェントのインストールと設定

インストール

Zabbix の yumリポジトリの登録

rpm -ivh http://repo.zabbix.com/zabbix/3.0/rhel/7/x86_64/zabbix-release-3.0-1.el7.noarch.rpm

インストール(動作確認用に zabbix-sender もインストールします)

yum -y install zabbix-agent
yum -y install zabbix-sender

Zabbix の yumリポジトリの無効化(念のため yum update でアップデートしないようにしておきます)
vim /etc/yum.repos.d/zabbix.repo

[zabbix]
(略)
enabled=1
 ↓
enabled=0
 
[zabbix-non-supported]
(略)
enabled=1
 ↓
enabled=0

設定

・ZabbixサーバのIPアドレスを変更します。
vim /etc/zabbix/zabbix_agentd.conf

Server=127.0.0.1
 ↓
Server=172.16.1.107

Zabbixサーバから、先ほど作成した証明書/秘密鍵の3点セットを、scp コマンドなど、安全な方法でコピーします。(ここでは /var/lib/zabbix/ 下にコピーしたとします)

コピーした証明書/秘密鍵のオーナーとパーミッションを変更します。

chown -R zabbix:zabbix /var/lib/zabbix
chmod 700 /var/lib/zabbix
chmod 400 /var/lib/zabbix/zabbix*

Zabbixエージェントの設定ファイルには、証明書/秘密鍵の3点セットの指定に加えて、アクティブチェック、パッシブチェックの通信方式を指定します。

vim /etc/zabbix/zabbix_agentd.conf

TLSConnect=cert
TLSAccept=cert
TLSCAFile=/var/lib/zabbix/zabbix_ca_file
TLSCertFile=/var/lib/zabbix/zabbix.crt
TLSKeyFile=/var/lib/zabbix/zabbix.key

TLSConnect
 アクティブチェック時の通信方式を指定します。

TLSAccept
 パッシブチェック時の通信方式を指定します。

それぞれ指定できる値は以下の通りです、カンマ区切りで複数指定できます。
「unencrypted」暗号化無し(デフォルト)
「psk」事前共有鍵ベースの暗号化
「cert」証明書ベースの暗号化

設定が終わったら Zabbixエージェントを起動します。

systemctl start zabbix-agent

パッシブチェックに使うポート(10050/tcp)を開けておきます。

firewall-cmd --add-port=10050/tcp --permanent
firewall-cmd --reload

動作確認

zabbix_get で動作確認

zabbix_get コマンドで、パッシブチェックの動作確認を行います。Zabbixサーバ上で以下のコマンドを実行し、値が取れていればOKです。

zabbix_get -s 172.16.1.108 -k agent.version \
--tls-connect cert \
--tls-ca-file /var/lib/zabbix/zabbix_ca_file \
--tls-cert-file /var/lib/zabbix/zabbix.crt \
--tls-key-file /var/lib/zabbix/zabbix.key
 
3.0.0 ←値が取れている

--tls-connect
 通信方式を指定します。指定できる値は以下の通りです。
 「unencrypted」暗号化無し(デフォルト)
 「psk」事前共有鍵ベースの暗号化
 「cert」証明書ベースの暗号化

--tls-ca-file
 プライベート認証局(CA)の証明書を指定

--tls-cert-file
 サーバ・クライアント証明書を指定

--tls-key-file
 サーバ・クライアント秘密鍵を指定
 

zabbix_sender で動作確認

zabbix_sender コマンドで、アクティブチェックの動作確認を行います。Zabbixエージェント上で以下のコマンドを実行し、「sent: 1」となっていればOKです。(ダミーのキーなので failed: 1になります)

zabbix_sender -z 172.16.1.107 -s sv01 -k dummy.key -o ABCDEFGHIJKLMN \
--tls-connect cert \
--tls-ca-file /var/lib/zabbix/zabbix_ca_file \
--tls-cert-file /var/lib/zabbix/zabbix.crt \
--tls-key-file /var/lib/zabbix/zabbix.key
 
info from server: "processed: 0; failed: 1; total: 1; seconds spent: 0.000049"
sent: 1; skipped: 0; total: 1

本当に暗号化されているの?

上の zabbix_sender コマンドを実行している時に、Zabbixサーバ上で tcpdump などでパケットチャプチャしてみると、暗号化通信されていることが確認できると思います。

tcpdump port 10051 -i enp0s8 -X

暗号化なし

12:37:08.805656 IP 172.16.1.108.50834 > vb07.zabbix-trapper: Flags [P.], seq 1:107, ack 1, win 229, options [nop,nop,TS val 9662825 ecr 33428886], length 106
	0x0000:  4500 009e 138d 4000 4006 cbd5 ac10 016c  E.....@.@......l
	0x0010:  ac10 016b c692 2743 39fb 62e4 cd67 0b9e  ...k..'C9.b..g..
	0x0020:  8018 00e5 8e82 0000 0101 080a 0093 7169  ..............qi
	0x0030:  01fe 1596 5a42 5844 015d 0000 0000 0000  ....ZBXD.]......
	0x0040:  007b 2272 6571 7565 7374 223a 2273 656e  .{"request":"sen
	0x0050:  6465 7220 6461 7461 222c 2264 6174 6122  der.data","data"
	0x0060:  3a5b 7b22 686f 7374 223a 2273 7630 3122  :[{"host":"sv01"
	0x0070:  2c22 6b65 7922 3a22 6475 6d6d 792e 6b65  ,"key":"dummy.ke
	0x0080:  7922 2c22 7661 6c75 6522 3a22 4142 4344  y","value":"ABCD
	0x0090:  4546 4748 494a 4b4c 4d4e 227d 5d7d       EFGHIJKLMN"}]}

暗号化あり(正直どのパケットなのか分かりません)

12:48:23.823114 IP 172.16.1.108.50849 > vb07.zabbix-trapper: Flags [P.], seq 2377:2512, ack 2362, win 265, options [nop,nop,TS val 10337843 ecr 34103903], length 135
	0x0000:  4500 00bb 56f4 4000 4006 8851 ac10 016c  E...V.@.@..Q...l
	0x0010:  ac10 016b c6a1 2743 9cb0 f239 616e 0b96  ...k..'C...9an..
	0x0020:  8018 0109 46db 0000 0101 080a 009d be33  ....F..........3
	0x0030:  0208 625f 1703 0300 82f9 9d4a 29ac 60b8  ..b_.......J).`.
	0x0040:  7210 e905 c7d8 1427 6e78 1aa6 23c8 3f26  r......'nx..#.?&
	0x0050:  f1ff 38b9 5405 77a8 3fd0 df65 388c 7001  ..8.T.w.?..e8.p.
	0x0060:  6f9c eacf 4359 6d74 2417 da44 d7cf d35f  o...CYmt$..D..._
	0x0070:  3769 2fa6 04ae 7ace 54a4 c5e1 626b 3e26  7i/...z.T...bk>&
	0x0080:  caf8 a183 dd8e 18e8 7d5d 4ee6 2bb1 1873  ........}]N.+..s
	0x0090:  3dfa 58cf adfb badc 9ee3 ef38 8d46 4520  =.X........8.FE.
	0x00a0:  4737 601f 7694 e441 fad1 4180 b6e7 1fb0  G7`.v..A..A.....
	0x00b0:  d58e 8867 3f41 24db e138 3e              ...g?A$..8>	

監視先ホストの設定

最後にWEBインターフェースで、監視先ホストの設定をします。

[設定]→[ホスト]→[ホストの作成] をクリックします。

「ホスト」タブを選択し、赤枠内を入力/選択します。

「テンプレート」タブを選択し、動作確認用に適当なテンプレートを追加しておきます。※下の「追加」ボタンはまだ押しません。


 ↓

「暗号化」タブを選択し、ホストへの接続(パッシブチェック)→「証明書」を選択、ホストからの接続(アクティブチェック)→「証明書」をチェックして、下の「追加」ボタンをクリックします。

以上で監視先ホストの設定が完了しました。ステータスが「有効」になっていれば、通信が暗号化されて正常に監視されています。

終わりに

プライベート認証局の構築が少し大変ですが、Zabbixの設定だけで通信の暗号化ができるのは便利ですね。ただ、プライベート認証局を運用していくには、証明書の発行/失効や鍵の管理など、それなりのノウハウが必要になるかと思います。実運用環境で、確実なZabbix運用をしたい場合は、専門の会社さんに構築/運用を依頼することをオススメします。

コメント

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