事前共有鍵を使用した暗号化

概要

Zabbix の各事前共有鍵(PSK)は、実際には次の 2 つの組み合わせです。

  • 秘密ではない PSK ID 文字列
  • 秘密の PSK 文字列値

PSK ID 文字列は、空でない UTF-8 文字列です。たとえば、"PSK ID 001 Zabbix agentd" です。これは、この特定の PSK を Zabbix コンポーネントが参照するための一意の名前です。PSK ID 文字列には機密情報を含めないでください。ネットワーク上を暗号化されずに送信されます。

PSK 値は、推測しにくい16進数の文字列です。たとえば、 "e560cb0d918d26d31b4f642181f5f570ad89a390931102e5391d08327ba434e9" です。

サイズ制限

Zabbix では PSK の ID と値にサイズ制限があります。場合によっては、暗号ライブラリ側でより低い制限があることがあります。

Component PSK identity max size PSK value min size PSK value max size
Zabbix 128 UTF-8 characters 128-bit (16-byte PSK, entered as 32 hexadecimal digits) 2048-bit (256-byte PSK, entered as 512 hexadecimal digits)
GnuTLS 128 bytes (may include UTF-8 characters) - 2048-bit (256-byte PSK, entered as 512 hexadecimal digits)
OpenSSL 1.0.x, 1.1.0 127 bytes (may include UTF-8 characters) - 2048-bit (256-byte PSK, entered as 512 hexadecimal digits)
OpenSSL 1.1.1 127 bytes (may include UTF-8 characters) - 512-bit (64-byte PSK, entered as 128 hexadecimal digits)
OpenSSL 1.1.1a and later 127 bytes (may include UTF-8 characters) - 2048-bit (256-byte PSK, entered as 512 hexadecimal digits)

Zabbix Webインターフェースでは、使用する暗号ライブラリに関係なく、最大 128 文字の PSK ID 文字列と 2048 ビットの PSK を設定できます。
一部の Zabbix コンポーネントがより低い制限をサポートしている場合、それらのコンポーネントで許可される長さに合わせて PSK ID と値を設定する責任はユーザーにあります。
長さ制限を超えると、Zabbix コンポーネント間の通信に失敗します。

Zabbix サーバーが PSK を使用してエージェントに接続する前に、サーバーはデータベース内(実際には設定キャッシュ内)で、そのエージェントに対して設定された PSK ID と PSK 値を検索します。接続を受信すると、エージェントは設定ファイルから PSK ID と PSK 値を使用します。両者が同じ PSK ID 文字列と PSK 値を持っていれば、接続は成功する可能性があります。

各 PSK ID は 1 つの値にのみ対応している必要があります。同じ ID 文字列で値が異なる PSK が 2 つ存在しないようにする責任はユーザーにあります。これを怠ると、予測不能なエラーや、この PSK ID 文字列を使用する PSK による Zabbix コンポーネント間通信の中断につながる可能性があります。

PSKの生成

たとえば、256ビット(32バイト)のPSKは、次のコマンドで生成できます。

  • OpenSSL を使用する場合:
$ openssl rand -hex 32
af8ced32dfe8714e548694e2d29e1a14ba6fa13f216cb35c19d0feb1084b0429
  • GnuTLS を使用する場合:
$ psktool -u psk_identity -p database.psk -s 32
Generating a random key for user 'psk_identity'
Key stored to database.psk

$ cat database.psk 
psk_identity:9b8eafedfaae00cece62e85d5f4792c7d9c9bcc851b23216a1d300311cc4f7cb

上記の "psktool" は、PSK IDとそれに関連付けられたPSKを含むデータベースファイルを生成する点に注意してください。Zabbix が PSK ファイルで期待するのは PSK のみなので、ファイルから ID 文字列とコロン(':')を削除する必要があります。

サーバー-エージェント通信のためのPSKの設定例

エージェントホスト上で、PSKの値をファイルに書き込みます。たとえば、 /home/zabbix/zabbix_agentd.psk です。ファイルには、最初の テキスト文字列としてPSKを含める必要があります。たとえば、次のようにします。

1f87b595725ac58dd977beef14b97461a7c1045b9a1c963065002c5473194952

PSKファイルのアクセス権を設定します。Zabbixユーザーのみが読み取り可能でなければなりません。

Zabbixエージェントの設定ファイル (zabbix_agentd.conf) でTLSパラメータを編集します。たとえば、次のように設定します。

TLSConnect=psk
TLSAccept=psk
TLSPSKFile=/home/zabbix/zabbix_agentd.psk
TLSPSKIdentity=PSK 001

