Шифрование с использованием предварительно общих ключей

Обзор

Каждый предварительно установленный ключ (PSK) в Zabbix фактически представляет собой пару:

  • несекретная строка идентификатора PSK;
  • секретное строковое значение PSK.

Строка идентификатора PSK представляет собой непустую строку в кодировке UTF-8. Например: "PSK ID 001 Zabbix agentd". Это уникальное имя, по которому компоненты Zabbix обращаются к этому конкретному PSK. Не указывайте конфиденциальную информацию в строке идентификатора PSK — она передается по сети в незашифрованном виде.

Значение PSK — это строка из шестнадцатеричных цифр, которую сложно угадать, например: e560cb0d918d26d31b4f642181f5f570ad89a390931102e5391d08327ba434e9.

Никогда не используйте приведенные в документации примеры значений PSK в производственных средах. Вместо этого сгенерируйте уникальный криптографически стойкий PSK.

Ограничения размера

В Zabbix существуют ограничения размера идентификатора PSK и значения PSK; в некоторых случаях криптографическая библиотека может иметь более низкое ограничение:

Компонент Максимальный размер идентификатора PSK Минимальный размер значения PSK Максимальный размер значения PSK
Zabbix 128 символов UTF-8 128 бит (PSK размером 16 байт, вводится как 32 шестнадцатеричных цифры) 2048 бит (PSK размером 256 байт, вводится как 512 шестнадцатеричных цифр)
GnuTLS 128 байт (может включать символы UTF-8) - 2048 бит (PSK размером 256 байт, вводится как 512 шестнадцатеричных цифр)
OpenSSL 1.0.x, 1.1.0 127 байт (может включать символы UTF-8) - 2048 бит (PSK размером 256 байт, вводится как 512 шестнадцатеричных цифр)
OpenSSL 1.1.1 127 байт (может включать символы UTF-8) - 512 бит (PSK размером 64 байта, вводится как 128 шестнадцатеричных цифр)
OpenSSL 1.1.1a и более поздние версии 127 байт (может включать символы UTF-8) - 2048 бит (PSK размером 256 байт, вводится как 512 шестнадцатеричных цифр)

Веб-интерфейс Zabbix позволяет настроить строку идентификатора PSK длиной до 128 символов и PSK длиной до 2048 бит независимо от используемых криптографических библиотек.
Если некоторые компоненты Zabbix поддерживают более низкие ограничения, пользователь должен самостоятельно настроить идентификатор PSK и значение PSK с допустимой для этих компонентов длиной.
Превышение ограничений размера приводит к сбоям связи между компонентами Zabbix.

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

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

Генерация PSK

Например, PSK длиной 256 бит (32 байта) можно сгенерировать с помощью следующих команд:

  • с помощью OpenSSL:
$ openssl rand -hex 32
af8ced32dfe8714e548694e2d29e1a14ba6fa13f216cb35c19d0feb1084b0429
  • с помощью GnuTLS:
$ psktool -u psk_identity -p database.psk -s 32
Generating a random key for user 'psk_identity'
Key stored to database.psk

$ cat database.psk 
psk_identity:9b8eafedfaae00cece62e85d5f4792c7d9c9bcc851b23216a1d300311cc4f7cb

Обратите внимание, что команда "psktool" выше создает файл базы данных с идентификатором PSK и соответствующим ему PSK. Zabbix ожидает, что файл PSK будет содержать только PSK, поэтому идентификатор и двоеточие (':') необходимо удалить из файла.

Настройка PSK для взаимодействия сервера и агента (пример)

На узле сети с агентом запишите сгенерированное выше значение PSK в файл, например /home/zabbix/zabbix_agentd.psk. В первой строке файла должно содержаться значение PSK.

Настройте права доступа к файлу PSK: он должен быть доступен для чтения только пользователю Zabbix.

Измените параметры TLS в файле конфигурации агента Zabbix (zabbix_agentd.conf). Например, задайте:

TLSConnect=psk
TLSAccept=psk
TLSPSKFile=/home/zabbix/zabbix_agentd.psk
TLSPSKIdentity=PSK 001

