17. 暗号化

概要

Zabbix は、Transport Layer Security(TLS)プロトコル v.1.2 および 1.3(暗号ライブラリに依存)を使用して、Zabbix コンポーネント間の暗号化通信をサポートしています。証明書ベースおよび事前共有鍵ベースの暗号化がサポートされています。

暗号化は、次の接続に対して設定できます。

暗号化はオプションであり、個々のコンポーネントごとに設定できます。

  • 一部のプロキシおよびエージェントは、サーバーとの通信に証明書ベースの暗号化を使用するよう設定でき、他のものは事前共有鍵ベースの暗号化を使用でき、さらに別のものは暗号化されていない通信(従来どおり)を継続できます。
  • サーバー(プロキシ)は、異なるホストに対して異なる暗号化設定を使用できます。

Zabbix デーモンプログラムは、暗号化された受信接続と暗号化されていない受信接続の両方に対して、1 つの待受ポートを使用します。暗号化を追加しても、ファイアウォールで新しいポートを開放する必要はありません。

制限事項

  • 秘密鍵は、起動時にZabbixコンポーネントが読み取り可能なファイルに平文で保存されます。
  • 事前共有鍵はZabbix Webインターフェースで入力され、Zabbixデータベースに平文で保存されます。
  • 組み込みの暗号化では、Zabbix Webインターフェースを実行しているWebサーバーとユーザーのWebブラウザー間の通信は保護されません。
  • 現在、暗号化された各接続は完全なTLSハンドシェイクで開始され、セッションキャッシュおよびチケットは実装されていません。
  • 暗号化を追加すると、ネットワーク遅延に応じてアイテムのチェックおよびアクションにかかる時間が増加します。
    • たとえば、パケット遅延が100msの場合、TCP接続を開いて暗号化されていないリクエストを送信するには約200msかかります。 暗号化を使用すると、TLS接続の確立に約1000msが追加されます。
    • タイムアウト値を増やす必要がある場合があります。そうしないと、エージェント上でリモートスクリプトを実行する一部のアイテムやアクションは、暗号化されていない接続では動作しても、暗号化された接続ではタイムアウトして失敗する可能性があります。
  • 暗号化はネットワークディスカバリではサポートされていません。ネットワークディスカバリによって実行されるZabbixエージェントチェックは暗号化されず、Zabbixエージェントが暗号化されていない接続を拒否するよう設定されている場合、そのようなチェックは成功しません。

暗号化サポート付きでのZabbixのコンパイル

暗号化をサポートするには、Zabbixをサポート対象の暗号ライブラリのいずれかとともにコンパイルおよびリンクする必要があります。

  • GnuTLS - バージョン 3.1.18 以降
  • OpenSSL - バージョン 1.0.1、1.0.2、1.1.0、1.1.1、3.0.x
  • LibreSSL - バージョン 2.7.4、2.8.2 でテスト済み:
    • LibreSSL 2.6.x はサポートされていません
    • LibreSSL は OpenSSL の互換置換としてサポートされています; 新しい tls_*() の LibreSSL 固有API関数は使用されません。 LibreSSL でコンパイルされた Zabbix コンポーネントでは PSK を使用できず、証明書のみ使用できます。

Zabbix Webインターフェース向けの SSL 設定については、こちらのベストプラクティスを参照してください。

ライブラリは、"configure" スクリプトに対応するオプションを指定して選択します:

  • --with-gnutls[=DIR]
  • --with-openssl[=DIR] (LibreSSL にも使用)

たとえば、OpenSSL を使用してサーバーおよびエージェント向けにソースを設定するには、次のようにします:

./configure --enable-server --enable-agent --with-mysql --enable-ipv6 --with-net-snmp --with-libcurl --with-libxml2 --with-openssl

異なる Zabbix コンポーネントを異なる暗号ライブラリでコンパイルすることもできます(例: サーバーは OpenSSL、エージェントは GnuTLS)。

事前共有鍵(PSK)を使用する予定がある場合は、 PSK を使用する Zabbix コンポーネントでは GnuTLS または OpenSSL 1.1.0(またはそれ以降)のライブラリの使用を検討してください。GnuTLS および OpenSSL 1.1.0 ライブラリは、Perfect Forward Secrecy を備えた PSK 暗号スイートをサポートしています。 古いバージョンの OpenSSL ライブラリ(1.0.1、1.0.2c)も PSK をサポートしていますが、利用可能な PSK 暗号スイートでは Perfect Forward Secrecy は提供されません。

