Аутентификация LDAP на Apache по хешированному паролю

У меня есть установка с сервером Apache HTTP, обращенным к серверу tomcat. Сервер Apache использует LDAP для аутентификации.

Я использую встроенный сервер LDAP (Apache DS) и настроил отключение анонимной привязки с помощью

service.setAllowAnonymousAccess(false); // Disable Anonymous Access

service.setAccessControlEnabled(true); // Enable basic access control check (allow only  System Admin to login to LDAP Server)

Мое приложение использует Spring LDAP для подключения и выполнения пользовательских операций, таких как добавление пользователя. Я настроил его в spring.xml следующим образом:

  <bean id="ldapContextSource" class="org.springframework.ldap.core.support.LdapContextSource">
           <property name="url" value="ldap://localhost:389" />
           <property name="base" value="dc=test,dc=com" />
           <property name="userDn" value="uid=admin,ou=system" />
           <property name="password" value="secret" />
      </bean>

Apache httpd.conf настроен на использование базовой аутентификации

AuthLDAPBindDN "uid=admin,ou=system"
AuthLDAPBindPassword "{SHA}<Hash for secret>"

ПРОБЛЕМА 1: При попытке войти на сервер ldap с помощью клиента (скажем, jexplorer) я могу войти, используя как хешированный пароль, так и обычный текст «секрет». Как это возможно?

В этом случае, если кто-то узнает AuthLDAPBindDN и AuthLDAPBindPassword, которые в моем случае являются хешированными, они смогут войти, используя то же самое, на сервер LDAP с полным доступом, что представляет угрозу безопасности.

Также хочу заменить пароль в spring.xml на хешированный. Поскольку администратор может изменить пароль LDAP, как мне убедиться, что мое приложение использует обновленный хешированный пароль, поскольку мы жестко закодировали его в spring.xml?


person Varun    schedule 17.06.2014    source источник
comment
Пожалуйста, проверьте окно предварительного просмотра перед публикацией. Это был беспорядок!   -  person Duncan Jones    schedule 17.06.2014


Ответы (1)


Что касается вашего второго вопроса: обычно вам никогда не следует жестко кодировать такие вещи, как URL-адреса серверов, имена пользователей, пароли и т. Д., В вашем файле XML. Эти вещи обычно должны быть вынесены в файл свойств и обработаны с помощью <context:property-placeholder>. Скажем, например, что у вас есть файл свойств со следующим содержимым:

ldap.server.url=ldap://localhost:389
ldap.base=dc=test,dc=com
ldap.userDn=uid=admin,ou=system
ldap.password=secret

Затем вы можете ссылаться на эти свойства в файле конфигурации, например:

 <context:property-placeholder ignore-resource-not-found="true"
                               location="classpath:/ldap.properties,
                                         file:/etc/mysystem/ldap.properties" />

 <bean id="ldapContextSource" class="org.springframework.ldap.core.support.LdapContextSource">
       <property name="url" value="${ldap.server.url}" />
       <property name="base" value="${ldap.base}" />
       <property name="userDn" value="${ldap.userDn}" />
       <property name="password" value="${ldap.password}" />
  </bean>

Spring автоматически заменит содержимое в ${} соответствующими значениями из вашего файла свойств.

Обратите внимание, что я указал два местоположения файла свойств в элементе <context:property-placeholder>, а также включил ignore-resource-not-found="true". Это полезно, потому что позволяет вам включить файл свойств с вашим исходным кодом для простой настройки разработки, но в рабочей среде, если вы поместите файл свойств в /etc/mysystem/ldap.properties, это переопределит материал в связанном файле свойств.

Таким образом, если администратор меняет пароль в производственной среде, все, что вам нужно сделать, это изменить файл свойств; вам не нужно перестраивать приложение.

Что касается того, почему apache DS принимает хешированный пароль; одной из причин может быть то, что ваш LDAP-сервер настроен на прием анонимного доступа для операции чтения, что означает, что он вообще не аутентифицируется, когда вы просто читаете. Однако может быть что-то еще, вам придется направить вопрос в службу поддержки Apache DS.

person marthursson    schedule 18.06.2014
comment
Согласно документам Apache DS, сценарий, в котором вместо простого пароля передается хешированный пароль, не должен разрешать вход в систему, но в моем случае это разрешено. Что касается второго вопроса, я согласен с тем, что перемещение материалов в файл свойств было бы хорошим вариантом, но даже в этом случае для подключения к LDAP мне нужно передать обычный текст, который я не хочу хранить в файле свойств. Есть ли способ весной, когда я мог бы прочитать файл свойств (хранящий зашифрованный пароль), постобработать полученное значение для расшифровки и перейти к конфигурации Ldap в spring.xml - person Varun; 18.06.2014
comment
Вы можете сделать это с помощью пользовательских BeanFactoryPostProcessor. Вы определяете собственный синтаксис, аналогичный стратегии замены свойства (например, %hashedPassword%), и ваш BeanFactoryPostProcessor идентифицирует эти значения свойств и расшифровывает их при запуске. Однако я бы сказал, что это не более безопасно - в лучшем случае это безопасность за счет неизвестности; логика расшифровки должна быть включена в ваше приложение, поэтому, если кто-то захочет ее расшифровать, это все еще возможно. - person marthursson; 18.06.2014