LINUX.ORG.RU
ФорумAdmin

Помогите настроить аутентификацию в ActiveMQ через LDAP

 , ,


0

1

Пытался настраивать по http://activemq.apache.org/cached-ldap-authorization-module.html , но там примеры противоречат друг другу, а предлагаемый для OpenLDAP конфиг с ним несовместим.

Я поставил на локалхост OpenLDAP с пустой базой, заменил параметры в slapd.conf на рекомендованные

suffix          "dc=activemq,dc=apache,dc=org"
rootdn          "cn=admin,dc=activemq,dc=apache,dc=org"
rootpw          {SSHA}lfAYn54xCFghgQv5B2Kqn3d3eLojqxtS
#пароль "sunflower"

Запустил OpenLDAP, импортировал рекомендованный activemq-openldap.ldif с некоторыми изменениями:

# Убрал, вызывало ошибку 53 "no global superior knowledge"
#dn: dc=apache,dc=org
#objectClass: dcObject
#objectClass: organization
#dc: apache
#o: Apache

dn: dc=activemq,dc=apache,dc=org
objectClass: dcObject
# container отсутствует в OpenLDAP, сменил на organization, 
#objectClass: container
objectClass: organization
objectClass: top
# Несовместимо с objectClass=organization, сменил на o=activemq
#cn: activemq
o: activemq
dc: activemq
(Все пароли также «sunflower».)

Создал конфиг:

<?xml version="1.0" encoding="UTF-8"?>
<beans
  xmlns="http://www.springframework.org/schema/beans"
  xmlns:amq="http://activemq.apache.org/schema/core"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
  http://activemq.apache.org/schema/core http://activemq.apache.org/schema/core/activemq-core.xsd">

  <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"/>

  <broker useJmx="false"  xmlns="http://activemq.apache.org/schema/core" persistent="false">

      <plugins>
          <authorizationPlugin>
              <map>
                  <cachedLDAPAuthorizationMap
                      connectionURL="ldap://localhost:389"
                      connectionUsername="cn=admin,dc=activemq,dc=apache,dc=org"
                      connectionPassword="sunflower"
                      queueSearchBase="ou=Queue,ou=Destination,ou=ActiveMQ,dc=activemq,dc=apache,dc=org"
                      topicSearchBase="ou=Topic,ou=Destination,ou=ActiveMQ,dc=activemq,dc=apache,dc=org" 
                      tempSearchBase="ou=Temp,ou=Destination,ou=ActiveMQ,dc=activemq,dc=apache,dc=org"
                      refreshInterval="300000"
                      legacyGroupMapping="false"
                  />
              </map>
          </authorizationPlugin>
      </plugins>

    <transportConnectors>
      <transportConnector uri="tcp://localhost:61616"/>
    </transportConnectors>

  </broker>

    <import resource="jetty.xml"/>
</beans>

В jetty.xml отключил аутентификацию, чтобы не мешала.

Запускаю ActiveMQ, веб интерфейс работает.

В терминале набираю

curl -XPOST -d "body=message" http://admin:sunflower@localhost:8161/api/message?destination=queue://BAR 

Получаю ошибку:

<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<title>Error 500 Server Error</title>
</head>
<body><h2>HTTP ERROR 500</h2>
<p>Problem accessing /api/message. Reason:
<pre>    Server Error</pre></p><h3>Caused by:</h3><pre>javax.servlet.ServletException: Could not post JMS message: javax.jms.JMSSecurityException: User is not authenticated.
...
Та же ошибка в консоли с activemq.

В чём проблема? Куда копать?

ОТВЕТ: У Jetty своя независимая аутентификация. В сети есть несколько взаимоисключающих руководств.

(Кроме того, если добавляешь плагин для авторизации, обязательно нужен и плагин для аутентификации.)

P.S. Заодно вопрос: в DN cn=read,cn=TEST.FOOBAR,ou=Queue,ou=Destination,ou=ActiveMQ,dc=activemq,dc=apache,dc=org есть дополнительный атрибут member равный cn=notthere,ou=Group,ou=ActiveMQ,dc=activemq,dc=apache,dc=org

ActiveMQ на него ругается при запуске:

ERROR | Policy not applied! Unknown member [cn=notthere,ou=Group,ou=ActiveMQ,dc=activemq,dc=apache,dc=org, cn=read,cn=TEST.FOOBAR,ou=Queue,ou=Destination,ou=ActiveMQ,dc=activemq,dc=apache,dc=org] in policy entry {}
javax.naming.NameNotFoundException: [LDAP: error code 32 - No Such Object]; remaining name 'cn=notthere,ou=Group,ou=ActiveMQ,dc=activemq,dc=apache,dc=org'
Без него ошибка исчезает, но авторизация всё равно не работает.

Зачем он нужен?

ОТВЕТ: не нужен, спасибо Ivan_qrt.

★★

queueSearchBase="ou=Queue,ou=Destination,ou=ActiveMQ,dc=activemq,dc=apache,dc=org"
topicSearchBase="ou=Topic,ou=Destination,ou=ActiveMQ,dc=activemq,dc=apache,dc=org"
tempSearchBase="ou=Temp,ou=Destination,ou=ActiveMQ,dc=activemq,dc=apache,dc=org"

Не наблюдаю в ldif'е таких контейнеров. Ты их создавал?

User is not authenticated

ldapwhoami -xWD "cn=admin,dc=activemq,dc=apache,dc=org" -H "ldap://localhost:389"

ldapsearch -xWD "cn=admin,dc=activemq,dc=apache,dc=org" -H "ldap://localhost:389" -b "dc=activemq,dc=apache,dc=org"

