[comment]: # translation:outdated

[comment]: # ({5b8f0943-822969ff})
# 15 Шифрование

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

[comment]: # ({73039a5b-0b118c23})
#### Обзор

Zabbix поддерживает зашифрованные коммуникации между компонентами Zabbix с использованием
протокола Transport Layer Security (TLS) версии 1.2 и 1.3 (в зависимости от
криптографической библиотеки). Поддерживается шифрование на основе сертификатов и на основе предварительно
общего ключа.

Шифрование можно настроить для соединений:

-   Между сервером Zabbix, прокси Zabbix, агентом Zabbix, веб-службой Zabbix, утилитами zabbix\_sender
    и zabbix\_get
-   С базой данных Zabbix [из веб-интерфейса Zabbix и
    server/proxy](/manual/appendix/install/db_encrypt)
-   Между веб-интерфейсом Zabbix и сервером Zabbix

Шифрование является необязательным и настраивается для отдельных компонентов:

-   Некоторые прокси и агенты можно настроить на использование шифрования на основе сертификатов
    с сервером, тогда как другие могут использовать шифрование на основе предварительно
    общего ключа, а еще другие продолжат работать без шифрования
    (как и раньше).
-   Сервер (прокси) может использовать разные конфигурации шифрования для
    разных узлов сети.

Программы-демоны Zabbix используют один прослушивающий порт для зашифрованных и
незашифрованных входящих соединений. Добавление шифрования не требует
открытия новых портов на межсетевых экранах.

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

[comment]: # ({8fd79214-bdc6b202})
#### Ограничения

-   Закрытые ключи хранятся в виде обычного текста в файлах, доступных для чтения компонентам Zabbix во время запуска.
-   Предварительно общие ключи вводятся во веб-интерфейсе Zabbix и хранятся в базе данных Zabbix в виде обычного текста.
-   Встроенное шифрование не защищает обмен данными между веб-сервером, на котором работает веб-интерфейс Zabbix, и веб-браузером пользователя.
-   В настоящее время каждое зашифрованное соединение открывается с полным TLS-handshake, кэширование сеансов и tickets не реализованы.
-   Добавление шифрования увеличивает время выполнения проверок элементов данных и действий в зависимости от задержки сети:
    -   Например, если задержка пакета составляет 100 мс, то открытие TCP-соединения и отправка незашифрованного запроса занимает около 200 мс. При шифровании для установления TLS-соединения добавляется около 1000 мс.
    -   Возможно, потребуется увеличить значения тайм-аутов, иначе некоторые элементы данных и действия, выполняющие удаленные сценарии на агентах, могут работать с незашифрованными соединениями, но завершаться по тайм-ауту при использовании шифрования.