接続の暗号化管理

Zabbix の接続では、以下を使用できます。

Zabbix コンポーネント間の暗号化を指定するために使用される重要なパラメータは2つあります。

  • TLSConnect - 送信接続に使用する暗号化方式を指定します (暗号化なし、PSK、または証明書)
  • TLSAccept - 受信接続で許可する接続タイプを指定します (暗号化なし、PSK、または証明書)。1つ以上の値を指定できます。

TLSConnect は、Zabbix プロキシの設定ファイル(アクティブモードでは、サーバーへの接続のみを指定)および Zabbix エージェントの設定ファイル(アクティブチェック用)で使用されます。Zabbix Webインターフェース では、TLSConnect に相当するものは、データ収集 → ホスト → <some host> → 暗号化 タブの ホストへの接続 フィールド、および 管理 → プロキシ → <some proxy> → 暗号化 タブの プロキシへの接続 フィールドです。設定された接続の暗号化タイプで接続に失敗した場合、他の暗号化タイプは試行されません。

TLSAccept は、Zabbix プロキシの設定ファイル(パッシブモードでは、サーバーからの接続のみを指定)および Zabbix エージェントの設定ファイル(パッシブチェック用)で使用されます。Zabbix Webインターフェース では、TLSAccept に相当するものは、データ収集 → ホスト → <some host> → 暗号化 タブの ホストからの接続 フィールド、および 管理 → プロキシ → <some proxy> → 暗号化 タブの プロキシからの接続 フィールドです。

通常、受信接続に対して設定する暗号化タイプは1つだけです。ただし、たとえば停止時間を最小限に抑え、ロールバックの可能性を確保しながら、暗号化なしから証明書ベースへ暗号化タイプを切り替えたい場合があります。これを実現するには、次のようにします。

  • エージェント設定ファイルで TLSAccept=unencrypted,cert を設定し、Zabbix エージェントを再起動します
  • 証明書を使用して zabbix_get でエージェントへの接続をテストします。動作する場合は、Zabbix Webインターフェース の データ収集 → ホスト → <some host> → 暗号化 タブで、そのエージェントの暗号化設定を再構成し、ホストへの接続 を「証明書」に設定できます。
  • サーバーの設定キャッシュが更新されると(そのホストがプロキシによって監視されている場合は、プロキシ設定も更新されると)、そのエージェントへの接続は暗号化されます
  • すべてが期待どおりに動作する場合は、エージェント設定ファイルで TLSAccept=cert を設定し、Zabbix エージェントを再起動します。これでエージェントは、証明書ベースで暗号化された接続のみを受け付けます。 暗号化なしおよび PSK ベースの接続は拒否されます。

同様に、サーバーおよびプロキシでも機能します。Zabbix Webインターフェース のホスト設定で ホストからの接続 が「証明書」に設定されている場合、エージェント(アクティブチェック)および zabbix_sender(トラッパーアイテム)からは、証明書ベースで暗号化された接続のみが受け付けられます。

多くの場合、受信接続と送信接続には同じ暗号化タイプ、または暗号化なしを設定することになるでしょう。ただし技術的には、たとえば受信接続には証明書ベースの暗号化、送信接続には PSK ベースの暗号化というように、非対称に設定することも可能です。

各ホストの暗号化設定は、Zabbix Webインターフェース の データ収集 → ホスト にある エージェントの暗号化 列に表示されます。例:

ホストへの接続 ホストからの許可される接続 ホストからの拒否される接続
none\_none.png 暗号化なし 暗号化なし 暗号化された接続、証明書ベースの暗号化、および PSK ベースの暗号化
cert\_cert.png 暗号化、証明書ベース 暗号化、証明書ベース 暗号化なし、および PSK ベースの暗号化
psk\_psk.png 暗号化、PSK ベース 暗号化、PSK ベース 暗号化なし、および証明書ベースの暗号化
psk\_none\_psk.png 暗号化、PSK ベース 暗号化なし、および PSK ベースの暗号化 証明書ベースの暗号化
cert\_all.png 暗号化、証明書ベース 暗号化なし、PSK ベース、または証明書ベースの暗号化 -

