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の接続では以下を使用できます:
- 暗号化なし(デフォルト)
- RSA証明書ベースの暗号化
- PSKベースの暗号化
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フロントエンドのデータ収集 → ホストのエージェント暗号化列に表示されます。例:
| 例 | ホストへの接続 | ホストからの許可された接続 | ホストからの拒否された接続 |
|---|---|---|---|
![]() |
暗号化なし | 暗号化なし | 暗号化、証明書およびPSKベースの暗号化 |
![]() |
暗号化、証明書ベース | 暗号化、証明書ベース | 暗号化なしおよびPSKベースの暗号化 |
![]() |
暗号化、PSKベース | 暗号化、PSKベース | 暗号化なしおよび証明書ベースの暗号化 |
![]() |
暗号化、PSKベース | 暗号化なしおよびPSKベースの暗号化 | 証明書ベースの暗号化 |
![]() |
暗号化、証明書ベース | 暗号化なし、PSKまたは証明書ベースの暗号化 | - |
接続はデフォルトで暗号化されていません。暗号化は各ホストおよびプロキシごとに個別に設定する必要があります。
zabbix_getとzabbix_senderの暗号化機能
zabbix_get と zabbix_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