-   Шифрование не поддерживается [сетевым обнаружением](/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;
        новые специфичные для LibreSSL функции API `tls_*()` не используются.
        Компоненты Zabbix, собранные с LibreSSL, не смогут использовать
        PSK, можно использовать только сертификаты.

:::notetip
Подробнее о настройке SSL для веб-интерфейса Zabbix можно узнать, обратившись к этим [рекомендациям](/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),
рекомендуется использовать библиотеки *GnuTLS* или *OpenSSL 1.1.0* (или новее) в
компонентах Zabbix, использующих PSK. Библиотеки *GnuTLS* и *OpenSSL 1.1.0*
поддерживают наборы шифров PSK с [Perfect Forward
Secrecy](https://en.wikipedia.org/wiki/Forward_secrecy#Perfect_forward_secrecy_.28PFS.29).
Более старые версии библиотеки *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:

-   TLSConnect — указывает, какое шифрование использовать для исходящих соединений (unencrypted, PSK или certificate);
-   TLSAccept — указывает, какие виды соединений разрешены для входящих соединений (unencrypted, PSK или certificate). Можно указать одно или несколько значений.

`TLSConnect` используется в файлах конфигурации Zabbix прокси (в активном режиме, задаёт только подключения к серверу) и Zabbix агентов (для активных проверок). В веб-интерфейсе Zabbix эквивалентом параметру TLSConnect является поле *Подключения к узлу сети* на вкладке *Сбор данных → Узлы сети → <какой-то узел сети> → Шифрование (Data collection → Hosts → <somehost> → Encryption)* и поле *Подключения к прокси (Connections to proxy)* на вкладке *Администрирование → Прокси → <какой-то прокси> → Шифрование (Administration → Proxies → <some proxy> → Encryption)*. Если настроенный тип шифрования для соединения завершится неудачей, другие типы шифрования не будут опробованы        

`TLSAccept` используется в файлах конфигурации Zabbix прокси (в пассивном режиме, задаёт только соединения от сервера) и Zabbix агента (для пассивных проверок). В веб-интерфейсе Zabbix эквивалентом параметра TLSAccept является поле *Соединения с узла сети (Connections from host)* на вкладке *Сбор данных → Узлы сети → <какой-то узел сети> → Шифрование (Data collection → Hosts → <somehost> → Encryption)* и поля *Соединения с прокси (Connections from proxy)* на вкладке *Администрирование → Прокси → <какой-то прокси> → Шифрование (Administration → Proxies → <some proxy> → Encryption)*.

Как правило, вы настраиваете только один тип шифрования для входящих подключений. Но вы можете захотеть переключить режим шифрования, например, с незашированного на основанный на сертификатах с минимальным временем простоя и с возможностью отката. Чтобы достичь этого:

-   Выставьте `TLSAccept=unencrypted,cert` в файле конфигурации агента Zabbix и перезапустите агента.
-   Проверьте подключение от zabbix\_get к агенту с использованием сертификата. Если подключение работает, вы можете перенастроить шифрование у этого агента в веб-интерфейсе Zabbix на вкладке *Сбор данных → Узлы сети → <какой-то узел сети> → Шифрование (Data collection → Hosts → <some host> →Encryption)*, переключив настройку *Подключения к узлу сети (Connections to host)* на «Сертификат (Certificate)». 
-   Когда кэш конфигурации сервера обновится (и обновится конфигурация прокси, если узел сети наблюдается через прокси), тогда подключения к этому агенту будут зашифрованными.
-   Если всё работает как ожидается, вы можете задать `TLSAccept=cert` в файле конфигурации агента и перезапустить Zabbix агента. Теперь агент будет принимать только зашифрованные подключения на основе сертификатов. Незашифрованные и основанные на PSK подключения будут отклонены.

Шифрование на сервере и прокси работает аналогичным образом. Если в веб-интерфейсе Zabbix в настройке узла сети *Соединения с узла сети (Connections from host)* задано равным «Сертификат (Certificate)», тогда от агента (активные проверки) и zabbix\_sender (траппер элементы данных) будут приниматься только зашифрованные соединения на основе сертификатов.

Скорее всего, вы настроите входящие и исходящие соединения на использование одного типа шифрования или без шифрования вовсе. Но, технически, имеется возможность настроить шифрование асимметрично, например, шифрование на основе сертификатов для входящих подключений и на основе PSK для исходящих подключений.

Настройки шифрования по каждому узлу сети отображаются в веб-интерфейсе Zabbix *Сбор данных →Узлы сети (Data collection → Hosts)*, в столбце *Шифрование агента (Agent encryption)*. Примеры отображения настроек:

|Пример|Подключения К узлу сети|Разрешённые подключения ОТ узла сети|Отклонённые подключения С узла сети|
|-------|-------------------|-----------------------------|------------------------------|
|![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) по использованию этих утилит при наличии шифрования.

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

[comment]: # ({6f67a86b-be2996e2})
#### Алгоритмы шифрования

Алгоритмы по умолчанию настраиваются внутри в процессе запуска Zabbix.

Также поддерживаются и заданные пользователем алгоритмы шифрования для GnuTLS и OpenSSL. Пользователи могут 
[настраивать](#алгоритмы-шифрования-заданные-пользователем) алгоритмы в соответствии со своими политиками безопасности. Использование этой возможности опционально (встроенные алгоритмы по умолчанию всё ещё работают).

Для криптобиблиотек, скомпилированных с настройками по умолчанию, встроенные в 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|Корректные [строки шифров](https://www.openssl.org/docs/man1.1.1/man1/ciphers.html) OpenSSL 1.1.1 для протокола TLS 1.3 (их значения передаются функции OpenSSL `SSL_CTX_set_ciphersuites()`).|Критерии выбора алгоритмов шифрования при использовании сертификатов для TLS 1.3.<br><br>Только OpenSSL 1.1.1 или новее.|
|^|TLSCipherCert|Корректные [строки шифров](https://www.openssl.org/docs/man1.1.1/man1/ciphers.html) OpenSSL для TLS 1.2 или корректные [строки приоритетов](https://gnutls.org/manual/html_node/Priority-Strings.html) GnuTLS. Их значения передаются функциям `SSL_CTX_set_cipher_list()` или `gnutls_priority_init()`, соответственно.|Критерии выбора алгоритмов шифрования при использовании сертификатов для TLS 1.2/1.3 (GnuTLS), TLS 1.2 (OpenSSL).|
|Выбор алгоритмов шифрования для PSK|TLSCipherPSK13|Корректные [строки шифров](https://www.openssl.org/docs/man1.1.1/man1/ciphers.html) OpenSSL 1.1.1 для протокола TLS 1.3 (их значения передаются функции OpenSSL `SSL_CTX_set_ciphersuites()`).|Критерии выбора алгоритмов шифрования при использовании PSK для TLS 1.3<br><br>Только OpenSSL 1.1.1 или новее.|
|^|TLSCipherPSK|Корректные [строки шифров](https://www.openssl.org/docs/man1.1.1/man1/ciphers.html) OpenSSL для TLS 1.2 или корректные [строки приоритетов](https://gnutls.org/manual/html_node/Priority-Strings.html) GnuTLS. Их значения передаются функциям `SSL_CTX_set_cipher_list()` или `gnutls_priority_init()`, соответственно.|Критерии выбора алгоритмов шифрования при использовании PSK для TLS 1.2/1.3 (GnuTLS), TLS 1.2 (OpenSSL).|
|Комбинированный список алгоритмов шифрования для сертификатов и PSK|TLSCipherAll13|Корректные [строки шифров](https://www.openssl.org/docs/man1.1.1/man1/ciphers.html) OpenSSL 1.1.1 для протокола TLS 1.3 (их значения передаются функции OpenSSL `SSL_CTX_set_ciphersuites()`).|Критерии выбора алгоритмов шифрования для TLS 1.3<br><br>только OpenSSL 1.1.1 или новее.|
|^|TLSCipherAll|Корректные [строки шифров](https://www.openssl.org/docs/man1.1.1/man1/ciphers.html) OpenSSL для TLS 1.2 или корректные [строки приоритетов](https://gnutls.org/manual/html_node/Priority-Strings.html) GnuTLS. Их значения передаются функциям `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 **агента**:

|Настройка соединений агента|Настройка шифров|
|----------------------|--------------------|
|TLSConnect=cert|TLSCipherCert, TLSCipherCert13|
|TLSConnect=psk|TLSCipherPSK, TLSCipherPSK13|
|TLSAccept=cert|TLSCipherCert, TLSCipherCert13|
|TLSAccept=psk|TLSCipherPSK, TLSCipherPSK13|
|TLSAccept=cert,psk|TLSCipherAll, TLSCipherAll13|

Для Zabbix **сервера** и **прокси**:

|Настройка соединений|Настройка шифров|
|----------------|--------------------|
|Исходящие соединения, используя PSK|TLSCipherPSK, TLSCipherPSK13|
|Исходящие соединения, используя сертификаты|TLSCipherAll, TLSCipherAll13|
|Входящие соединения, используя PSK, если у сервера нет сертификата|TLSCipherPSK, TLSCipherPSK13|
|Входящие соединения, используя PSK, если у сервера есть сертификат|TLSCipherAll, TLSCipherAll13|

В двух таблицах выше можно увидеть некоторые шаблоны:

-   TLSCipherAll и TLSCipherAll13 могут быть указаны, только если используется комбинированный список шифров на основе сертификатов **и** на основе PSK. Есть два случая, когда это имеет место: сервер (прокси) с настроенным сертификатом (шифры PSK всегда настраиваются на сервере и прокси, если криптобиблиотека поддерживает PSK), агент настраивается на приём как на основе сертификатов, так и PSK;
-   в остальных случаях достаточно TLSCipherCert\* и/или TLSCipherPSK\*.

Следующие таблицы показывают встроенные по умолчанию значения `TLSCipher*`. Они могут являться хорошей отправной точкой для ваших собственных кастомизированных значений.

|Параметр|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|

|Параметр|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](#тестирование-строк-шифра-и-разрешение-только-алгоритмов-pfs)
-   [Переключение от AES128 на AES256](#переключение-с-aes128-на-aes256)

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

[comment]: # ({df419066-bfb4ef88})
##### Проверка строк шифров и разрешение только наборов шифров PFS

Чтобы увидеть, какие наборы шифров были выбраны, нужно задать
`DebugLevel=4` в файле конфигурации или использовать опцию `-vv` для
zabbix\_sender.

Может потребоваться некоторое экспериментирование с параметрами
`TLSCipher*`, прежде чем вы получите нужные наборы шифров. Неудобно
перезапускать сервер, прокси или агент Zabbix несколько раз только ради
настройки параметров `TLSCipher*`. Более удобные варианты — использовать
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

Здесь вы видите наборы шифров, выбранные по умолчанию. Эти значения по
умолчанию выбраны так, чтобы обеспечить совместимость с агентами Zabbix,
работающими в системах со старыми версиями OpenSSL (начиная с 1.0.1).

В более новых системах можно повысить уровень безопасности, разрешив
только несколько наборов шифров, например только наборы шифров с PFS
(Perfect Forward Secrecy). Попробуем разрешить только наборы шифров с PFS
с помощью параметров `TLSCipher*`.

::: noteimportant
Результат не будет совместим с системами,
использующими OpenSSL 1.0.1 и 1.0.2, если используется PSK. Шифрование
на основе сертификатов должно работать.
:::

Добавьте две строки в файл конфигурации `test.conf`:

      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, может потребоваться добавить до трех
параметров

      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 и нет
сертификатов, тогда нужен только один параметр:

      TLSCipherPSK=kECDHEPSK+AES128

Теперь, когда вы понимаете, как это работает, вы можете проверить выбор
набора шифров даже вне Zabbix, с помощью команды `openssl`. Давайте проверим
все три значения параметров `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]: # ({/df419066-bfb4ef88})

[comment]: # ({a549cda7-a549cda7})
##### Переключение с AES128 на AES256

Zabbix использует AES128 как встроенное умолчание для данных. Предположим, что вы используете сертификаты и хотите переключиться на AES256, на OpenSSL 1.1.1.

Это может быть достигнуто путём добавления соответствующих параметров в `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 нельзя полностью отключить для сервера/прокси.
:::

И в `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})
