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

#### Обзор

Zabbix поддерживает шифрование соединений между Zabbix сервером, Zabbix
прокси, Zabbix агентом, zabbix\_sender и zabbix\_get утилитами с
использованием Transport Layer Security (TLS) протокола v.1.2.
Шифрование поддерживается начиная с Zabbix 3.0. Поддерживаются
шифрования на основе сертификата и на основе pre-shared ключа.

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

Сервер (прокси) может использовать различные настройки с разными узлами
сети.

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

#### Ограничения

-   Приватные ключи хранятся в формате обычного текста в файлах, которые
    Zabbix компоненты считывают в процессе запуска.
-   Введенные pre-shared ключи в веб-интерфейсе Zabbix хранятся в базе
    данных Zabbix в виде обычного текста.
-   Встроенное шифрование не защищает коммуникации:

```{=html}
<!-- -->
```
       * между веб-сервером с веб-интерфейсом Zabbix и веб-браузером на строне пользователя,
       * между Zabbix веб-интерфейсом и Zabbix сервером,
       * между Zabbix сервером (прокси) и базой данных Zabbix.
    * В настоящее время каждое незашифрованное соединение открывается с полными TLS переговорами, кэширование сессий и билеты не реализованы.
    * Добавление шифрования увеличивает время проверок и действий, в зависимости от сетевых задержек.\\ Например, если пакет опаздывает на 100мс, тогда открытие TCP соединение и отправка незашифрованного запроса займет около 200мс.\\ При наличии шифрования на установку TLS соединения добавится около 1000 мс.\\ Возможно потребуется увеличить время ожидания, в противном случае некоторые элементы данных и действия, выполняющие удаленные скрипты на агентах смогут работать с незашифрованными соединениями,\\ но не смогут при шифрованном соединении (будет превышено время ожидания).

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

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

-   *mbed TLS* (ранее *PolarSSL*)(версия 1.3.9 или более новые 1.3.x).
    *mbed TLS* 2.x в настоящее время не поддерживается, это не простая
    замена ветки 1.3, Zabbix не скомпилируется с *mbed TLS* 2.x.
-   *GnuTLS* (с версии 3.1.18)
-   *OpenSSL* (с версии 1.0.1). *OpenSSL* 1.1.1 поддерживается начиная с
    версий Zabbix 3.0.23, 3.4.15.

Библиотека выбирается при помощи опции в скрипте "configure":

-   `--with-mbedtls[=DIR]`
-   `--with-gnutls[=DIR]`
-   `--with-openssl[=DIR]`

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

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

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

-   без шифрования (по умолчанию)
-   [RSA шифрование на основе
    сертификатов](/ru/manual/encryption/using_certificates)
-   [шифрование на основе
    PSK](/ru/manual/encryption/using_pre_shared_keys)

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

-   `TLSConnect`
-   `TLSAccept`

`TLSConnect` задает какое использовать шифрование и может принимать
[одно из 3]{.underline} значений (`unencrypted`, `PSK`, `certificate`).
`TLSConnect` используется в файлах конфигурации Zabbix прокси (в
активном режиме задает только подключения к серверу) и Zabbix agentd
(при активных проверках). В веб-интерфейсе Zabbix параметр `TLSConnect`
является эквивалентом поля *Подключения к узлу сети* с вкладки
*Настройка→Узлы сети→<какой-то узел сети>→Шифрование* и поля
*Подключения к прокси* с вкладки *Администрирование→Прокси→<какой-то
прокси>→Шифрование*. Если настроенный тип шифрования для соединения
завершится неудачей, другие типы шифрования не будут опробованы.

`TLSAccept` задает какой тип соединений разрешен при входящих
подключениях. Тип подключений: `unencrypted`, `PSK`, `certificate`.
Можно указать [одно или более]{.underline} значений. `TLSAccept`
используется в файлах конфигурации Zabbix прокси (в пассивном режиме
задает только соединения с сервера) и Zabbix agentd (при пассивных
проверках). В веб-интерфейсе Zabbix параметр `TLSAccept` является
эквивалентом поля *Соединения с узла сети* с вкладки *Настройка→Узлы
сети→<какой-то узел сети>→Шифрование* и поля "Соединения с прокси"
с вкладки *Администрирование→Прокси→<какой-то прокси>→Шифрование*.

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

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

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

Обзорные настройки шифрования отображаются в веб-интерфейсе Zabbix
*Настройка→Узлы сети* по каждому узлу сети по правой стороне, в колонке
*ШИФРОВАНИЕ АГЕНТА*. Примеры отображения настроек:

