LINUX.ORG.RU
ФорумAdmin

Протоколы, аутентификация, поиск, фигурные скобки.

 , ,


0

2

Есть программа на Java, использующая LDAP. С непонятной документацией с кучей нерабочих примеров. Apache Active MQ. Часть конфигов в XML, часть синтаксисом похожа на Джаву (как это называется, кстати?). Вопросы по последним. Про LDAP знаю только из RFC4519.

1. Согласно https://docs.oracle.com/javase/6/docs/api/javax/naming/Context.html#SECURITY_...

env.put(Context.SECURITY_PROTOCOL, "ssl");
означает использовать SSL. Что означает
env.put(Context.SECURITY_PROTOCOL, "s");
?

2.

Согласно https://docs.oracle.com/javase/6/docs/api/javax/naming/Context.html#SECURITY_... Context.SECURITY_AUTHENTICATION может принимать значения «none», «simple» и «strong». Какая между разница между «simple» и «strong»?

3.

Каковы различия в языке поисковых запросов для OpenLDAP, Apache Directory Server и Active Directory?

4.

Что означают фигурные скобки в поисковых запросах? Какая разница между = и := ? Примеры:

    userBase="CN=Users,DC=test,DC=com" 
    userSearchMatching="(CN={0})" 
    userSearchSubtree=true 
...
        baseDn="OU=groups,DC=domainname,DC=com"
        roleFilter="(&(cn=webconsoleadmins)(member={user}))"
        defaultRole="admins"
        roleAttribute="cn";
...
    roleBase="OU=Destination,OU=ActiveMQ,DC=test,DC=com" 
    roleName=CN 
    roleSearchMatching="(member={0})" 
...
    roleBase="OU=Destination,OU=ActiveMQ,DC=test,DC=com"
    roleName=CN
    roleSearchMatching="(member:=cn={1})"

★★★

Последнее исправление: olegd (всего исправлений: 2)

1. Есть шанс, что httpS :), но это надо приложение смотреть

2. Простая и через Kerberos/gss-api

3. Никаких

4. Элементы массива. Поле может хранить несколько значений, в фигурной скобке указывается какое из них нужно

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

1. Есть шанс, что httpS :), но это надо приложение смотреть

https://git-wip-us.apache.org/repos/asf?p=activemq.git;a=blob;f=activemq-brok...

https://git-wip-us.apache.org/repos/asf?p=activemq.git;a=blob;f=activemq-brok...

https://git-wip-us.apache.org/repos/asf?p=activemq.git;a=blob;f=activemq-jaas...

Но других упоминаний SECURITY_AUTHENTICATION в программе поиск не находит, поэтому скорее это где-то в стандартных библиотеках Java.

2. Простая и через Kerberos/gss-api

Что такое «простая»? Отправка логина и пароля?

3. Никаких

Последние 2 примера из пункта 4 как раз конфиги для OpenLDAP и ADS под одинаковую задачу. Ссылку сходу найти не могу.

4. Элементы массива. Поле может хранить несколько значений, в фигурной скобке указывается какое из них нужно

0-1-2 — порядковые номера? А «user»? Переменная? Поле класса? Это всё — Джава и ко LDAP напрямую не относится?

И что означает двоеточие со знаком равенства?

olegd ★★★
() автор топика

Каковы различия в языке поисковых запросов

этот «язык» стандартизован (RFC сам найди) и собственно является неотъемлемой частью LDAP.

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

Имя поля - это не язык запроса, имена полей разные. Язык запроса один

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

Этого джава, из массива берутся данные для условий поиска

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

а, ему в лдап аус нужен. ну почти тот же запрос))

ТС, тогда можно google://ldap simple bind
впрочем, если бы ТС искал, то давно бы уже нашОл.

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

LDAP simple Auth
ldap simple bind
http simple auth

То есть это — то же, что и простая аутентификация в HTTP? Спасибо.

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

Ты и правда скажи, что хочешь сделать, и что не получается?

Авторизацию в Apache ActiveMQ при помощи LDAP. Чем универсальнее, тем лучше. Как минимум, OpenLDAP. Желательно MS Active Directory и что в RedHat по умолчанию.

