我有一个面向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中对其进行了硬编码?
答案 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支持。