- Шифрование и безопасность
- Шифрование
- Сборка Zabbix с поддержкой шифрования
- Управление шифрованием соединений
- zabbix_get и zabbix_sender с шифрованием
- Наборы шифров
- Пользовательские наборы шифров
- Устранение неполадок с шифрованием
- Устранение неполадок с типом подключения или проблемами с разрешениями
- Попытка использовать Zabbix sender, скомпилированный с поддержкой TLS, для отправки данных на сервер/прокси Zabbix, скомпилированные без поддержки TLS
- Одна сторона подключается с PSK, но другая сторона использует LibreSSL или собрана без поддержки шифрования
- Одна сторона подключается с PSK, но другая сторона использует OpenSSL с отключенной поддержкой PSK
Шифрование и безопасность
Шифрование
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 могут использовать:
- отсутствие шифрования (по умолчанию)
- шифрование на основе сертификата RSA
- шифрование на основе PSK
Для задания шифрования между компонентами 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 |
|---|---|---|---|
![]() |
Без шифрования | Без шифрования | Зашифрованные, зашифрованные на основе сертификата и PSK |
![]() |
Зашифрованные, на основе сертификата | Зашифрованные, на основе сертификата | Без шифрования и зашифрованные на основе PSK |
![]() |
Зашифрованные, на основе PSK | Зашифрованные, на основе PSK | Без шифрования и зашифрованные на основе сертификата |
![]() |
Зашифрованные, на основе PSK | Без шифрования и зашифрованные на основе PSK | Зашифрованные, на основе сертификата |
![]() |
Зашифрованные, на основе сертификата | Без шифрования, зашифрованные на основе 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"