Есть куча мануалов с примерами, но ни один не работает для OpenLDAP. Ошибка «java.lang.SecurityException: User mqadmin is not authorized to create: topic://ActiveMQ.Advisory.Connection»

И что означает ":=" ? В примерах неоднократно попадается.

olegd ★★★
() автор топика

Пример разночтений: https://www.ibm.com/support/knowledgecenter/en/SSGLW6_5.2.1/com.ibm.p8.ce.dev...

IDirectoryConfiguration.UserNameAttribute Property

Defines the directory server attribute to be used as the short name for a user. The default value of this property is unique to the directory service provider as follows: Active Directory: samAccountName
Sun One: uid
Novell: cn
IBM: cn
ADAM: cn
OID: cn

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

Чувак, ты спрашиваешь, отличается ли язык SQL для разных версий БД, а когда тебе говорят что нет - киваешь на разные таблицы в БД и говоришь «ну как же нет, когда да - не видите, тут поле так называется, а тут - эдак».

Это не имеет отношения к SQL. Так и у тебя - для samba одни поля, для pam/nss другие, для AD третьи.

Думай об LDAP как о базе данных, для одного приложения нужны одни таблицы и поля, для другого - другие таблицы и поля.

Хочешь в openldap - заполни его сначала правильными данными, а потом объясни amq как искать эти данные.

Вот пример данных (причём не только авторизации пользователей) -
https://github.com/apache/activemq/blob/master/activemq-unit-tests/src/test/r...

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

Не работает. Я с этих файлов и начинал.

OpenLDAP отказывается импортировать этот LDIF, требуя неочевидных изменений, после чего не срабатывает авторизация.

Ошибка «LDAP: error code 21 - objectClass: value #1 invalid per syntax» в блоке dn: dc=activemq,dc=maxcrc,dc=com

Для MS Active Directory этот LDIF тем более не годится, так как содержит ещё больше противоречий с её схемой. Начиная с запрета на «objectClass: applicationProcess» который тут ключевой.

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

Да, а инструкция по cachedLDAPAuthorizationMap не упоминает, что перед <authorizationPlugin> необходим также <authenticationPlugin>. Возможно, специалистам по компьютерной безопасности это очевидно, но до меня доходило 2 недели.

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

в блоке dn: dc=activemq,dc=maxcrc,dc=com

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

Для MS Active Directory этот LDIF тем более не годится

Тебе на странице русским языком написано - для OPENLDAP.
Что тебе не понятно?

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

Раз уж всплыл этот LDIF, спрошу.

Почему OpenLDAP не принимает «objectClass: container»? Можно ли его заменять на «objectClass: domain»?

Почему dc несовместимы с cn?

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

в этом ldif, ссылку на который я дал, я никаких ошибок не вижу

Он для корневого DN dc=apache,dc=org. Я его импортировал в дефолтную базу OpenLDAP с корнем dc=maxcrc,dc=com.

Или от простой замены «dc=apache,dc=org» на «dc=maxcrc,dc=com» и «dc=apache» на «dc=maxcrc» всё сломается?

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

Тебе на странице русским языком написано - для OPENLDAP. Что тебе не понятно?

Как сделать универсальный конфиг.

Кстати, этот универсальнее того, с которым я возился в самом начале. Там member были не DN, а RDN.

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

Ну и вопрос на засыпку: что делает строка 180 LDIF-а? Помимо забивания логов стектрейсами.

Я в итоге этот атрибут удалил, чтобы ошибки не мешали.

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

Если интересует конкретная ошибка, то

«User jdoe is not authorized to create: topic://ActiveMQ.Advisory.Connection»

Аутентификация через LDAP, то есть:

<jaasAuthenticationPlugin configuration="activemq"/>

и

