15 暗号化

概要

Zabbixは、暗号化ライブラリに応じて、トランスポート・レイヤー・セキュリティ(TLS)プロトコルv1.2および1.3を使用したZabbixコンポーネント間の暗号化通信をサポートしています。証明書ベースおよび事前共有鍵ベースの暗号化がサポートされています。

暗号化は以下の接続で設定できます:

  • Zabbixサーバー、Zabbixプロキシ、Zabbixエージェント、Zabbix Webサービス、zabbix_senderおよびzabbix_getユーティリティ間
  • Zabbixフロントエンドおよびサーバー/プロキシからZabbixデータベースへの接続
  • ZabbixフロントエンドとZabbixサーバー間

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

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

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

制限事項

  • 秘密鍵は、起動時にZabbixコンポーネントが読み取れるファイルに平文で保存されます。
  • 事前共有鍵はZabbixフロントエンドで入力され、Zabbixデータベースに平文で保存されます。
  • 組み込みの暗号化は、Zabbixフロントエンドを実行している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フロントエンドでは、TLSConnectに相当するものがデータ収集 → ホスト → <あるホスト> → 暗号化タブのホストへの接続フィールド、および管理 → プロキシ → <あるプロキシ> → 暗号化タブのプロキシへの接続フィールドです。接続のために設定された暗号化タイプで失敗した場合、他の暗号化タイプは試行されません。

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

通常、着信接続には1種類の暗号化のみを設定します。しかし、例えば暗号化なしから証明書ベースに切り替えるなど、ダウンタイムを最小限に抑え、ロールバックの可能性を残したまま暗号化タイプを切り替えたい場合があります。そのためには:

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

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

ほとんどの場合、着信および発信接続の両方で同じ暗号化タイプ、または暗号化なしを設定します。しかし、技術的には非対称に設定することも可能です。例えば、着信は証明書ベース、発信はPSKベースの暗号化などです。

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

ホストへの接続 ホストからの許可された接続 ホストからの拒否された接続
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の組み込みルールにより通常、 次の暗号スイートになります(優先度の高い順から低い順):

ライブラリ 証明書用暗号スイート PSK暗号スイート
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

仕組みが理解できたので、Zabbix以外でもopensslコマンドで暗号スイートの選択をテストできます。 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