接続はデフォルトで暗号化されません。暗号化は各ホストおよびプロキシごとに個別に設定する必要があります。

zabbix_getとzabbix_senderの暗号化機能

zabbix_getzabbix_sender manpages のマニュアルを参照してください。

暗号スイート

暗号スイートは、デフォルトでは Zabbix の起動時に内部的に設定されます。

GnuTLS および OpenSSL では、ユーザー設定の暗号スイートもサポートされています。ユーザーは、各自のセキュリティポリシーに従って暗号スイートを設定できます。この機能の使用は任意です(組み込みのデフォルト暗号スイートも引き続き使用できます)。

デフォルト設定でコンパイルされた暗号ライブラリでは、Zabbix の組み込みルールにより、通常は次の暗号スイートになります(優先度の高い順):

Library Certificate ciphersuites PSK ciphersuites
GnuTLS 3.1.18 TLS_ECDHE_RSA_AES_128_GCM_SHA256
TLS_ECDHE_RSA_AES_128_CBC_SHA256
TLS_ECDHE_RSA_AES_128_CBC_SHA1
TLS_RSA_AES_128_GCM_SHA256
TLS_RSA_AES_128_CBC_SHA256
TLS_RSA_AES_128_CBC_SHA1
TLS_ECDHE_PSK_AES_128_CBC_SHA256
TLS_ECDHE_PSK_AES_128_CBC_SHA1
TLS_PSK_AES_128_GCM_SHA256
TLS_PSK_AES_128_CBC_SHA256
TLS_PSK_AES_128_CBC_SHA1
OpenSSL 1.0.2c ECDHE-RSA-AES128-GCM-SHA256
ECDHE-RSA-AES128-SHA256
ECDHE-RSA-AES128-SHA
AES128-GCM-SHA256
AES128-SHA256
AES128-SHA
PSK-AES128-CBC-SHA
OpenSSL 1.1.0 ECDHE-RSA-AES128-GCM-SHA256
ECDHE-RSA-AES128-SHA256
ECDHE-RSA-AES128-SHA
AES128-GCM-SHA256
AES128-CCM8
AES128-CCM
AES128-SHA256
AES128-SHA
ECDHE-PSK-AES128-CBC-SHA256
ECDHE-PSK-AES128-CBC-SHA
PSK-AES128-GCM-SHA256
PSK-AES128-CCM8
PSK-AES128-CCM
PSK-AES128-CBC-SHA256
PSK-AES128-CBC-SHA
OpenSSL 1.1.1d TLS_AES_256_GCM_SHA384
TLS_CHACHA20_POLY1305_SHA256
TLS_AES_128_GCM_SHA256
ECDHE-RSA-AES128-GCM-SHA256
ECDHE-RSA-AES128-SHA256
ECDHE-RSA-AES128-SHA
AES128-GCM-SHA256
AES128-CCM8
AES128-CCM
AES128-SHA256
AES128-SHA
TLS_CHACHA20_POLY1305_SHA256
TLS_AES_128_GCM_SHA256
ECDHE-PSK-AES128-CBC-SHA256
ECDHE-PSK-AES128-CBC-SHA
PSK-AES128-GCM-SHA256
PSK-AES128-CCM8
PSK-AES128-CCM
PSK-AES128-CBC-SHA256
PSK-AES128-CBC-SHA

ユーザー設定の暗号スイート

組み込みの暗号スイート選択基準は、ユーザー設定の暗号スイートで上書きできます。

ユーザー設定の暗号スイートは、TLS暗号スイート、その安全性、設定ミスの影響を理解し、TLSのトラブルシューティングに慣れている上級ユーザー向けの機能です。

組み込みの暗号スイート選択基準は、以下のパラメータを使用して上書きできます。

上書きの範囲 パラメータ 説明
証明書用の暗号スイート選択 TLSCipherCert13 TLS 1.3プロトコル用の有効なOpenSSL 1.1.1のcipher strings(その値はOpenSSL関数SSL_CTX_set_ciphersuites()に渡されます)。 TLS 1.3用の証明書ベースの暗号スイート選択基準

