На странице

Шифрование и безопасность

Шифрование

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

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

  • Между сервером Zabbix, прокси Zabbix, агентом Zabbix, веб-службой Zabbix, утилитами zabbix_sender и zabbix_get
  • С базой данных Zabbix из веб-интерфейса Zabbix и server/proxy
  • Между веб-интерфейсом Zabbix и сервером Zabbix

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

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

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

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

Если вы планируете использовать предварительно разделяемые ключи (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 не обеспечивают Perfect Forward Secrecy.

Управление шифрованием соединений

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

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

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

TLSConnect используется в файлах конфигурации для прокси Zabbix (в активном режиме указывает только соединения с сервером) и агента Zabbix (для активных проверок). В веб-интерфейсе Zabbix эквивалентом TLSConnect является поле Connections to host на вкладке Encryption в Data collection > Hosts > <some host> и поле Connections to proxy на вкладке Encryption в Administration > Proxies> <some proxy>. Если настроенный тип шифрования для соединения не сработает, другие типы шифрования пробоваться не будут.

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

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

  • Установите 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 (элементы данных trapper) будут приниматься только зашифрованные соединения на основе сертификата.

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

Конфигурация шифрования для каждого узла сети отображается в веб-интерфейсе Zabbix в Data collection > Hosts в столбце Agent encryption. Например:

Example Connections to host Allowed connections from host Rejected connections from host
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.

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

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

Library Certificate ciphersuites PSK ciphersuites
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 cipher strings для протокола TLS 1.3 (их значения передаются функции OpenSSL SSL_CTX_set_ciphersuites()). Критерии выбора набора шифров на основе сертификатов для TLS 1.3

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

Только OpenSSL 1.1.1 или новее.
TLSCipherPSK Допустимые строки шифров OpenSSL cipher strings для TLS 1.2 или допустимые строки приоритетов GnuTLS priority strings. Их значения передаются функциям 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 cipher strings для протокола TLS 1.3 (их значения передаются функции OpenSSL SSL_CTX_set_ciphersuites()). Критерии выбора набора шифров для TLS 1.3

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

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

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

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

Если при задании значения 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 в соответствии с вашей средой.

Если вы не используете сертификаты, а только 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 используется только шифрование на основе 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
Переход с 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

Устранение неполадок с шифрованием

Общие рекомендации:

  • Начните с понимания того, какой компонент в проблемном случае выступает в роли TLS-клиента, а какой — в роли TLS-сервера.
    Сервер Zabbix, прокси и агенты, в зависимости от взаимодействия между ними, могут работать как TLS-серверы и клиенты.
    Например, сервер Zabbix, подключающийся к агенту для пассивной проверки, выступает как TLS-клиент. Агент в этом случае играет роль TLS-сервера.
    Агент Zabbix, запрашивающий список активных проверок у прокси, выступает как TLS-клиент. Прокси в этом случае играет роль TLS-сервера.
    Утилиты zabbix_get и zabbix_sender всегда выступают как TLS клиенты.
  • Zabbix использует взаимную аутентификацию.
    Каждая сторона проверяет другую и может отклонить соединение.
    Например, сервер Zabbix, подключающийся к агенту, может немедленно закрыть соединение, если сертификат агента недействителен. И наоборот — агент Zabbix, принимающий соединение от сервера, может закрыть соединение, если сервер не доверен агенту.
  • Изучите файлы журналов с обеих сторон — у TLS-клиента и у TLS-сервера.
    Сторона, которая отклоняет соединение, может точно указать причину отказа. Другая сторона часто сообщает довольно общее сообщение об ошибке (например, "Connection closed by peer", "connection was non-properly terminated").
  • Иногда неверно настроенное шифрование приводит к запутанным сообщениям об ошибках, которые никак не указывают на реальную причину.
    В подразделах ниже мы постараемся привести (далеко не исчерпывающий) набор сообщений и возможных причин, которые могут помочь при устранении неполадок.
    Обратите внимание, что разные криптографические библиотеки (OpenSSL, GnuTLS) часто выдают разные сообщения об ошибках в одних и тех же проблемных ситуациях.
    Иногда сообщения об ошибках зависят даже от конкретной комбинации криптографических библиотек на обеих сторонах.

Устранение неполадок с типом подключения или проблемами с разрешениями

Сервер настроен на подключение к агенту с использованием PSK, но агент принимает только незашифрованные соединения

В журнале сервера или прокси (с GnuTLS 3.3.16)

Не удалось получить значение от агента: zbx_tls_connect(): gnutls_handshake() failed: \
    -110 TLS-соединение было некорректно завершено.

В журнале сервера или прокси (с OpenSSL 1.0.2c)

Не удалось получить значение от агента: TCP-соединение успешно установлено, не удается установить TLS для [[127.0.0.1]:10050]: \
    Соединение закрыто удаленной стороной. Проверьте разрешенные типы соединений и права доступа
Одна сторона подключается с сертификатом, а другая принимает только PSK, или наоборот

В любом журнале (GnuTLS):

не удалось принять входящее соединение: от 127.0.0.1: zbx_tls_accept(): gnutls_handshake() failed:\
    -21 Не удалось согласовать поддерживаемый набор шифров.

В любом журнале (OpenSSL 1.0.2c):

не удалось принять входящее соединение: от 127.0.0.1: TLS handshake returned error code 1:\
    file .\ssl\s3_srvr.c line 1411: error:1408A0C1:SSL routines:ssl3_get_client_hello:no shared cipher:\
    TLS write fatal alert "handshake failure"

Попытка использовать Zabbix sender, скомпилированный с поддержкой TLS, для отправки данных на сервер/прокси Zabbix, скомпилированные без поддержки TLS

В журнале на стороне подключающегося:

Linux:

...In zbx_tls_init_child()
...Библиотека OpenSSL (версия OpenSSL 1.1.1  11 Sep 2018) инициализирована
...
...In zbx_tls_connect(): psk_identity:"PSK test sender"
...End of zbx_tls_connect():FAIL error:'connection closed by peer'
...send value error: TCP successful, cannot establish TLS to [[localhost]:10051]: connection closed by peer

Windows:

...Библиотека OpenSSL (версия OpenSSL 1.1.1a  20 Nov 2018) инициализирована
...
...In zbx_tls_connect(): psk_identity:"PSK test sender"
...zbx_psk_client_cb() requested PSK identity "PSK test sender"
...End of zbx_tls_connect():FAIL error:'SSL_connect() I/O error: [0x00000000] The operation completed successfully.'
...send value error: TCP successful, cannot establish TLS to [[192.168.1.2]:10051]: SSL_connect() I/O error: [0x00000000] The operation completed successfully.
В журнале принимающей стороны:
...не удалось принять входящее соединение: from 127.0.0.1: поддержка TLS не была включена при компиляции

Одна сторона подключается с PSK, но другая сторона использует LibreSSL или собрана без поддержки шифрования

LibreSSL не поддерживает PSK.

В журнале стороны, выполняющей подключение:

...TCP successful, cannot establish TLS to [[192.168.1.2]:10050]: SSL_connect() I/O error: [0] Success

В журнале принимающей стороны:

...failed to accept an incoming connection: from 192.168.1.2: support for PSK was not compiled in

В веб-интерфейсе Zabbix:

Get value from agent failed: TCP successful, cannot establish TLS to [[192.168.1.2]:10050]: SSL_connect() I/O error: [0] Success

Одна сторона подключается с PSK, но другая сторона использует OpenSSL с отключенной поддержкой PSK

В журнале стороны, выполняющей подключение:

...TCP успешно, не удается установить TLS к [[192.168.1.2]:10050]: SSL_connect() установил код результата SSL_ERROR_SSL: file ../ssl/record/rec_layer_s3.c line 1536: error:14094410:SSL routines:ssl3_read_bytes:sslv3 alert handshake failure: SSL alert number 40: TLS read fatal alert "handshake failure"

В журнале стороны, принимающей соединение:

...не удалось принять входящее соединение: from 192.168.1.2: TLS handshake установил код результата 1: file ssl/statem/statem_srvr.c line 1422: error:1417A0C1:SSL routines:tls_post_process_client_hello:no shared cipher: TLS write fatal alert "handshake failure"