エージェントはサーバーに接続し(アクティブチェック)、サーバーおよび zabbix_get からの接続をPSKを使用するものだけ受け入れます。PSK識別子は "PSK 001" になります。

エージェントを再起動します。これで、zabbix_get を使用して接続をテストできます。たとえば、次のようにします。

zabbix_get -s 127.0.0.1 -k "system.cpu.load[all,avg1]" --tls-connect=psk --tls-psk-identity="PSK 001" --tls-psk-file=/home/zabbix/zabbix_agentd.psk

(ダウンタイムを最小限に抑えるには、接続暗号化の管理で接続タイプを変更する方法を参照してください。)

Zabbix Webインターフェースで、このエージェントのPSK暗号化を設定します。

  1. データ収集 > ホスト に移動します。
  2. ホストを選択し、暗号化 タブをクリックします。

例:

psk\_config.png

必須入力フィールドには赤いアスタリスクが付いています。

設定キャッシュがデータベースと同期されると、新しい接続はPSKを使用します。エラーメッセージがないか、サーバーとエージェントのログファイルを確認してください。

サーバー - アクティブプロキシ通信のためのPSKの設定(例)

プロキシ上で、PSKの値をファイルに書き込みます。たとえば、 /home/zabbix/zabbix_proxy.psk です。ファイルには、最初の テキスト文字列としてPSKを含める必要があります。たとえば、次のとおりです。

e560cb0d918d26d31b4f642181f5f570ad89a390931102e5391d08327ba434e9

PSKファイルのアクセス権を設定します。Zabbixユーザーのみが読み取り可能でなければなりません。

Zabbixプロキシの設定ファイル (zabbix_proxy.conf) でTLSパラメータを編集します。たとえば、次のように設定します。

TLSConnect=psk
TLSPSKFile=/home/zabbix/zabbix_proxy.psk
TLSPSKIdentity=PSK 002

プロキシはPSKを使用してサーバーに接続します。PSK IDは "PSK 002" になります。

(ダウンタイムを最小限に抑えるには、接続の暗号化 管理 で接続タイプを変更する方法を参照してください。)

このプロキシのPSKをZabbix Webインターフェースで設定します。Administration > Proxies に移動し、プロキシを選択して、Encryption タブを開きます。"Connections from proxy" で PSK を選択します。"PSK identity" フィールドに "PSK 002" を貼り付け、"PSK" フィールドに "e560cb0d918d26d31b4f642181f5f570ad89a390931102e5391d08327ba434e9" を入力します。"Update" をクリックします。

プロキシを再起動します。これで、サーバーとのPSKベースの暗号化接続を使用するようになります。エラーメッセージがないか、サーバーとプロキシのログファイルを確認してください。

パッシブプロキシの場合も手順はほぼ同じです。 唯一の違いは、Zabbixプロキシの設定ファイルTLSAccept=psk を設定し、Zabbix Webインターフェースで Connections to proxyPSK に設定することです。

PSKの障害のトラブルシューティング

PSK に奇数個の16進数桁が含まれています

プロキシまたはエージェントが起動せず、プロキシまたはエージェントのログに次のメッセージが表示されます:

file "/home/zabbix/zabbix_proxy.psk" に無効な PSK があります
128バイトを超えるPSK identity文字列がGnuTLSに渡される

TLSクライアント側のログ:

gnutls_handshake() failed: -110 The TLS connection was non-properly terminated.

TLSサーバー側のログ:

gnutls_handshake() failed: -90 The SRP username supplied is illegal.
OpenSSL 1.1.1 で使用される PSK 値が長すぎる

接続側のログ:

...OpenSSL library (version OpenSSL 1.1.1  11 Sep 2018) initialized
...
...In zbx_tls_connect(): psk_identity:"PSK 1"
...zbx_psk_client_cb() requested PSK identity "PSK 1"
...End of zbx_tls_connect():FAIL error:'SSL_connect() set result code to SSL_ERROR_SSL: file ssl\statem\extensions_clnt.c line 801: error:14212044:SSL routines:tls_construct_ctos_early_data:internal error: TLS write fatal alert "internal error"'

受信側のログ:

...Message from 123.123.123.123 is missing header. Message ignored.

この問題は通常、OpenSSL を 1.0.x または 1.1.0 から 1.1.1 にアップグレードした場合に発生し、PSK 値が 512 ビット(64 バイトの PSK、128 桁の16進数)より長いときに起こります。

こちらも参照: 値サイズの 制限