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

概要

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

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

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

PSK値は、推測が困難な16進数の文字列です。たとえば、e560cb0d918d26d31b4f642181f5f570ad89a390931102e5391d08327ba434e9のようになります。

ドキュメントに記載されているPSKの例を、本番環境では絶対に使用しないでください。 代わりに、暗号学的に安全な一意のPSKを生成してください。

サイズ制限

Zabbix では PSK identity と PSK value にサイズ制限があります。一部のケースでは、暗号ライブラリの制限がさらに小さい場合があります。

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 identity文字列と最大2048ビットのPSKを設定できます。
一部のZabbixコンポーネントがより小さい制限をサポートしている場合、それらのコンポーネントで許可される長さに収まるようにPSK identityとPSK valueを設定することは、ユーザーの責任です。
長さの制限を超えると、Zabbixコンポーネント間の通信に失敗します。

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

各PSK identityには、1つのPSK valueのみを対応付ける必要があります。 同じidentity文字列で異なる値を持つPSKが2つ存在しないようにすることは、ユーザーの責任です。 これを怠ると、このPSK identity文字列を使用する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 identityとそれに関連付けられたPSKを含むデータベースファイルを生成します。ZabbixがPSKファイルに必要とするのはPSKのみであるため、ファイルからidentity文字列とコロン(「:」)を削除する必要があります。

サーバーとエージェント間の通信でPSKを設定する(例)

エージェントのホストで、上記で生成したPSKの値を、たとえば /home/zabbix/zabbix_agentd.psk ファイルに書き込みます。 ファイルの1行目にはPSKの値を記述する必要があります。

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

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