17. 暗号化
概要
Zabbix は、Transport Layer Security(TLS)プロトコル v.1.2 および 1.3(暗号ライブラリに依存)を使用して、Zabbix コンポーネント間の暗号化通信をサポートしています。証明書ベースおよび事前共有鍵ベースの暗号化がサポートされています。
暗号化は、次の接続に対して設定できます。
- Zabbix サーバー、Zabbix プロキシ、Zabbix エージェント、Zabbix Web サービス、zabbix_sender および zabbix_get ユーティリティ間
- Zabbix データベースへの接続 Zabbix Webインターフェース および サーバー/プロキシ から
- Zabbix Webインターフェース と 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 の接続では、以下を使用できます。
- 暗号化なし(デフォルト)
- RSA証明書ベースの 暗号化
- PSKベースの暗号化
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インターフェース の データ収集 → ホスト にある エージェントの暗号化 列に表示されます。例:
| 例 | ホストへの接続 | ホストからの許可される接続 | ホストからの拒否される接続 |
|---|---|---|---|
![]() |
暗号化なし | 暗号化なし | 暗号化された接続、証明書ベースの暗号化、および PSK ベースの暗号化 |
![]() |
暗号化、証明書ベース | 暗号化、証明書ベース | 暗号化なし、および PSK ベースの暗号化 |
![]() |
暗号化、PSK ベース | 暗号化、PSK ベース | 暗号化なし、および証明書ベースの暗号化 |
![]() |
暗号化、PSK ベース | 暗号化なし、および PSK ベースの暗号化 | 証明書ベースの暗号化 |
![]() |
暗号化、証明書ベース | 暗号化なし、PSK ベース、または証明書ベースの暗号化 | - |
接続はデフォルトで暗号化されません。暗号化は各ホストおよびプロキシごとに個別に設定する必要があります。
zabbix_getとzabbix_senderの暗号化機能
zabbix_get と zabbix_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




