17. 暗号化

概要

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

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

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

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

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

制限事項

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

暗号化サポート付きでの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 の互換置き換えとしてサポートされています。 新しい LibreSSL 固有の tls_*() 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 に相当するものは、Data collection → Hosts → <some host> → Encryption タブの Connections to host フィールド、および Administration → Proxies → <some proxy> → Encryption タブの Connections to proxy フィールドです。設定された接続の暗号化方式で接続に失敗した場合、他の暗号化方式は試行されません。

TLSAccept は、Zabbix プロキシ の設定ファイル(パッシブモードでは、サーバー からの接続のみを指定)および Zabbix エージェント の設定ファイル(パッシブチェック用)で使用されます。Zabbix Webインターフェース では、TLSAccept に相当するものは、Data collection → Hosts → <some host> → Encryption タブの Connections from host フィールド、および Administration → Proxies → <some proxy> → Encryption タブの Connections from proxy フィールドです。

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

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

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

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

各 ホスト の暗号化設定は、Zabbix Webインターフェース の Data collection → Hosts にある Agent encryption 列に表示されます。例:

Example Connections to host Allowed connections from host Rejected connections from host
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

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

crypto ライブラリで 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.confzabbix_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