activemq { 
    org.apache.activemq.jaas.LDAPLoginModule requisite 
    debug=true 
    initialContextFactory=com.sun.jndi.ldap.LdapCtxFactory 
    connectionURL="ldap://srv138:389" 
    connectionUsername="cn=Manager,dc=maxcrc,dc=com" 
    connectionPassword="secret" 
    connectionProtocol="s" 
    authentication=simple 
    userBase="ou=User,ou=ActiveMQ,dc=activemq,dc=maxcrc,dc=com" 
    userSearchMatching="(uid={0})" 
    userSearchSubtree=true 
    roleBase="ou=Destination,ou=ActiveMQ,dc=activemq,dc=maxcrc,dc=com"
    roleName=CN 
    roleSearchMatching="(member:=CN={0},ou=Group,ou=ActiveMQ,dc=activemq,dc=maxcrc,dc=com)"
    roleSearchSubtree=true;
};

Кстати, зачем jaasAuthenticationPlugin роли, если их потом переопределяет другой плагин? Если их опустить — не логинит.

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

Почему OpenLDAP не принимает «objectClass: container»?

Потому что в подключенных схемах такого objectclass нет.

Можно ли его заменять на «objectClass: domain»?

А тебе ногу от кузнечика можно пришить?

Почему dc несовместимы с cn?

Потому что objectclass описывает, какие поля будут у записи.

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

Или от простой замены «dc=apache,dc=org» на «dc=maxcrc,dc=com» и «dc=apache» на «dc=maxcrc» всё сломается?

От простой замены названия контейнера ничего не ломается.
Но ты сделал не только её.

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

Как сделать универсальный конфиг.

Никак.

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

Ну и вопрос на засыпку: что делает строка 180 LDIF-а?

dn: cn=read,cn=TEST.FOOBAR,ou=Queue,ou=Destination,ou=ActiveMQ,dc=activemq,dc=apache,dc=org

...
180:

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

Просто описывает группу, у которой есть право read, судя по структуре.

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

«User jdoe is not authorized to create: topic://ActiveMQ.Advisory.Connection»
Кстати, зачем jaasAuthenticationPlugin роли, если их потом переопределяет другой плагин? Если их опустить — не логинит.

В гугл, я специалист по ldap, а не по конкретному приложению.

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

Потому что в подключенных схемах такого objectclass нет.

А тебе ногу от кузнечика можно пришить?

Вот именно. Таким образом, предложенный LDIF несовместим с дефолтной схемой OpenLDAP.

От простой замены названия контейнера ничего не ломается. Но ты сделал не только её.

Вот изменённый LDIF: https://pastebin.com/Vhex7Duz

Заменил все dc, ссылавшиеся на apache.org, заменил objectClass: container на objectClass: domain, закомментировал cn: activemq в dn: dc=activemq,dc=maxcrc,dc=com. Других изменений нету. Не работает.

180:
member: cn=notthere,ou=Group,ou=ActiveMQ,dc=activemq,dc=apache,dc=org

Просто описывает группу, у которой есть право read, судя по структуре.

Только эта группа нигде не определена, если поискать. И таких колдобин в документации ActiveMQ полно.

В гугл, я специалист по ldap, а не по конкретному приложению.

Тогда ответь, наконец, какая разница между «=» и ":=" :) Хотя бы «никакой», если уверен, или «не знаю».

Проблема с неавторизуемой jdoe в том, что ActiveMQ не может отличить группу cn=users,ou=Group,ou=ActiveMQ,dc=activemq,dc=maxcrc,dc=com от пользователя. (cn=admins,ou=Group,ou=ActiveMQ,dc=activemq,dc=maxcrc,dc=com тоже не может.) Ошибка в логе: «Policy not applied! Can't determine type of member»

Вот файл, на котором спотыкается: https://activemq.apache.org/maven/apidocs/src-html/org/apache/activemq/securi... , строки 446-447. Проблема между строками 396 и 446.

Вопрос: что изменить в cn=users,ou=Group,ou=ActiveMQ,dc=activemq,dc=maxcrc,dc=com , чтобы она однозначно опознавалось как группа? legacyGroupMapping = false.

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

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

Ладно. Сменил корневой домен в OpenLDAP:

suffix		"dc=apache,dc=org"
rootdn		"cn=Manager,dc=apache,dc=org"
Импортирую. Результат:
##########################
## Define basic objects ##
##########################

#!RESULT OK
#!CONNECTION ldap://localhost:389
#!DATE 2018-12-26T16:14:17.312
dn: dc=apache,dc=org
objectClass: dcObject
objectClass: organization
dc: apache
o: Apache

