2014-06-17 2 views
0

나는 tomcat 서버를 향한 apache HTTP 서버가있는 설정이 있습니다. Apache 서버는 인증을 위해 LDAP를 사용합니다.해시 된 비밀번호에 대한 Apache의 LDAP 인증

나는 봄 LDAP 연결하고 사용자를 추가하는 등 사용자 작업을 수행하는 데 사용하는 내장 LDAP 서버 (아파치 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.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> 

아파치의 httpd.conf 기본 인증을 사용하도록 구성되어

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

ISSUE 1 : 말 (클라이언트를 사용하여 LDAP 서버에 로그인하려고 할 때 jexplorer), 해시 된 암호와 일반 텍스트 "secret"를 사용하여 로그인 할 수 있습니다. 어떻게 가능합니까?

이 경우 누군가 내 케이스에서 해시 된 AuthLDAPBindDN 및 AuthLDAPBindPassword를 알게되면 보안 위협 인 전체 액세스 권한으로 LDAP 서버에 동일한 로그인 정보를 사용하여 로그인 할 수있게됩니다.

또한 spring.xml의 암호를 해시 된 암호로 바꾸고 싶습니다. 관리자는 LDAP 비밀번호를 변경할 수 있기 때문에 업데이트 된 해시 암호를 사용하도록 응용 프로그램을 보장하려면 어떻게해야합니까? spring.xml에 하드 코딩 할 때 어떻게해야합니까?

+1

게시하기 전에 미리보기 창을 확인하십시오. [그건 엉망이야] (http://stackoverflow.com/revisions/24266303/1)! –

답변

0

두 번째 질문과 관련하여 : 일반적으로 서버 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> 

봄이 자동으로 물건을 대체 할 다음과 같은 내용으로 프로퍼티 파일을 가지고, 예를 들어, 말 ${} 내에서 등록 정보 파일의 해당 값을 사용하십시오.

<context:property-placeholder> 요소에 두 개의 속성 파일 위치를 지정했으며 여기에 ignore-resource-not-found="true"도 포함되어 있습니다. 이는 간단한 개발 설정을 위해 소스에 등록 정보 파일을 포함 할 수 있기 때문에 유용합니다. 그러나 프로덕션에서는 등록 정보 파일을 /etc/mysystem/ldap.properties 아래에두면 번들 등록 정보 파일의 내용이 대체됩니다.

이렇게하면 프로덕션 환경에서 admin이 비밀번호를 변경하면 등록 정보 파일을 변경하기 만하면됩니다. 응용 프로그램을 다시 빌드 할 필요가 없습니다.

왜 아파치 DS가 해시 된 암호를 허용하는지에 관해서; 한 가지 이유는 LDAP 서버가 읽기 작업을 위해 익명 액세스를 허용하도록 설정 되었기 때문일 수 있습니다. 즉, 읽기만하면 실제로 인증되지 않습니다. 그래도 뭔가 다른 것이있을 수 있습니다, 당신은 아파치 DS 지원에 질문을 지시해야 할 것입니다.

+0

Apache DS 문서에 따르면 일반 암호 대신 해시 된 암호가 전달되는 시나리오에서는 로그인 할 수 없지만 내 경우에는 그렇지 않습니다.두 번째 질문에 관해서는, 물건을 속성 파일로 옮기는 것이 좋은 선택이지만 LDAP에 연결하는 경우에도 속성 파일에 저장하고 싶지 않은 일반 텍스트를 전달해야한다는 것에 동의합니다. Spring에서 속성 파일 (암호화 된 암호 저장)을 읽고, 가져온 값을 처리하여 해독하고 spring.xml의 Ldap 구성에 전달할 수있는 방법이 있습니까? – Varun

+0

사용자 정의 [BeanFactoryPostProcessor] (http : //docs.spring.io/spring/docs/4.0.5.RELEASE/spring-framework-reference/htmlsingle/#beans-factory-extension-factory-postprocessors). 속성 대체 전략 (예 :'% hashedPassword %')과 유사한 사용자 지정 구문을 정의하고 BeanFactoryPostProcessor가 이러한 속성 값을 식별하고 시작할 때 암호 해독하도록합니다. 그러나 저는 이것이 더 안전하지 않다고 주장 할 것입니다 - 기껏해야 그것은 무명에 의한 보안입니다; 복호화 논리를 응용 프로그램에 포함시켜야 암호 해독을 원한다면 여전히 가능합니다. – marthursson