17. 暗号化
概要
Zabbix は、Transport Layer Security(TLS)プロトコル v.1.2 および 1.3(暗号ライブラリに依存)を使用して、Zabbix コンポーネント間の暗号化通信をサポートしています。証明書ベースおよび事前共有鍵ベースの暗号化がサポートされています。
暗号化は、次の接続に対して設定できます。
- Zabbix サーバー、Zabbix プロキシ、Zabbix エージェント、Zabbix web service、zabbix_sender および zabbix_get ユーティリティ間
- Zabbix Webインターフェース およびサーバー/プロキシから 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 の接続では、以下を使用できます。
- 暗号化なし(デフォルト)
- RSA証明書ベースの 暗号化
- PSKベースの暗号化
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 |
|---|---|---|---|
![]() |
暗号化なし | 暗号化なし | 暗号化あり、証明書ベースの暗号化、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
これらの新しいパラメータは任意です。パラメータが指定されていない場合は、 内部デフォルト値が使用されます。パラメータが定義されている場合、 空にすることはできません。
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.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




