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 と値にサイズ制限があります。場合によっては、 暗号ライブラリの制限のほうがより厳しいことがあります。
| Component | PSK identity max size | PSK value min size | PSK value max size |
|---|---|---|---|
| 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 and later | 127バイト(UTF-8文字を含む場合があります) | - | 2048-bit(256バイトのPSK、512桁の16進数として入力) |
Zabbix Webインターフェースでは、使用している暗号ライブラリに関係なく、最大128文字のPSK ID文字列と2048-bit長のPSKを設定できます。
一部のZabbixコンポーネントでより低い制限がある場合、それらのコンポーネントで許可される長さのPSK IDと値を設定する責任はユーザーにあります。
長さの制限を超えると、Zabbixコンポーネント間の通信障害が発生します。
ZabbixサーバーがPSKを使用してエージェントに接続する前に、サーバーは そのエージェント用に設定されたPSK IDとPSK値をデータベース (実際には設定キャッシュ)で参照します。接続を受信すると、エージェントは 設定ファイル内のPSK IDとPSK値を使用します。両者が同じPSK ID文字列と PSK値を持っていれば、接続は成功する可能性があります。
各PSK IDは、1つの値とのみ対応付ける必要があります。PSK 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)に書き込みます。
ファイルの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暗号化を設定します。
- データ収集 → ホストに移動します。
- ホストを選択し、暗号化タブをクリックします。
例:

必須入力フィールドには、赤いアスタリスクが付いています。
設定キャッシュがデータベースと同期されると、新しい接続で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の[プロキシ設定ファイル](/manual/concepts/proxy#configuration-file)でTLSAccept=pskを設定し、ZabbixのWebインターフェースでプロキシへの接続をPSKに設定することです。