#!RESULT ERROR
#!CONNECTION ldap://localhost:389
#!DATE 2018-12-26T16:14:17.313
#!ERROR [LDAP: error code 21 - objectClass: value #1 invalid per syntax]
dn: dc=activemq,dc=apache,dc=org
objectClass: dcObject
objectClass: container
objectClass: top
cn: activemq
dc: activemq

Убрал cn, сменил container на domain, импортировал успешно. Есть менее разрушительные замены?

Далее. Запускаю AMQ с полученной OpenLDAP конфигом с http://activemq.apache.org/cached-ldap-authorization-module.html (добавив transportConnector для stomp из дефолтного конфига). Получаю ошибку Invalid Credentials:

2018-12-26 16:36:04,692 | WARN  | Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.apache.activemq.xbean.XBeanBrokerService#0' defined in class path resource [activemq.xml]: Cannot create inner bean 'authorizationPlugin#305a759c' of type [org.apache.activemq.security.AuthorizationPlugin] while setting bean property 'plugins' with key [1]; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'authorizationPlugin#305a759c' defined in class path resource [activemq.xml]: Cannot create inner bean '(inner bean)#665a0bd2' of type [org.apache.activemq.security.CachedLDAPAuthorizationMap] while setting constructor argument; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name '(inner bean)#665a0bd2' defined in class path resource [activemq.xml]: Invocation of init method failed; nested exception is javax.naming.AuthenticationException: [LDAP: error code 49 - Invalid Credentials] | org.apache.activemq.xbean.XBeanBrokerFactory$1 | WrapperSimpleAppMain
8 килобайт стектрейса опущу.

Из общих соображений меняю connectionUsername на uid=admin,ou=User,ou=ActiveMQ,dc=activemq,dc=apache,dc=org Запускаю. В логе вижу ошибку «No Such Object» для notthere:

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 {} | org.apache.activemq.security.SimpleCachedLDAPAuthorizationMap | WrapperSimpleAppMain
javax.naming.NameNotFoundException: [LDAP: error code 32 - No Such Object]; remaining name 'cn=notthere,ou=Group,ou=ActiveMQ,dc=activemq,dc=apache,dc=org'
10k стектрейса тоже опущу.

Удаляю проблемный атрибут. Перезапускаю AMQ. Ошибок в логе нет.

Отправляю запрос STOMP от имени admin/sunflower и jdoe/sunflower. Получаю

java.lang.SecurityException: User jdoe is not authorized to create: topic://ActiveMQ.Advisory.Connection
и 6k стек-трейса.

Из логики legacyGroupMapping=false и поскольку «Locate DN in DIT» не находит DN, на который ссылаются атрибуты member в cn=admins,ou=Group,ou=ActiveMQ,dc=activemq,dc=apache,dc=org и cn=users,ou=Group,ou=ActiveMQ,dc=activemq,dc=apache,dc=org, заменяю в этих атрибутах RDN на полные DN.

Та же ошибка.

Добавляю атрибут member: uid=admin,ou=User,ou=ActiveMQ,dc=activemq,dc=apache,dc=org во все 3
cn=admin,cn=ActiveMQ.Advisory.$,ou=Topic,ou=Destination,ou=ActiveMQ,dc=activemq,dc=apache,dc=org
cn=read,cn=ActiveMQ.Advisory.$,ou=Topic,ou=Destination,ou=ActiveMQ,dc=activemq,dc=apache,dc=org
cn=write,cn=ActiveMQ.Advisory.$,ou=Topic,ou=Destination,ou=ActiveMQ,dc=activemq,dc=apache,dc=org

Та же ошибка.

Добавляю member: uid=admin,ou=User,ou=ActiveMQ,dc=activemq,dc=apache,dc=org во все записи-роли. Та же ошибка.

Есть ещё идеи?

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

Ты делаешь херню. упёрся рогом и на каждом шаге делаешь херню.

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

Я не могу помогать человеку, который хаотично жмет на кнопки и при этом спрашивает меня «почему не работает».

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

Начинай объяснять, что я сделал не так.

olegd ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.