Apache针对哈希密码的LDAP身份验证

时间:2014-06-17 14:22:24

标签: java apache authentication hash spring-ldap

我有一个面向tomcat服务器的apache HTTP服务器的设置。 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:当尝试使用客户端(比如jexplorer)登录ldap服务器时,我能够使用Hashed密码和使用纯文本&#34; secret&#34;进行登录。怎么可能?

在这种情况下,如果有人知道AuthLDAPBindDN和AuthLDAPBindPassword(在我的情况下是哈希的),他们将能够使用相同的LDAP服务器登录,并具有完全访问权限,这是一种安全威胁。

另外,我想用springhed替换spring.xml中的密码。由于admin可以更改LDAP密码,我如何确保我的应用程序使用更新的散列密码,因为我们在spring.xml中对其进行了硬编码?

1 个答案:

答案 0 :(得分:0)

关于第二个问题:您通常不应在XML文件中对服务器URL,用户名,密码等内容进行硬编码。通常应将这些内容外部化为属性文件并使用<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下放置属性文件,这将覆盖捆绑属性文件中的内容。 / p>

这样,如果生产环境中的admin更改了密码,您只需更改属性文件即可;您无需重建应用程序。

关于apache DS接受散列密码的原因;一个原因可能是您的LDAP服务器设置为接受读取操作的匿名访问,这意味着当您刚刚阅读时它实际上根本不进行身份验证。可能是其他的东西,你必须将问题引导到Apache DS支持。

相关问题