OpenSSL 1.1.1以降のみ。
TLSCipherCert TLS 1.2用の有効なOpenSSLのcipher strings、または有効なGnuTLSのpriority strings。それぞれの値はSSL_CTX_set_cipher_list()またはgnutls_priority_init()関数に渡されます。 TLS 1.2/1.3(GnuTLS)、TLS 1.2(OpenSSL)用の証明書ベースの暗号スイート選択基準
PSK用の暗号スイート選択 TLSCipherPSK13 TLS 1.3プロトコル用の有効なOpenSSL 1.1.1のcipher strings(その値はOpenSSL関数SSL_CTX_set_ciphersuites()に渡されます)。 TLS 1.3用のPSKベースの暗号スイート選択基準

OpenSSL 1.1.1以降のみ。
TLSCipherPSK TLS 1.2用の有効なOpenSSLのcipher strings、または有効なGnuTLSのpriority strings。それぞれの値はSSL_CTX_set_cipher_list()またはgnutls_priority_init()関数に渡されます。 TLS 1.2/1.3(GnuTLS)、TLS 1.2(OpenSSL)用のPSKベースの暗号スイート選択基準
証明書とPSKの統合暗号スイートリスト TLSCipherAll13 TLS 1.3プロトコル用の有効なOpenSSL 1.1.1のcipher strings(その値はOpenSSL関数SSL_CTX_set_ciphersuites()に渡されます)。 TLS 1.3用の暗号スイート選択基準

OpenSSL 1.1.1以降のみ。
TLSCipherAll TLS 1.2用の有効なOpenSSLのcipher strings、または有効なGnuTLSのpriority strings。それぞれの値はSSL_CTX_set_cipher_list()またはgnutls_priority_init()関数に渡されます。 TLS 1.2/1.3(GnuTLS)、TLS 1.2(OpenSSL)用の暗号スイート選択基準

zabbix_get および zabbix_sender ユーティリティで暗号スイート選択を上書きするには、以下のコマンドラインパラメータを使用します。

  • --tls-cipher13
  • --tls-cipher

新しいパラメータは任意です。パラメータが指定されていない場合は、内部のデフォルト値が使用されます。パラメータが定義されている場合、空にすることはできません。

暗号ライブラリでTLSCipher*の値の設定に失敗した場合、サーバー、プロキシ、またはエージェントは起動せず、エラーがログに記録されます。

各パラメータがどのような場合に適用されるかを理解することが重要です。

発信接続

最も単純なケースは発信接続です。

  • 証明書を使用する発信接続では、TLSCipherCert13 または TLSCipherCert を使用します
  • PSK を使用する発信接続では、TLSCipherPSK13 または TLSCipherPSK を使用します
  • zabbix_get および zabbix_sender ユーティリティの場合、コマンドライン パラメータ --tls-cipher13 または --tls-cipher を使用できます (暗号化は --tls-connect パラメータで一意に指定されます)
受信接続

受信接続については、ルールがコンポーネントおよび設定ごとに異なるため、少し複雑になります。

Zabbix エージェント の場合:

Agent connection setup Cipher configuration
TLSConnect=cert TLSCipherCert, TLSCipherCert13
TLSConnect=psk TLSCipherPSK, TLSCipherPSK13
TLSAccept=cert TLSCipherCert, TLSCipherCert13
TLSAccept=psk TLSCipherPSK, TLSCipherPSK13
TLSAccept=cert,psk TLSCipherAll, TLSCipherAll13

Zabbix サーバー および プロキシ の場合:

Connection setup Cipher configuration
PSK を使用する送信接続 TLSCipherPSK, TLSCipherPSK13
証明書を使用する受信接続 TLSCipherAll, TLSCipherAll13
サーバーに証明書がない場合の、PSK を使用する受信接続 TLSCipherPSK, TLSCipherPSK13
サーバーに証明書がある場合の、PSK を使用する受信接続 TLSCipherAll, TLSCipherAll13