Агент будет подключаться к серверу (активные проверки) и принимать от сервера и zabbix_get только подключения с использованием PSK. Идентификатором PSK будет значение "PSK 001".

Перезапустите агент. Теперь можно проверить подключение с помощью zabbix_get, например:

zabbix_get -s 127.0.0.1 -k "system.cpu.load[all,avg1]" --tls-connect=psk --tls-psk-identity="PSK 001" --tls-psk-file=/home/zabbix/zabbix_agentd.psk

(Чтобы свести время простоя к минимуму, см. информацию об изменении типа подключения в разделе Управление шифрованием подключений).

Настройте шифрование PSK для этого агента в веб-интерфейсе Zabbix:

  1. Перейдите в раздел: Сбор данных > Узлы сети.
  2. Выберите узел сети и перейдите на вкладку Шифрование.
  3. Настройте параметры шифрования PSK.

Пример:

psk\_config.png

Все обязательные поля ввода отмечены красной звездочкой.

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

Настройка PSK для обмена данными между сервером и активным прокси (пример)

На прокси запишите значение PSK в файл, например /home/zabbix/zabbix_proxy.psk. В первой строке файла должно содержаться значение PSK, например:

e560cb0d918d26d31b4f642181f5f570ad89a390931102e5391d08327ba434e9

Настройте права доступа к файлу PSK: он должен быть доступен для чтения только пользователю Zabbix.

Измените параметры TLS в файле конфигурации прокси Zabbix (zabbix_proxy.conf). Например, задайте:

TLSConnect=psk
TLSPSKFile=/home/zabbix/zabbix_proxy.psk
TLSPSKIdentity=PSK 002

Прокси подключится к серверу с использованием PSK. Идентификатором PSK будет «PSK 002».

(Чтобы минимизировать время простоя, см. описание изменения типа подключения в разделе Управление шифрованием подключений.)

Настройте PSK для этого прокси в веб-интерфейсе Zabbix. Перейдите в раздел Администрирование > Прокси, выберите прокси и откройте вкладку Шифрование. В разделе «Подключения от прокси» установите флажок PSK. Вставьте в поле «Идентификатор PSK» значение «PSK 002», а в поле «PSK» — значение «e560cb0d918d26d31b4f642181f5f570ad89a390931102e5391d08327ba434e9». Нажмите «Обновить».

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

Для пассивного прокси процедура практически такая же. Единственное отличие заключается в том, что в файле конфигурации прокси Zabbix необходимо задать TLSAccept=psk, а в веб-интерфейсе Zabbix для параметра Подключения к прокси выбрать PSK.

Устранение неполадок с PSK

PSK содержит нечетное количество шестнадцатеричных цифр

Прокси или агент не запускается, сообщение в журнале прокси или агента:

invalid PSK in file "/home/zabbix/zabbix_proxy.psk"
Строка идентификатора PSK длиной более 128 байт передается в GnuTLS

В журнале клиента TLS:

gnutls_handshake() failed: -110 The TLS connection was non-properly terminated.

В журнале сервера TLS:

gnutls_handshake() failed: -90 The SRP username supplied is illegal.
Слишком длинное значение PSK, используемое с OpenSSL 1.1.1

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

...Библиотека OpenSSL (версия OpenSSL 1.1.1  11 Sep 2018) инициализирована
...
...В zbx_tls_connect(): psk_identity:"PSK 1"
...zbx_psk_client_cb() запросил идентификатор PSK "PSK 1"
...Завершение zbx_tls_connect():FAIL error:'SSL_connect() set result code to SSL_ERROR_SSL: file ssl\statem\extensions_clnt.c line 801: error:14212044:SSL routines:tls_construct_ctos_early_data:internal error: TLS write fatal alert "internal error"'

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

...Сообщение от 123.123.123.123 не содержит заголовка. Сообщение проигнорировано.

Эта проблема обычно возникает при обновлении OpenSSL с 1.0.x или 1.1.0 до 1.1.1, если значение PSK длиннее 512 бит (PSK длиной 64 байта, введенный как 128 шестнадцатеричных цифр).

См. также: Ограничения размера значения