[comment]: # ({5b8f0943-822969ff})
# 15 暗号化

[comment]: # ({/5b8f0943-822969ff})

[comment]: # ({73039a5b-0b118c23})
#### 概要

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

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

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

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

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

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

[comment]: # ({/73039a5b-0b118c23})

[comment]: # ({8fd79214-bdc6b202})
#### 制限事項

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

[comment]: # ({/8fd79214-bdc6b202})

[comment]: # ({e2b185de-ba7ecc58})
#### 暗号化サポート付きで 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 を使用できず、証明書のみ使用できます。

:::notetip
Zabbix Webインターフェース向けの SSL の設定については、これらの[ベストプラクティス](/manual/best_practices/cryptography#setting-up-ssl-for-zabbix-frontend)を参照してください。
:::

ライブラリは、"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*）。

::: noteimportant
 事前共有鍵（PSK）を使用する予定がある場合は、PSK を使用する Zabbix コンポーネントで *GnuTLS* または *OpenSSL 1.1.0*（またはそれ以降）のライブラリを使用することを検討してください。*GnuTLS* および *OpenSSL 1.1.0* ライブラリは、[Perfect Forward Secrecy](https://en.wikipedia.org/wiki/Forward_secrecy#Perfect_forward_secrecy_.28PFS.29) を備えた PSK 暗号スイートをサポートしています。*OpenSSL* ライブラリの古いバージョン（1.0.1、1.0.2c）でも PSK はサポートされていますが、利用可能な PSK 暗号スイートには Perfect Forward Secrecy はありません。 
:::

[comment]: # ({/e2b185de-ba7ecc58})

[comment]: # ({0f96d146-2d0e2b80})
#### 接続の暗号化管理

Zabbixの接続では以下を使用できます:

-   暗号化なし（デフォルト）
-   [RSA証明書ベースの暗号化](/manual/encryption/using_certificates)
-   [PSKベースの暗号化](/manual/encryption/using_pre_shared_keys)

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](../../assets/en/manual/encryption/none_none.png)|暗号化なし|暗号化なし|暗号化、証明書およびPSKベースの暗号化|
|![cert\_cert.png](../../assets/en/manual/encryption/cert_cert.png)|暗号化、証明書ベース|暗号化、証明書ベース|暗号化なしおよびPSKベースの暗号化|
|![psk\_psk.png](../../assets/en/manual/encryption/psk_psk.png)|暗号化、PSKベース|暗号化、PSKベース|暗号化なしおよび証明書ベースの暗号化|
|![psk\_none\_psk.png](../../assets/en/manual/encryption/psk_none_psk.png)|暗号化、PSKベース|暗号化なしおよびPSKベースの暗号化|証明書ベースの暗号化|
|![cert\_all.png](../../assets/en/manual/encryption/cert_all.png)|暗号化、証明書ベース|暗号化なし、PSKまたは証明書ベースの暗号化|\-|

::: noteimportant
接続はデフォルトで暗号化されていません。暗号化は各ホストおよびプロキシごとに個別に設定する必要があります。
:::

[comment]: # ({/0f96d146-2d0e2b80})

[comment]: # ({ad15e6ff-ad15e6ff})
#### zabbix\_getとzabbix\_senderの暗号化機能

[zabbix\_get](/manpages/zabbix_get) と [zabbix\_sender](/manpages/zabbix_sender) manpages のマニュアルを参照してください。

[comment]: # ({/ad15e6ff-ad15e6ff})

[comment]: # ({6f67a86b-be2996e2})
#### 暗号スイート

デフォルトでは、暗号スイートはZabbixの起動時に内部的に設定されます。

GnuTLSおよびOpenSSLでは、ユーザー設定の暗号スイートもサポートされています。ユーザーは、
自身のセキュリティポリシーに従って暗号スイートを[設定](#userconfigured-ciphersuites)できます。
この機能の使用は任意です（組み込みのデフォルト暗号スイートも引き続き動作します）。

デフォルト設定でコンパイルされた暗号ライブラリでは、Zabbixの組み込みルールにより通常、
次の暗号スイートになります（優先度の高い順から低い順）:

|ライブラリ|証明書用暗号スイート|PSK暗号スイート|
|-------|------------------------|----------------|
|*GnuTLS 3.1.18*|TLS\_ECDHE\_RSA\_AES\_128\_GCM\_SHA256<br>TLS\_ECDHE\_RSA\_AES\_128\_CBC\_SHA256<br>TLS\_ECDHE\_RSA\_AES\_128\_CBC\_SHA1<br>TLS\_RSA\_AES\_128\_GCM\_SHA256<br>TLS\_RSA\_AES\_128\_CBC\_SHA256<br>TLS\_RSA\_AES\_128\_CBC\_SHA1|TLS\_ECDHE\_PSK\_AES\_128\_CBC\_SHA256<br>TLS\_ECDHE\_PSK\_AES\_128\_CBC\_SHA1<br>TLS\_PSK\_AES\_128\_GCM\_SHA256<br>TLS\_PSK\_AES\_128\_CBC\_SHA256<br>TLS\_PSK\_AES\_128\_CBC\_SHA1|
|*OpenSSL 1.0.2c*|ECDHE-RSA-AES128-GCM-SHA256<br>ECDHE-RSA-AES128-SHA256<br>ECDHE-RSA-AES128-SHA<br>AES128-GCM-SHA256<br>AES128-SHA256<br>AES128-SHA|PSK-AES128-CBC-SHA|
|*OpenSSL 1.1.0*|ECDHE-RSA-AES128-GCM-SHA256<br>ECDHE-RSA-AES128-SHA256<br>ECDHE-RSA-AES128-SHA<br>AES128-GCM-SHA256<br>AES128-CCM8<br>AES128-CCM<br>AES128-SHA256<br>AES128-SHA<br>|ECDHE-PSK-AES128-CBC-SHA256<br>ECDHE-PSK-AES128-CBC-SHA<br>PSK-AES128-GCM-SHA256<br>PSK-AES128-CCM8<br>PSK-AES128-CCM<br>PSK-AES128-CBC-SHA256<br>PSK-AES128-CBC-SHA|
|*OpenSSL 1.1.1d*|TLS\_AES\_256\_GCM\_SHA384<br>TLS\_CHACHA20\_POLY1305\_SHA256<br>TLS\_AES\_128\_GCM\_SHA256<br>ECDHE-RSA-AES128-GCM-SHA256<br>ECDHE-RSA-AES128-SHA256<br>ECDHE-RSA-AES128-SHA<br>AES128-GCM-SHA256<br>AES128-CCM8<br>AES128-CCM<br>AES128-SHA256<br>AES128-SHA|TLS\_CHACHA20\_POLY1305\_SHA256<br>TLS\_AES\_128\_GCM\_SHA256<br>ECDHE-PSK-AES128-CBC-SHA256<br>ECDHE-PSK-AES128-CBC-SHA<br>PSK-AES128-GCM-SHA256<br>PSK-AES128-CCM8<br>PSK-AES128-CCM<br>PSK-AES128-CBC-SHA256<br>PSK-AES128-CBC-SHA|

[comment]: # ({/6f67a86b-be2996e2})

[comment]: # ({8731bb52-b5e04652})
#### ユーザー設定の暗号スイート

組み込みの暗号スイート選択基準は、ユーザー設定の暗号スイートで上書きできます。

::: noteimportant
ユーザー設定の暗号スイートは、TLS暗号スイート、そのセキュリティおよびミスの影響を理解し、TLSのトラブルシューティングに慣れている上級ユーザー向けの機能です。
:::

組み込みの暗号スイート選択基準は、以下のパラメータを使用して上書きできます。

|上書き範囲|パラメータ|値|説明|
|--|--|------|------|
|証明書用の暗号スイート選択|TLSCipherCert13|TLS 1.3プロトコル用の有効なOpenSSL 1.1.1 [cipher strings](https://www.openssl.org/docs/man1.1.1/man1/ciphers.html)（値はOpenSSL関数`SSL_CTX_set_ciphersuites()`に渡されます）。|TLS 1.3用の証明書ベースの暗号スイート選択基準<br><br>OpenSSL 1.1.1以降のみ。|
|^|TLSCipherCert|TLS 1.2用の有効なOpenSSL [cipher strings](https://www.openssl.org/docs/man1.1.1/man1/ciphers.html)または有効なGnuTLS [priority strings](https://gnutls.org/manual/html_node/Priority-Strings.html)。値はそれぞれ`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](https://www.openssl.org/docs/man1.1.1/man1/ciphers.html)（値はOpenSSL関数`SSL_CTX_set_ciphersuites()`に渡されます）。|TLS 1.3用のPSKベースの暗号スイート選択基準<br><br>OpenSSL 1.1.1以降のみ。|
|^|TLSCipherPSK|TLS 1.2用の有効なOpenSSL [cipher strings](https://www.openssl.org/docs/man1.1.1/man1/ciphers.html)または有効なGnuTLS [priority strings](https://gnutls.org/manual/html_node/Priority-Strings.html)。値はそれぞれ`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](https://www.openssl.org/docs/man1.1.1/man1/ciphers.html)（値はOpenSSL関数`SSL_CTX_set_ciphersuites()`に渡されます）。|TLS 1.3用の暗号スイート選択基準<br><br>OpenSSL 1.1.1以降のみ。|
|^|TLSCipherAll|TLS 1.2用の有効なOpenSSL [cipher strings](https://www.openssl.org/docs/man1.1.1/man1/ciphers.html)または有効なGnuTLS [priority strings](https://gnutls.org/manual/html_node/Priority-Strings.html)。値はそれぞれ`SSL_CTX_set_cipher_list()`または`gnutls_priority_init()`関数に渡されます。|TLS 1.2/1.3（GnuTLS）、TLS 1.2（OpenSSL）用の暗号スイート選択基準|

[zabbix\_get](/manpages/zabbix_get)および
[zabbix\_sender](/manpages/zabbix_sender)ユーティリティで暗号スイート選択を上書きするには、コマンドラインパラメータを使用します。

-   `--tls-cipher13`
-   `--tls-cipher`

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

暗号ライブラリでTLSCipher\*値の設定に失敗した場合、サーバー、プロキシ、またはエージェントは起動せず、エラーが記録されます。

各パラメータがいつ適用されるかを理解することが重要です。

[comment]: # ({/8731bb52-b5e04652})

[comment]: # ({ca5e66e4-a74c28c7})
##### 外部接続

最も単純なケースは外部接続です:

- 証明書を使用した外部接続の場合は、TLSCipherCert13 または TLSCipherCert を使用します
- PSK を使用した外部接続の場合は、TLSCipherPSK13 または TLSCipherPSK を使用します
- zabbix_get および zabbix_sender ユーティリティの場合、コマンドラインパラメータ `--tls-cipher13` または `--tls-cipher` を使用できます（暗号化は `--tls-connect` パラメータで明確に指定されます）

[comment]: # ({/ca5e66e4-a74c28c7})

[comment]: # ({29364114-3edf3b2b})
##### 受信接続

受信接続では、ルールがコンポーネントおよび設定ごとに固有であるため、少し複雑になります。

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 暗号スイートのみを許可する](#testing-cipher-strings-and-allowing-only-pfs-ciphersuites)
-   [AES128 から AES256 への切り替え](#switching-from-aes128-to-aes256)

[comment]: # ({/29364114-3edf3b2b})

[comment]: # ({52b821c4-bfb4ef88})
##### 暗号文字列のテストと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付きの暗号スイートのみを許可してみましょう。

::: noteimportant
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

[comment]: # ({/52b821c4-bfb4ef88})

[comment]: # ({a549cda7-a549cda7})
##### AES128からAES256への切り替え

Zabbixはデータ用のビルトインデフォルトとしてAES128を使用しています。証明書を使用していて、OpenSSL 1.1.1 の <br>
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

::: noteimportant
証明書関連の暗号スイートのみが使用されますが、より広い相互運用性のために、安全性の低い暗号を含むデフォルト値を
避けるために、 `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

[comment]: # ({/a549cda7-a549cda7})