上記 2 つの表から、いくつかのパターンが見て取れます:

  • TLSCipherAll および TLSCipherAll13 は、証明書ベース および PSK ベースの暗号スイートを組み合わせたリストを使用する場合にのみ指定できます。これが該当するケースは 2 つあります: 証明書が設定されたサーバー(プロキシ)(暗号ライブラリが PSK をサポートしている場合、サーバーおよびプロキシでは常に PSK 暗号スイートも設定されます)、証明書ベースと PSK ベースの両方の受信接続を受け入れるよう設定されたエージェント
  • それ以外の場合は、TLSCipherCert* および/または TLSCipherPSK* で十分です

以下の表は、TLSCipher* の組み込みデフォルト値を示しています。これらは、独自のカスタム値を設定する際の良い出発点になるでしょう。

Parameter GnuTLS 3.6.12
TLSCipherCert NONE:+VERS-TLS1.2:+ECDHE-RSA:+RSA:+AES-128-GCM:+AES-128-CBC:+AEAD:+SHA256:+SHA1:+CURVE-ALL:+COMP-NULL:+SIGN-ALL:+CTYPE-X.509
TLSCipherPSK NONE:+VERS-TLS1.2:+ECDHE-PSK:+PSK:+AES-128-GCM:+AES-128-CBC:+AEAD:+SHA256:+SHA1:+CURVE-ALL:+COMP-NULL:+SIGN-ALL
TLSCipherAll NONE:+VERS-TLS1.2:+ECDHE-RSA:+RSA:+ECDHE-PSK:+PSK:+AES-128-GCM:+AES-128-CBC:+AEAD:+SHA256:+SHA1:+CURVE-ALL:+COMP-NULL:+SIGN-ALL:+CTYPE-X.509
Parameter OpenSSL 1.1.1d 1
TLSCipherCert13
TLSCipherCert EECDH+aRSA+AES128:RSA+aRSA+AES128
TLSCipherPSK13 TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256
TLSCipherPSK kECDHEPSK+AES128:kPSK+AES128
TLSCipherAll13
TLSCipherAll EECDH+aRSA+AES128:RSA+aRSA+AES128:kECDHEPSK+AES128:kPSK+AES128

1 古い OpenSSL バージョン (1.0.1、1.0.2、1.1.0)、LibreSSL、および OpenSSL が PSK サポートなしでコンパイルされている場合は、デフォルト値が異なります。

ユーザー設定の暗号スイートの例

以下に、ユーザー設定の暗号スイートの例を示します:

暗号スイート文字列のテストと、PFS 暗号スイートのみの許可

どの暗号スイートが選択されたかを確認するには、設定ファイルで 'DebugLevel=4' を設定するか、zabbix_sender に -vv オプションを 使用する必要があります。

目的の暗号スイートを得るには、TLSCipher* パラメータをいくつか 試す必要がある場合があります。TLSCipher* パラメータを調整する たびに Zabbix サーバー、プロキシ、またはエージェントを何度も再起動 するのは不便です。より便利な方法として、zabbix_sender または openssl コマンドを使用できます。ここでは両方を示します。

1. zabbix_sender を使用する方法。

たとえば /home/zabbix/test.conf というテスト用設定ファイルを、 zabbix_agentd.conf ファイルの構文で作成します:

  Hostname=nonexisting
  ServerActive=nonexisting

  TLSConnect=cert
  TLSCAFile=/home/zabbix/ca.crt
  TLSCertFile=/home/zabbix/agent.crt
  TLSKeyFile=/home/zabbix/agent.key
  TLSPSKIdentity=nonexisting
  TLSPSKFile=/home/zabbix/agent.psk

この例では、有効な CA 証明書、エージェント証明書、および PSK が 必要です。証明書および PSK ファイルのパスと名前は、環境に合わせて 調整してください。

証明書を使用せず、PSK のみを使用している場合は、より簡単な テストファイルを作成できます:

  Hostname=nonexisting
  ServerActive=nonexisting

  TLSConnect=psk
  TLSPSKIdentity=nonexisting
  TLSPSKFile=/home/zabbix/agentd.psk