Это работает? Сперва убедись, что лдап настроен и работает корректно. Потом пробуй activeMQ в него пускать.

Ivan_qrt ★★★★★ ()
Ответ на: комментарий от Ivan_qrt

ldapwhoami -xWD «cn=admin,dc=activemq,dc=apache,dc=org» -H «ldap://localhost:389»

Enter LDAP Password: sunflower
ldap_connect_to_host: TCP localhost:389
ldap_new_socket: 616
ldap_prepare_socket: 616
ldap_connect_to_host: Trying ::1 389
ldap_pvt_connect: fd: 616 tm: -1 async: 0
attempting to connect:
connect success
dn:cn=admin,dc=activemq,dc=apache,dc=org

ldapsearch -xWD «cn=admin,dc=activemq,dc=apache,dc=org» -H «ldap://localhost:389» -b «dc=activemq,dc=apache,dc=org»

Выдаёт много строк:

Enter LDAP Password: sunflower
ldap_connect_to_host: TCP localhost:389
ldap_new_socket: 628
ldap_prepare_socket: 628
ldap_connect_to_host: Trying ::1 389
ldap_pvt_connect: fd: 628 tm: -1 async: 0
attempting to connect:
connect success
# extended LDIF
#
# LDAPv3
# base <dc=activemq,dc=apache,dc=org> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#

# activemq.apache.org
dn: dc=activemq,dc=apache,dc=org
objectClass: dcObject
objectClass: organization
objectClass: top
dc: activemq
o: activemq

.........

# search result
search: 2
result: 0 Success

# numResponses: 38
# numEntries: 37

Вроде, всё работает.

olegd ★★ ()
Последнее исправление: olegd (всего исправлений: 1)
Ответ на: комментарий от olegd

Строки 129, 124 и 292.

Прошу прощенья, затупил.

cn=notthere,ou=Group,ou=ActiveMQ,dc=activemq,dc=apache,dc=org

Ну такой группы в ldif'е нет. Потому, наверное, и ругается.

Вроде, всё работает.

Тогда проблема не с подключением к ldap, а в том, что activemq не нравится указанный пользователь. Тут помочь вряд ли смогу.

Ivan_qrt ★★★★★ ()
Ответ на: комментарий от Ivan_qrt

cn=notthere,ou=Group,ou=ActiveMQ,dc=activemq,dc=apache,dc=org

Строка 185.

Тогда проблема не с подключением к ldap, а в том, что activemq не нравится указанный пользователь.

Какое нужно имя пользователя, чтобы приняло?

Или на стороне LDAP для admin и jdoe всё нормально, и проблема вызвана невычищенными средствами аутентификации на стороне ActiveMQ?

olegd ★★ ()
Ответ на: комментарий от olegd

Строка 185.

Здесь вот так:

175 dn: cn=read,cn=TEST.FOOBAR,ou=Queue,ou=Destination,ou=ActiveMQ,dc=activemq,dc=apache,dc=org
176 cn: read
177 member: cn=users,ou=Group,ou=ActiveMQ,dc=activemq,dc=apache,dc=org
178 member: cn=admins,ou=Group,ou=ActiveMQ,dc=activemq,dc=apache,dc=org
179 member: uid=jdoe,ou=User,ou=ActiveMQ,dc=activemq,dc=apache,dc=org
180 member: cn=notthere,ou=Group,ou=ActiveMQ,dc=activemq,dc=apache,dc=org
181 objectClass: groupOfNames
182 objectClass: top
183 
184 dn: cn=write,cn=TEST.FOOBAR,ou=Queue,ou=Destination,ou=ActiveMQ,dc=activemq,dc=apache,dc=org
185 cn: write
186 objectClass: groupOfNames
187 objectClass: top
188 member: cn=users,ou=Group,ou=ActiveMQ,dc=activemq,dc=apache,dc=org
189 member: cn=admins,ou=Group,ou=ActiveMQ,dc=activemq,dc=apache,dc=org
190 member: uid=jdoe,ou=User,ou=ActiveMQ,dc=activemq,dc=apache,dc=org

Если ты имеешь ввиду 180 member: cn=notthere,ou=Group,ou=ActiveMQ,dc=activemq,dc=apache,dc=org, то это не группа, а ссылка на неё. Ссылка есть, группы нет. Вот и ругается.

Или на стороне LDAP для admin и jdoe всё нормально

Ну это проверяется ldapsearch'ем или ldapwhoami.

проблема вызвана невычищенными средствами аутентификации на стороне ActiveMQ?

Я думаю, что так. Но я никогда не общался с activemq.

Логин/пароль, которые передаются курлу - это пользователи activemq? Он должен их искать по лдапу и проверять авторизацию? Или это какие-то встроенные пользователи?

Если первое, то я не вижу никаких настроек для поиска пользователей, типа objectClass'а, атрибутов для логина/пароля, группы, контейнера с пользователями и т.п.

Если второе, то скорее всего туда и надо копать.

Ivan_qrt ★★★★★ ()
Ответ на: комментарий от olegd

Скажите, а почему вы используете других людей вместо Гугла, тогда когда вам стоило бы научиться пользоваться им в первую очередь, ещё до того, как что-либо браться настраивать?
https://help.ubuntu.com/lts/serverguide/openldap-server.html.en#openldap-serv...

zgen ★★★★★ ()
Ответ на: комментарий от zgen

Потому что эта инструкция не сооветствует действительности. При установке на чистую машину у OpenLDAP оказалась совсем не такая конфигурация, как там описано.

olegd ★★ ()