|Пример|Подключения К узлу сети|Разрешенные подключения ОТ узла сети|Отклоненные подключения С узла сети|
|------------|-------------------------------------------|--------------------------------------------------------------------|------------------------------------------------------------------|
|![none.png](../../assets/en/manual/encryption/none.png)|Незашифровано|Незашифровано|Зашифровано на основе сертификата и PSK|
|![cert.png](../../assets/en/manual/encryption/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|На основе сертификата|
|![all.png](../../assets/en/manual/encryption/all.png)|Зашифровано на основе сертификата|Незашифровано на основе PSK или зашифровано на основе сертификата|\-|

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

#### zabbix\_get и zabbix\_sender с шифрованием

Смотрите страницы помощи [zabbix\_get](/ru/manpages/zabbix_get) и
[zabbix\_sender](/ru/manpages/zabbix_sender) по использованию этих
утилит при наличии шифрования.

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

Алгоритмы конфигурируются внутри в процессе запуска Zabbix и зависят от
крипто библиотеки, в настоящее время алгоритмы нельзя настраивать
пользователями.

Настроенные алгоритмы шифрования по типу библитеки с более высокого
уровня к низкому уровню:

|Библиотека|Алгоритмы шифрования сертификатов|Алгоритмы шифрования PSK|
|--------------------|----------------------------------------------------------------|-------------------------------------------|
|*mbed TLS (PolarSSL) 1.3.9*|TLS-ECDHE-RSA-WITH-AES-128-GCM-SHA256<br>TLS-ECDHE-RSA-WITH-AES-128-CBC-SHA256<br>TLS-ECDHE-RSA-WITH-AES-128-CBC-SHA<br>TLS-RSA-WITH-AES-128-GCM-SHA256<br>TLS-RSA-WITH-AES-128-CBC-SHA256<br>TLS-RSA-WITH-AES-128-CBC-SHA|TLS-ECDHE-PSK-WITH-AES-128-CBC-SHA256<br>TLS-ECDHE-PSK-WITH-AES-128-CBC-SHA<br>TLS-PSK-WITH-AES-128-GCM-SHA256<br>TLS-PSK-WITH-AES-128-CBC-SHA256<br>TLS-PSK-WITH-AES-128-CBC-SHA|
|*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|

Алгоритмы шифрования при использовании сертификатов:

|   |   |   |   |
|---|---|---|---|
|<|TLS сервер|<|<|
|TLS клиент|*mbed TLS (PolarSSL)*|*GnuTLS*|*OpenSSL 1.0.2*|
|*mbed TLS (PolarSSL)*|TLS-ECDHE-RSA-WITH-AES-128-GCM-SHA256|TLS-ECDHE-RSA-WITH-AES-128-GCM-SHA256|TLS-ECDHE-RSA-WITH-AES-128-GCM-SHA256|
|*GnuTLS*|TLS-ECDHE-RSA-WITH-AES-128-GCM-SHA256|TLS-ECDHE-RSA-WITH-AES-128-GCM-SHA256|TLS-ECDHE-RSA-WITH-AES-128-GCM-SHA256|
|*OpenSSL 1.0.2*|TLS-ECDHE-RSA-WITH-AES-128-GCM-SHA256|TLS-ECDHE-RSA-WITH-AES-128-GCM-SHA256|TLS-ECDHE-RSA-WITH-AES-128-GCM-SHA256|

Алгоритмы шифрования при использовании PSK:

|   |   |   |   |
|---|---|---|---|
|<|TLS сервер|<|<|
|TLS клиент|*mbed TLS (PolarSSL)*|*GnuTLS*|*OpenSSL 1.0.2*|
|*mbed TLS (PolarSSL)*|TLS-ECDHE-PSK-WITH-AES-128-CBC-SHA256|TLS-ECDHE-PSK-WITH-AES-128-CBC-SHA256|TLS-PSK-WITH-AES-128-CBC-SHA|
|*GnuTLS*|TLS-ECDHE-PSK-WITH-AES-128-CBC-SHA256|TLS-ECDHE-PSK-WITH-AES-128-CBC-SHA256|TLS-PSK-WITH-AES-128-CBC-SHA|
|*OpenSSL 1.0.2*|TLS-PSK-WITH-AES-128-CBC-SHA|TLS-PSK-WITH-AES-128-CBC-SHA|TLS-PSK-WITH-AES-128-CBC-SHA|