選択された暗号スイートは、zabbix_sender を実行することで確認できます (OpenSSL 1.1.d でコンパイルされた例):

  $ zabbix_sender -vv -c /home/zabbix/test.conf -k nonexisting_item -o 1 2>&1 | grep ciphersuites
  zabbix_sender [41271]: DEBUG: zbx_tls_init_child() certificate ciphersuites: TLS_AES_256_GCM_SHA384 TLS_CHACHA20_POLY1305_SHA256 TLS_AES_128_GCM_SHA256 ECDHE-RSA-AES128-GCM-SHA256 ECDHE-RSA-AES128-SHA256 ECDHE-RSA-AES128-SHA AES128-GCM-SHA256 AES128-CCM8 AES128-CCM AES128-SHA256 AES128-SHA
  zabbix_sender [41271]: DEBUG: zbx_tls_init_child() PSK ciphersuites: TLS_CHACHA20_POLY1305_SHA256 TLS_AES_128_GCM_SHA256 ECDHE-PSK-AES128-CBC-SHA256 ECDHE-PSK-AES128-CBC-SHA PSK-AES128-GCM-SHA256 PSK-AES128-CCM8 PSK-AES128-CCM PSK-AES128-CBC-SHA256 PSK-AES128-CBC-SHA
  zabbix_sender [41271]: DEBUG: zbx_tls_init_child() certificate and PSK ciphersuites: TLS_AES_256_GCM_SHA384 TLS_CHACHA20_POLY1305_SHA256 TLS_AES_128_GCM_SHA256 ECDHE-RSA-AES128-GCM-SHA256 ECDHE-RSA-AES128-SHA256 ECDHE-RSA-AES128-SHA AES128-GCM-SHA256 AES128-CCM8 AES128-CCM AES128-SHA256 AES128-SHA ECDHE-PSK-AES128-CBC-SHA256 ECDHE-PSK-AES128-CBC-SHA PSK-AES128-GCM-SHA256 PSK-AES128-CCM8 PSK-AES128-CCM PSK-AES128-CBC-SHA256 PSK-AES128-CBC-SHA

ここでは、デフォルトで選択される暗号スイートを確認できます。これらの デフォルト値は、古い OpenSSL バージョン(1.0.1 以降)を使用する システム上で動作する Zabbix エージェントとの相互運用性を確保するために 選ばれています。

より新しいシステムでは、許可する暗号スイートを少数に絞ることで、 セキュリティを強化できます。たとえば、PFS(Perfect Forward Secrecy) を持つ暗号スイートのみを許可できます。TLSCipher* パラメータを 使用して、PFS を持つ暗号スイートのみを許可してみましょう。

PSK を使用する場合、結果は OpenSSL 1.0.1 および 1.0.2 を使用する システムとは相互運用できません。証明書ベースの暗号化は動作するはずです。

test.conf 設定ファイルに 2 行追加します:

  TLSCipherCert=EECDH+aRSA+AES128
  TLSCipherPSK=kECDHEPSK+AES128

そして再度テストします:

  $ zabbix_sender -vv -c /home/zabbix/test.conf -k nonexisting_item -o 1 2>&1 | grep ciphersuites            
  zabbix_sender [42892]: DEBUG: zbx_tls_init_child() certificate ciphersuites: TLS_AES_256_GCM_SHA384 TLS_CHACHA20_POLY1305_SHA256 TLS_AES_128_GCM_SHA256 ECDHE-RSA-AES128-GCM-SHA256 ECDHE-RSA-AES128-SHA256 ECDHE-RSA-AES128-SHA        
  zabbix_sender [42892]: DEBUG: zbx_tls_init_child() PSK ciphersuites: TLS_CHACHA20_POLY1305_SHA256 TLS_AES_128_GCM_SHA256 ECDHE-PSK-AES128-CBC-SHA256 ECDHE-PSK-AES128-CBC-SHA        
  zabbix_sender [42892]: DEBUG: zbx_tls_init_child() certificate and PSK ciphersuites: TLS_AES_256_GCM_SHA384 TLS_CHACHA20_POLY1305_SHA256 TLS_AES_128_GCM_SHA256 ECDHE-RSA-AES128-GCM-SHA256 ECDHE-RSA-AES128-SHA256 ECDHE-RSA-AES128-SHA AES128-GCM-SHA256 AES128-CCM8 AES128-CCM AES128-SHA256 AES128-SHA ECDHE-PSK-AES128-CBC-SHA256 ECDHE-PSK-AES128-CBC-SHA PSK-AES128-GCM-SHA256 PSK-AES128-CCM8 PSK-AES128-CCM PSK-AES128-CBC-SHA256 PSK-AES128-CBC-SHA        

