Как добиться аутентификации по теме после аутентификации клиента ssl с rabbitmq в сочетании с mqtt и бэкэндом для аутентификации?

Я настроил RabbitMq v3.6.6 и пытаюсь добиться аутентификации по теме после успешной аутентификации клиента ssl. Клиент подключается используя mqtt.

Конфигурация до сих пор

#/etc/rabbitmq/rabbitmq.config
[
  {rabbit, [
    {ssl_cert_login_from, common_name},
    {auth_mechanisms, ['EXTERNAL']},
    {tcp_listeners, [{"127.0.0.1", 5672}]},
    {ssl_listeners, [{"0.0.0.0", 5671}]},
    {ssl_options, [
      {cacertfile,          "/path_to/CA.crt"},
      {certfile,            "/path_to/certfile.crt"},
      {keyfile,             "/path_to/keyfile.key"},
      {verify, verify_peer},
      {fail_if_no_peer_cert, true}
      ]},
    {auth_backends, [rabbit_auth_backend_http]},
    {rabbitmq_auth_backend_http, [
      {http_method,          post },
      {user_path,            "https://127.0.0.1/auth/user"},
      {vhost_path,             "https://127.0.0.1/auth/vhost"},
      {resource_path, "https://127.0.0.1/auth/resource"},
      {topic_path, "https://127.0.0.1/auth/topic"}
      ]}
  ]},
  {rabbitmq_mqtt, [
                  {default_user,     <<"user">>},
                  {default_pass,     <<"pass">>},
                  {allow_anonymous,  true},
                  {vhost,            <<"/">>},
                  {exchange,         <<"amq.topic">>},
                  {subscription_ttl, 86400000},
                  {tcp_listeners,    [{"127.0.0.1", 1883}]},
                  {ssl_listeners,    [8883]},
                  {ssl_cert_login, true}
  ]}
].

Я установил плагины rabbitmq_auth_backend_http ( https://bintray.com/rabbitmq/community-plugins/download_file?file_path=rabbitmq_auth_backend_http-3.6.x-1b27d722.ez) и rabbitmq_topic_authorization( https://github.com/airboxlab/rabbitmq-topic-authorization/releases/download/v3.6.6/rabbitmq_topic_authorization.ez) и включил их.

$ sudo rabbitmq-plugins list -e
[e*] amqp_client                  3.6.6
[e*] mochiweb                     2.13.1
[E*] rabbitmq_auth_backend_http   
[E*] rabbitmq_auth_mechanism_ssl  3.6.6
[E*] rabbitmq_management          3.6.6
[e*] rabbitmq_management_agent    3.6.6
[E*] rabbitmq_mqtt                3.6.6
[E*] rabbitmq_topic_authorization 
[e*] rabbitmq_web_dispatch        3.6.6
[e*] webmachine                   1.10.3

Почему я настроил так

На https://github.com/rabbitmq/rabbitmq-auth-mechanism-ssl есть примечание:

Обратите внимание, что аутентифицированный пользователь будет затем найден в настроенных бэкэндах (ах) аутентификации / авторизации - это будет база данных пользователей на основе mnesia по умолчанию, но может включать другие бэкэнды, если это настроено.

Я сделал это путем включения и включения плагинов и настроил auth_mechanisms в EXTERNAL, А также auth_backends в rabbit_auth_backend_http

В документации по подключению mqtt ( https://www.rabbitmq.com/mqtt.html) есть раздел Аутентификация с SSL-сертификатами клиента, чего я и хочу достичь. Я выделил важную часть жирным шрифтом:

Аутентификация с помощью клиентских сертификатов SSL Адаптер MQTT может аутентифицировать соединения на основе SSL, извлекая имя из SSL-сертификата клиента без использования пароля.

В целях безопасности сервер должен быть настроен с параметрами SSL fail_if_no_peer_cert, установленными в значение true, и параметром verify, установленным в verify_peer, чтобы все клиенты SSL имели проверяемый сертификат клиента.

Чтобы включить эту функцию, установите для ssl_cert_login значение true для приложения rabbitmq_mqtt. Например: [ {rabbitmq_mqtt, [{ssl_cert_login, true}]} ].

Чтобы использовать вместо общего имени, добавьте: {rabbit, [{ssl_cert_login_from, common_name}]} к вашей конфигурации.

Обратите внимание: аутентифицированный пользователь должен существовать в настроенных бэкэндах аутентификации / авторизации. Клиенты не должны указывать имя пользователя и пароль.

Эта проблема

Когда я хочу подписаться через sudo mosquitto_sub -h my-backend --cafile ca.crt --key client_keyfile.key --cert client_certfile.crt -t '#' -p 8883 Я получаю ошибку Connection Refused: bad user name or password.

Журналы RabbitMq показывают следующий вывод:

=ERROR REPORT==== 6-Mar-2017::15:01:51 ===
MQTT login failed for "my-hostname" auth_failure: Refused

В этот момент я ожидал, что RabbitMq запросит у бэкэнда аутентификацию, а не сразу откажется. Но нет никакого запроса к моему backend-серверу. Кроме того, не должно быть ошибок, сообщающих об имени или пароле, поскольку я использую клиентские сертификаты. Я проверил backend-сервер с помощью curl и получаю allow ответ, как и ожидалось. Я также мог проверить доступ в логах nginx. Так что я думаю, rabbitmq_auth_backend_http не работает должным образом или что-то еще неправильно настроено.

У кого-нибудь есть идеи, почему не запрашивается backend-сервер?

1 ответ

=ERROR REPORT==== 6-Mar-2017::15:01:51 === MQTT login failed for "my-hostname" auth_failure: Refused

Для решения вышеуказанной проблемы, вам нужно сначала добавить пользователя 'my-hostname':sudo rabbitmqctl add_user my-hostname my-hostname

Затем установите разрешение:sudo rabbitmqctl set_permissions -p / my-hostname ".*" ".*" ".*"

ИЛИ, вы можете добавить пользователя через графический интерфейс управления rabbitmq.

Согласно документации здесь: https://www.rabbitmq.com/access-control.html механизм аутентификации "ВНЕШНИЙ" недоступен.

Доступны следующие псевдонимы:

внутренний, ldap, http, amqp, фиктивный

Однако

Внешний

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

Другие вопросы по тегам