17. Шифрование

Обзор

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

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

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

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

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

Ограничения

  • Закрытые ключи хранятся в виде обычного текста в файлах, которые компоненты Zabbix считывают в процессе запуска.
  • Общие ключи вводятся в веб-интерфейсе Zabbix и хранятся в базе данных Zabbix в виде обычного текста.
  • Встроенное шифрование не защищает коммуникации:
    • между веб-сервером с веб-интерфейсом Zabbix и веб-браузером на строне пользователя
    • между веб-интерфейсом Zabbix и сервером Zabbix
  • В данный момент каждое шифрованное соединение начинается с полных TLS переговоров (TLS handshake), кэширование сессий и мандаты (tickets) не реализованы.
  • Добавление шифрования увеличивает время на проверки элементов данных и действия, в зависимости от сетевых задержек:
    • Например, если задержка пакета составляет 100мс, тогда открытие TCP соединения и отправка незашифрованного запроса займет около 200мс. При наличии шифрования добавится около 1000 мс на установление TLS соединения.
    • Возможно, потребуется увеличить время ожидания (тайм-ауты), в противном случае некоторые элементы данных и действия, выполняющие удалённые скрипты на агентах, смогут работать с незашифрованными соединениями, но не смогут при шифрованном соединении (будет превышено время ожидания).
  • Шифрование не поддерживается сетевым обнаружением. Проверки агентов Zabbix, выполняемые сетевым обнаружением, будут нешифрованными, и если агент Zabbix настроен отвергать нешифрованные соединения, то такие проверки не будут успешными.

Компиляция Zabbix с поддержкой шифрования

Для поддержки шифрования Zabbix должен быть скомпилирован и слинкован с одной из поддерживаемых криптобиблиотек:

  • GnuTLS - с версии 3.1.18
  • OpenSSL - версии 1.0.1, 1.0.2, 1.1.0, 1.1.1, 3.0.x. Обратите внимание, что 3.0.x поддерживается с версии Zabbix 6.0.4.
  • LibreSSL - протестировано с версиями 2.7.4, 2.8.2:
    • LibreSSL 2.6.x не поддерживается;
    • LibreSSL поддерживается как совместимая замена для OpenSSL; новые функции API tls_*(), специфичные для LibreSSL, не используются. Компоненты Zabbix, скомпилированные с LibreSSL, не смогут использовать PSK, могут использоваться только сертификаты.

Вы можете найти более подробную информацию о настройке 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).

Если вы планируете использовать общие ключи (pre-shared keys, PSK), рассмотрите возможность использования библиотек GnuTLS или OpenSSL 1.1.0 (или новее) с компонентами Zabbix, использующими PSK. Библиотеки GnuTLS и OpenSSL 1.1.0 поддерживают наборы шифров PSK с совершенной прямой секретностью (Perfect forward secrecy). Более старые версии библиотеки OpenSSL (1.0.1, 1.0.2c) также поддерживают PSK, но доступные наборы шифров PSK не обеспечивают совершенную прямую секретность.

Управление зашифрованными соединениями

Соединения в Zabbix могут использовать:

Имеется два важных параметра, которые используются, чтобы указать шифрование между компонентами Zabbix:

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

TLSConnect используется в файлах конфигурации Zabbix прокси (в активном режиме, задаёт только подключения к серверу) и Zabbix агентов (для активных проверок). В веб-интерфейсе Zabbix эквивалентом параметру TLSConnect является поле Подключения к узлу сети на вкладке Настройка → Узлы сети → <какой-то узел сети> → Шифрование и поле Подключения к прокси на вкладке Администрирование → Прокси → <какой-то прокси> → Шифрование. Если настроенный тип шифрования для соединения завершится неудачей, другие типы шифрования не будут опробованы

TLSAccept используется в файлах конфигурации Zabbix прокси (в пассивном режиме, задаёт только соединения от сервера) и Zabbix агента (для пассивных проверок). В веб-интерфейсе Zabbix эквивалентом параметра TLSAccept является поле Соединения с узла сети на вкладке Настройка → Узлы сети → <какой-то узел сети> → Шифрование и поля Соединения с прокси на вкладке Администрирование → Прокси → <какой-то прокси> → Шифрование.

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

  • Выставьте TLSAccept=unencrypted,cert в файле конфигурации агента Zabbix и перезапустите агента.
  • Проверьте подключение от zabbix_get к агенту с использованием сертификата. Если подключение работает, вы можете перенастроить шифрование у этого агента в веб-интерфейсе Zabbix на вкладке Настройка → Узлы сети → <какой-то узел сети> → Шифрование, переключив настройку Подключения к узлу сети на «Сертификат».
  • Когда кэш конфигурации сервера обновится (и обновится конфигурация прокси, если узел сети наблюдается через прокси), тогда подключения к этому агенту будут зашифрованными.
  • Если всё работает как ожидается, вы можете задать TLSAccept=cert в файле конфигурации агента и перезапустить Zabbix агента. Теперь агент будет принимать только зашифрованные подключения на основе сертификатов. Незашифрованные и основанные на PSK подключения будут отклонены.

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

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

