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

[comment]: # ({/822969ff-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]: # ({bac66f33-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;
        новые функции API `tls_*()`, специфичные для LibreSSL, не используются.
        Компоненты Zabbix, скомпилированные с LibreSSL, не смогут использовать
        PSK, могут использоваться только сертификаты.

:::notetip
Вы можете найти более подробную информацию о настройке SSL для веб-интерфейса Zabbix по ссылке на [наилучшие практики](/manual/best_practices/security/cryptography#настройка-ssl-для-веб-интерфейса-zabbix).
:::

Библиотека выбирается при помощи соответствующей опции в скрипте «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
Если вы планируете использовать общие ключи (pre-shared keys, PSK), рассмотрите возможность использования библиотек *GnuTLS* или *OpenSSL 1.1.0* (или новее) с компонентами Zabbix, использующими PSK. Библиотеки *GnuTLS* и *OpenSSL 1.1.0* поддерживают наборы шифров PSK с [совершенной прямой секретностью (Perfect forward secrecy)](https://ru.wikipedia.org/wiki/Perfect_forward_secrecy). Более старые версии библиотеки *OpenSSL* (1.0.1, 1.0.2c) также поддерживают PSK, но доступные наборы шифров PSK не обеспечивают совершенную прямую секретность.
:::

[comment]: # ({/bac66f33-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]: # ({52b821c4-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 в соответствии с вашей средой.

Если вы не используете сертификаты, а только общий ключ, тестовый файл может быть проще:

      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 использует только шифрование на основе общего ключа и не использует сертификаты, то достаточно только одной строки:

      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]: # ({/52b821c4-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})
