2 事前共有鍵の使用

概要

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

コンポーネント PSK ID の最大サイズ PSK 値の最小サイズ PSK 値の最大サイズ
Zabbix 128 UTF-8 文字 128-bit(16 バイトの PSK、32 桁の 16 進数として入力) 2048-bit(256 バイトの PSK、512 桁の 16 進数として入力)
GnuTLS 128 バイト(UTF-8 文字を含む場合あり) - 2048-bit(256 バイトの PSK、512 桁の 16 進数として入力)
OpenSSL 1.0.x, 1.1.0 127 バイト(UTF-8 文字を含む場合あり) - 2048-bit(256 バイトの PSK、512 桁の 16 進数として入力)
OpenSSL 1.1.1 127 バイト(UTF-8 文字を含む場合あり) - 512-bit(64 バイトの PSK、128 桁の 16 進数として入力)
OpenSSL 1.1.1a 以降 127 バイト(UTF-8 文字を含む場合あり) - 2048-bit(256 バイトの PSK、512 桁の 16 進数として入力)

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

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

各 PSK ID は、1 つの値とのみ組み合わせる必要があります。同じ ID 文字列に対して異なる値を持つ 2 つの PSK が存在しないことを保証する責任は、ユーザーにあります。これを怠ると、この 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)に書き込みます。 ファイルの1行目にはPSKの値のみを記述してください。

PSKファイルのアクセス権を設定します。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暗号化を設定します。

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

例:

psk\_config.png

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

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

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

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

e560cb0d918d26d31b4f642181f5f570ad89a390931102e5391d08327ba434e9

PSKファイルへのアクセス権を設定します。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ベースの暗号化接続を使用してサーバーに接続するようになります。エラーメッセージがないか、サーバーとプロキシのログファイルを確認してください。

パッシブプロキシの場合も手順は非常に似ています。唯一の違いは、プロキシ設定ファイルで TLSAccept=psk を設定し、Zabbix Webインターフェースの "Connections to proxy" を PSK に設定することです。