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

2016年2月23日  カテゴリー:Zabbix  タグ: ,
Pocket
LINEで送る

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

暗号化なし

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

監視先ホストの設定

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

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

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

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


 ↓

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

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

終わりに

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

スポンサーリンク
Pocket
LINEで送る

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です