「certificate ciphersuites」と「PSK ciphersuites」のリストは変更されて おり、以前より短くなっています。想定どおり、TLS 1.3 の暗号スイートと TLS 1.2 の ECDHE-* 暗号スイートのみが含まれています。

2. TLSCipherAll および TLSCipherAll13 は zabbix_sender では テストできません。これらは、上記の例で表示されている 「certificate and PSK ciphersuites」の値には影響しません。 TLSCipherAll および TLSCipherAll13 を調整するには、エージェント、 プロキシ、またはサーバーで試す必要があります。

したがって、PFS を持つ暗号スイートのみを許可するには、最大で 3 つの パラメータを

  TLSCipherCert=EECDH+aRSA+AES128
  TLSCipherPSK=kECDHEPSK+AES128
  TLSCipherAll=EECDH+aRSA+AES128:kECDHEPSK+AES128

zabbix_agentd.conf、zabbix_proxy.conf、および zabbix_server_conf に 追加する必要がある場合があります。これは、それぞれに証明書が設定されて おり、さらにエージェントでも PSK が設定されている場合です。

Zabbix 環境で証明書を使用せず、PSK ベースの暗号化のみを使用している 場合は、必要なのは次の 1 つだけです:

  TLSCipherPSK=kECDHEPSK+AES128

仕組みを理解したところで、openssl コマンドを使えば Zabbix の外でも 暗号スイートの選択をテストできます。3 つの TLSCipher* パラメータ値を すべてテストしてみましょう:

  $ openssl ciphers EECDH+aRSA+AES128 | sed 's/:/ /g'
  TLS_AES_256_GCM_SHA384 TLS_CHACHA20_POLY1305_SHA256 TLS_AES_128_GCM_SHA256 ECDHE-RSA-AES128-GCM-SHA256 ECDHE-RSA-AES128-SHA256 ECDHE-RSA-AES128-SHA
  $ openssl ciphers kECDHEPSK+AES128 | sed 's/:/ /g'
  TLS_AES_256_GCM_SHA384 TLS_CHACHA20_POLY1305_SHA256 TLS_AES_128_GCM_SHA256 ECDHE-PSK-AES128-CBC-SHA256 ECDHE-PSK-AES128-CBC-SHA
  $ openssl ciphers EECDH+aRSA+AES128:kECDHEPSK+AES128 | sed 's/:/ /g'
  TLS_AES_256_GCM_SHA384 TLS_CHACHA20_POLY1305_SHA256 TLS_AES_128_GCM_SHA256 ECDHE-RSA-AES128-GCM-SHA256 ECDHE-RSA-AES128-SHA256 ECDHE-RSA-AES128-SHA ECDHE-PSK-AES128-CBC-SHA256 ECDHE-PSK-AES128-CBC-SHA

より詳細な出力が必要な場合は、openssl ciphers-V オプションを 付けて使用することもできます:

  $ openssl ciphers -V EECDH+aRSA+AES128:kECDHEPSK+AES128
            0x13,0x02 - TLS_AES_256_GCM_SHA384  TLSv1.3 Kx=any      Au=any  Enc=AESGCM(256) Mac=AEAD
            0x13,0x03 - TLS_CHACHA20_POLY1305_SHA256 TLSv1.3 Kx=any      Au=any  Enc=CHACHA20/POLY1305(256) Mac=AEAD
            0x13,0x01 - TLS_AES_128_GCM_SHA256  TLSv1.3 Kx=any      Au=any  Enc=AESGCM(128) Mac=AEAD
            0xC0,0x2F - ECDHE-RSA-AES128-GCM-SHA256 TLSv1.2 Kx=ECDH     Au=RSA  Enc=AESGCM(128) Mac=AEAD
            0xC0,0x27 - ECDHE-RSA-AES128-SHA256 TLSv1.2 Kx=ECDH     Au=RSA  Enc=AES(128)  Mac=SHA256
            0xC0,0x13 - ECDHE-RSA-AES128-SHA    TLSv1 Kx=ECDH     Au=RSA  Enc=AES(128)  Mac=SHA1
            0xC0,0x37 - ECDHE-PSK-AES128-CBC-SHA256 TLSv1 Kx=ECDHEPSK Au=PSK  Enc=AES(128)  Mac=SHA256
            0xC0,0x35 - ECDHE-PSK-AES128-CBC-SHA TLSv1 Kx=ECDHEPSK Au=PSK  Enc=AES(128)  Mac=SHA1

