RabbitMQ TLS кластеризация – “недостаточная безопасность”

Вопрос или проблема

В настоящее время я настраиваю кластер RabbitMQ, где требуется, чтобы все коммуникации внутри кластера были зашифрованы.

Я следовал руководству на https://www.rabbitmq.com/clustering-ssl.html – создал файл с сертификатом и ключом, и передал аргументы SSL в rabbitmq-server в виде переменных окружения:

RABBITMQ_SERVER_ADDITIONAL_ERL_ARGS='-pa /usr/lib/erlang/lib/ssl-7.1/ebin -proto_dist inet_tls -ssl_dist_opt server_certfile /etc/ssl/certs/rabbit.pem'
RABBITMQ_CTL_ERL_ARGS='-pa /usr/lib/erlang/lib/ssl-7.1/ebin -proto_dist inet_tls -ssl_dist_opt server_certfile /etc/ssl/certs/rabbit.pem'

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

# rabbitmqctl status
Статус узла rabbit@rabbit01 ...
Ошибка: невозможно подключиться к узлу rabbit@rabbit01: nodedown

ДИАГНОСТИКА
===========

попытка связаться: [rabbit@rabbit01]

rabbit@rabbit01:
  * подключен к epmd (порт 4369) на rabbit01
  * epmd сообщает, что узел 'rabbit' работает на порту 47965
  * TCP соединение успешно, но распределение Erlang не удалось
  * предложение: несоответствие имени хоста?
  * предложение: правильно ли установлен cookie?
  * предложение: использует ли распределение Erlang TLS?

С стороны сервера, я не получаю ничего существенно полезного в журналах, кроме крайне бесполезного:

=ОТЧЕТ ОБ ОШИБКЕ==== 30-Dec-2015::13:08:58 ===
SSL: hello: tls_handshake.erl:167:Фатальная ошибка: недостаточная безопасность

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

Erlang действительно имеет поддержку SSL, как проверено на https://www.rabbitmq.com/troubleshooting-ssl.html, и я могу установить безопасное соединение с сертификатом с помощью s_server и s_client от openssl.

Я не уверен, каков будет следующий шаг в диагностике этой проблемы и не смог найти каких-либо известных проблем с кластеризацией – к сожалению, большая часть документации RabbitMQ по поводу TLS касается протокола AMQP, а не внутренней кластеризации.


Я также тестировал подключение к работающему экземпляру RabbitMQ с помощью openSSL и получал очень похожую ошибку:

# openssl s_client -connect localhost:47965
CONNECTED(00000003)
140004605863584:error:1407742F:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert insufficient security:s23_clnt.c:770:
---
свидетельство соперника недоступно
---
Имя CA клиентского сертификата не отправлено
---
SSL рукопожатие прочитало 7 байт и записало 295 байт
---
Новый, (NONE), шифр (NONE)
Безопасная переаттестация НЕ поддерживается
Сжатие: НЕТ
Расширение: НЕТ
---

 openssl s_client -connect localhost:47965 -tls1_2
CONNECTED(00000003)
140400037775008:error:1409442F:SSL routines:SSL3_READ_BYTES:tlsv1 alert insufficient security:s3_pkt.c:1262:SSL alert number 71
140400037775008:error:1409E0E5:SSL routines:SSL3_WRITE_BYTES:ssl handshake failure:s3_pkt.c:598:
---
свидетельство соперника недоступно
---
Имя CA клиентского сертификата не отправлено
---
SSL рукопожатие прочитало 7 байт и записало 0 байт
---
Новый, (NONE), шифр (NONE)
Безопасная переаттестация НЕ поддерживается
Сжатие: НЕТ
Расширение: НЕТ
SSL-сеанс:
    Протокол  : TLSv1.2
    Шифр    : 0000
    ID-сеанса:
    ID-контекста сеанса:
    Основной ключ:
    Аргумент ключа   : Нет
    Идентификатор PSK: Нет
    Указатель идентификатора PSK: Нет
    Имя пользователя SRP: Нет
    Время начала: 1451944018
    Таймаут   : 7200 (сек)
    Код возврата проверки: 0 (ок)
---

Это может быть связано с несовпадением шифрового набора или версии TLS (например, клиент ограничен TLSv1, но RabbitMQ настроен для требования TLSv1.2), но также может быть связано с тонкими полями использования ключа в сертификате. Последнее особенно трудно заметить.

Смотрите [1][2][3][4][5].

  1. https://www.rabbitmq.com/troubleshooting-ssl.html
  2. https://www.rabbitmq.com/ssl.html#tls-versions
  3. https://www.rabbitmq.com/ssl.html#cipher-suites
  4. https://www.rabbitmq.com/ssl.html#tls-evaluation-tools
  5. https://www.rabbitmq.com/ssl.html#key-usage

Ответ или решение

Ошибка RabbitMQ TLS: "Недостаточная безопасность" и способы её устранения

При настройке кластера RabbitMQ с использованием TLS для шифрования всех коммуникаций между узлами вы столкнулись с ошибкой "недостаточная безопасность". Ваша проблема скорее всего связана с неправильной конфигурацией шифрования или параметров сертификата. Рассмотрим более подробно, как это можно исправить.

1. Понимание ошибки

Сообщение об ошибке, которое вы получаете:

SSL: hello: tls_handshake.erl:167:Fatal error: insufficient security

указывает на проблему с параметрами TLS, где уровень безопасности, выставленный на стороне клиента или сервера, слишком низок. Это может произойти по следующим причинам:

  • Неподдерживаемые шифры.
  • Несоответствие между версиями TLS.
  • Неправильные настройки сертификатов.

2. Проверка конфигурации

2.1 Версии TLS

Убедитесь, чтоRabbitMQ настроен на использование поддерживаемой версии TLS, например, TLS 1.2 или выше. Проверьте, что настройки на клиенте и сервере совпадают.

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

RABBITMQ_SSL_CIPHERS=ECDHE-RSA-AES256-GCM-SHA384
2.2 Шифры

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

RABBITMQ_SSL_CIPHERS=<your preferred ciphers>
2.3 Сертификаты

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

  • Digital Signature
  • Key Encipherment

3. Проверка параметров Erlang

RabbitMQ использует Erlang для управления дальнейшими аспектами сетевого взаимодействия. Проверьте, правильно ли указаны параметры для Erlang:

RABBITMQ_SERVER_ADDITIONAL_ERL_ARGS='-ssl_dist_opt server_certfile /path/to/your/cert.pem'

Убедитесь, что все параметры указаны верно.

4. Диагностика с помощью OpenSSL

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

openssl s_client -connect localhost:<port> -tls1_2 -cipher ECDHE-RSA-AES256-GCM-SHA384 -msg -debug

5. Финальные рекомендации

Если ошибка продолжает возникать, обратите внимание на следующее:

  • Убедитесь, что вся конфигурация (включая cookie) имеет единообразие на всех узлах кластера.
  • Проверьте, что все узлы имеют одинаковые версии Erlang и RabbitMQ, чтобы устранить возможные несоответствия в поддерживаемых шифрах и протоколах.

Заключение

Ошибка "недостаточная безопасность" при использовании TLS в RabbitMQ, главным образом, указывает на несоответствие в настройках протоколов и шифров. Проведите полную проверку всех настроек, как на стороне сервера, так и клиента, чтобы добиться успешного соединения. Помните, что безопасность коммуникаций вашего кластера — это основа его эффективной работы.

Оцените материал
Добавить комментарий

Капча загружается...