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

概要

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とPSK値にサイズ制限があります。一部の暗号ライブラリでは、これより小さい制限が設定されている場合があります。

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とPSK値を設定することは、ユーザーの責任です。
長さの制限を超えると、Zabbixコンポーネント間の通信に失敗します。

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

各PSK IDは、1つの値とのみ組み合わせる必要があります。同じID文字列で異なる値を持つPSKが2つ存在しないようにすることは、ユーザーの責任です。このような設定を行うと、そのPSK ID文字列を使用する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

エージェントはサーバーに接続し(アクティブチェック)、PSKを使用するサーバーおよび zabbix_getからの接続だけを受け入れるようになります。PSK IDは「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. ホストを選択し、暗号化タブをクリックします。
  3. PSK暗号化の詳細を設定します。

例:

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」になります。

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

ZabbixのWebインターフェースで、このプロキシのPSKを設定します。管理 > プロキシに移動し、プロキシを選択して、暗号化タブに移動します。「プロキシからの接続」でPSKにチェックを入れます。「PSK ID」フィールドに「PSK 002」を貼り付け、「PSK」フィールドに 「e560cb0d918d26d31b4f642181f5f570ad89a390931102e5391d08327ba434e9」を貼り付けます。「更新」をクリックします。

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

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

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進数)より長いときに起こります。

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