同様に、GnuTLS の優先順位文字列もテストできます:

  $ gnutls-cli -l --priority=NONE:+VERS-TLS1.2:+ECDHE-RSA:+AES-128-GCM:+AES-128-CBC:+AEAD:+SHA256:+CURVE-ALL:+COMP-NULL:+SIGN-ALL:+CTYPE-X.509
  Cipher suites for NONE:+VERS-TLS1.2:+ECDHE-RSA:+AES-128-GCM:+AES-128-CBC:+AEAD:+SHA256:+CURVE-ALL:+COMP-NULL:+SIGN-ALL:+CTYPE-X.509
  TLS_ECDHE_RSA_AES_128_GCM_SHA256                        0xc0, 0x2f      TLS1.2
  TLS_ECDHE_RSA_AES_128_CBC_SHA256                        0xc0, 0x27      TLS1.2

  Protocols: VERS-TLS1.2
  Ciphers: AES-128-GCM, AES-128-CBC
  MACs: AEAD, SHA256
  Key Exchange Algorithms: ECDHE-RSA
  Groups: GROUP-SECP256R1, GROUP-SECP384R1, GROUP-SECP521R1, GROUP-X25519, GROUP-X448, GROUP-FFDHE2048, GROUP-FFDHE3072, GROUP-FFDHE4096, GROUP-FFDHE6144, GROUP-FFDHE8192
  PK-signatures: SIGN-RSA-SHA256, SIGN-RSA-PSS-SHA256, SIGN-RSA-PSS-RSAE-SHA256, SIGN-ECDSA-SHA256, SIGN-ECDSA-SECP256R1-SHA256, SIGN-EdDSA-Ed25519, SIGN-RSA-SHA384, SIGN-RSA-PSS-SHA384, SIGN-RSA-PSS-RSAE-SHA384, SIGN-ECDSA-SHA384, SIGN-ECDSA-SECP384R1-SHA384, SIGN-EdDSA-Ed448, SIGN-RSA-SHA512, SIGN-RSA-PSS-SHA512, SIGN-RSA-PSS-RSAE-SHA512, SIGN-ECDSA-SHA512, SIGN-ECDSA-SECP521R1-SHA512, SIGN-RSA-SHA1, SIGN-ECDSA-SHA1
AES128からAES256への切り替え

Zabbixはデータ用のビルトインデフォルトとしてAES128を使用しています。証明書を使用していて、OpenSSL 1.1.1 の
AES256 に切り替えたい場合を考えてみましょう。

これは、zabbix_server.confに各パラメータを追加することで実現可能です:

  TLSCAFile=/home/zabbix/ca.crt
  TLSCertFile=/home/zabbix/server.crt
  TLSKeyFile=/home/zabbix/server.key
  TLSCipherCert13=TLS_AES_256_GCM_SHA384
  TLSCipherCert=EECDH+aRSA+AES256:-SHA1:-SHA384
  TLSCipherPSK13=TLS_CHACHA20_POLY1305_SHA256
  TLSCipherPSK=kECDHEPSK+AES256:-SHA1
  TLSCipherAll13=TLS_AES_256_GCM_SHA384
  TLSCipherAll=EECDH+aRSA+AES256:-SHA1:-SHA384

証明書関連の暗号スイートのみが使用されますが、より広い相互運用性のために、安全性の低い暗号を含むデフォルト値を 避けるために、 TLSCipherPSK* パラメータも定義されています。PSK暗号スイートは、server / proxy で完全に無効に することはできません。

zabbix_agentd.conf でも:

  TLSConnect=cert
  TLSAccept=cert
  TLSCAFile=/home/zabbix/ca.crt
  TLSCertFile=/home/zabbix/agent.crt
  TLSKeyFile=/home/zabbix/agent.key
  TLSCipherCert13=TLS_AES_256_GCM_SHA384
  TLSCipherCert=EECDH+aRSA+AES256:-SHA1:-SHA384