Настройки шифрования по каждому узлу сети отображаются в веб-интерфейсе Zabbix Настройка→Узлы сети, в колонке Шифрование агента. Примеры отображения настроек:

Пример Подключения К узлу сети Разрешённые подключения ОТ узла сети Отклоненные подключения С узла сети
none_none.png Незашифровано Незашифровано Зашифровано, на основе сертификата и PSK
cert_cert.png Зашифровано на основе сертификата Зашифровано на основе сертификата Незашифровано и зашифровано на основе PSK
psk_psk.png Зашифровано на основе PSK Зашифровано на основе PSK Незашифровано и зашифровано на основе сертификата
psk_none_psk.png Зашифровано на основе PSK Незашифровано и зашифровано на основе PSK Зашифровано на основе сертификата
cert_all.png Зашифровано на основе сертификата Незашифровано, зашифровано на основе PSK или зашифровано на основе сертификата -

По умолчанию используются незашифрованные подключения. Шифрование необходимо настраивать по каждому узлу сети и прокси отдельно.

zabbix_get и zabbix_sender с шифрованием

Смотрите страницы помощи zabbix_get и zabbix_sender по использованию этих утилит при наличии шифрования.

Алгоритмы шифрования

Алгоритмы по умолчанию настраиваются внутри в процессе запуска Zabbix, и до версий Zabbix 4.0.19, 4.4.7 нет возможности их конфигурирования пользователями.

Начиная с версий Zabbix 4.0.19 и 4.4.7, поддерживаются также и заданные пользователем алгоритмы шифрования для 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 Корректные строки шифров OpenSSL 1.1.1 для протокола TLS 1.3 (их значения передаются функции OpenSSL SSL_CTX_set_ciphersuites()). Критерии выбора алгоритмов шифрования при использовании сертификатов для TLS 1.3.

Только OpenSSL 1.1.1 или новее.
TLSCipherCert Корректные строки шифров OpenSSL для TLS 1.2 или корректные строки приоритетов GnuTLS. Их значения передаются функциям SSL_CTX_set_cipher_list() или gnutls_priority_init(), соответственно. Критерии выбора алгоритмов шифрования при использовании сертификатов для TLS 1.2/1.3 (GnuTLS), TLS 1.2 (OpenSSL).
Выбор алгоритмов шифрования для PSK TLSCipherPSK13 Корректные строки шифров OpenSSL 1.1.1 для протокола TLS 1.3 (их значения передаются функции OpenSSL SSL_CTX_set_ciphersuites()). Критерии выбора алгоритмов шифрования при использовании PSK для TLS 1.3

Только OpenSSL 1.1.1 или новее.
TLSCipherPSK Корректные строки шифров OpenSSL для TLS 1.2 или корректные строки приоритетов GnuTLS. Их значения передаются функциям SSL_CTX_set_cipher_list() или gnutls_priority_init(), соответственно. Критерии выбора алгоритмов шифрования при использовании PSK для TLS 1.2/1.3 (GnuTLS), TLS 1.2 (OpenSSL).
Комбинированный список алгоритмов шифрования для сертификатов и PSK TLSCipherAll13 Корректные строки шифров OpenSSL 1.1.1 для протокола TLS 1.3 (их значения передаются функции OpenSSL SSL_CTX_set_ciphersuites()). Критерии выбора алгоритмов шифрования для TLS 1.3

только OpenSSL 1.1.1 или новее.
TLSCipherAll Корректные строки шифров OpenSSL для TLS 1.2 или корректные строки приоритетов GnuTLS. Их значения передаются функциям SSL_CTX_set_cipher_list() или gnutls_priority_init(), соответственно. Критерии выбора алгоритмов шифрования для TLS 1.2/1.3 (GnuTLS), TLS 1.2 (OpenSSL).

Чтобы переопределить выбор алгоритмов шифрования в утилиах zabbix_get и zabbix_sender - используйте параметры командной строки:

  • --tls-cipher13
  • --tls-cipher

Эти параметры опциональны. Если параметр не указан, используется внутреннее значение по умолчанию. Если параметр указан, он не может быть пустым.

Если настройка значения параметров TLSCipher* в криптобиблиотеке завершается неудачей, то сервер, прокси или агент не запустятся, а в журнал будет записано сообщение об ошибке.

Крайне важно понимать, когда применим каждый из параметров.

Исходящие соединения

Простейший случай - это исходящие соединения:

  • Для исходящих соединений с сертификатом - используйте TLSCipherCert13 или TLSCipherCert
  • Для исходящих соединений с PSK - используйте TLSCipherPSK13 или TLSCipherPSK
  • В случае утилит zabbix_get и zabbix_sender могут быть использованы параметры командной строки --tls-cipher13 и --tls-cipher (само шифрование недвусмысленно указывается параметром --tls-connect)
Входящие соединения

Нменого сложнее с входящими соединениями, т.к. правила зависят от компонентов и конфигурации.

Для Zabbix агента:

Настройка соединений агента Настройка шифров
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

Чтобы видеть выбираемые алгоритмы шифрования, вам нужно выставить в файле конфигурации параметр '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*.

Результатом будет несовместимость с системами, использующими 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
Переключение с 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

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