 |
|
난이도 : 중급 Krishnakumar Balachandar, Software Engineer, WebSphere Application Server Community Edition Support Team, IBM
2006 년 7 월 03 일 LDAP 영역을 설정하는 Tivoli Directory Server를 사용하여 WAS CE용 사용자 인증과 권한을 구현하는 방법을 배워봅시다.
머리말
IBM WebSphere Application Server Community Edition은 Apache Geronimo에 기반한 Java® 2 Platform, Enterprise Edition (J2EE) 애플리케이션 서버이다. 본 장에서는 사용자 인증과 권한에 IBM Tivoli Directory Server V 6.0 (이후, Directory Server)과 IBM WebSphere Community Edition 1.0.1 (이후 Community Edition )를 사용하는 방법을 설명한다. Community Edition에 전개될 애플리케이션을 위해 Directory Server를 사용하여 LDAP 영역을 설정하고자 하는 J2EE 애플리케이션 개발자들에게 도움이 될 것이다.
애플리케이션 서버는 파일, 데이터베이스, LDAP, 또는 기타 사용자 레지스트리에 기반한 리파지토리에 크리덴셜을 저장한다. LDAP 리파지토리는 사용자들과 관련된 정적 정보를 저장하고 엔터프라이즈 내 모든 애플리케이션들에 사용될 수 있다. 이 글에서는 Community Edition에 LDAP 영역을 설정할 때 Directory Server를 사용하는 방법을 설명한다. Directory Server에 LDAP 엔트리를 사용하는 샘플 애플리케이션도 전개 해 보겠다.
LDAP Records
LDAP를 사용하여 ID, 주소, 전화번호, 역할, 패스워드 같은 사용자 정보를 저장할 수 있다. 이 데이터는 계층의 뿌리에서부터 시작하는 나무 구조로 구성된다. Listing 1은 LDAP 사용자 레코드 샘플이다.
Listing 1. LDAP 사용자 레코드 샘플
dn: uid=guest1,ou=people,dc=ibm,dc=com
objectclass: ePerson
objectclass: inetOrgPerson
cn: guest1
sn: guest1
displayName: Guest
uid: guest
userpassword: welcome
ou: people
|
Listing 1의 레코드는 Guest1이라는 사용자의 것이다. 사용자 아이디는 guest1이고 패스워드는 welcome이다. ePerson의 LDAP 레코드는 주소, 전화번호 등의 기타 사용자 정보를 저장한다.
LDAP 트리에서 만들어진 사용자들을 역할에 기반하여 그룹핑 할 수 있다. 예를 들어, admin 역할 밑에 관리자 권한을 가진 모든 사용자들을 그룹핑 할 수 있다. Listing 2는 역할에 따라 그룹핑 된 사용자들(user1, user2)이다.
Listing 2. 역할로 나뉜 사용자들
dn: cn=users,ou=groups, dc=ibm,dc=com
objectClass: groupOfUniqueNames
uniqueMember: cn=user2,cn=user1,ou=groups,dc=ibm,dc=com
cn: users
|
이전 두 개의 LDAP 엔트리와 마찬가지로 사용자들과 역할들을 매핑하는 복잡한 구조를 만들 수 있다. 이러한 상세들을 LDIF 파일에 저장할 수 있고 LDAP 서버에 업로드 할 수 있다. 이 글에서 사용한 샘플 애플리케이션에는 그림 1에 보이는 LDAP 구조를 가진 LDIF 파일이 포함되어 있다.
그림 1. LDAP 구조
Tivoli Directory Server 설정하기
이 섹션에서는 Tivoli Directory Server를 설정해 보도록 하겠다.
같은 머신 상에 개별 제품으로서 Tivoli Directory Server를 설치할 수 있다. 애플리케이션 서버로서 설치할 수 있고 또는 다른 머신에 설치할 수도 있다. 기본적으로 389 포트에서 사용할 수 있다. Tivoli Directory Server는 서버 상에서 연산을 수행하는 유틸리티를 제공한다. 웹 터페이스(http://localhost:12100/IDSWebApp/IDSjsp/IDSConsoleFrameWork.jsp)를 통해서 이러한 연산들을 호출하지만 IBM Tivoli Directory Server를 설치했을 때 WebSphere Application Server – Express를 설치해야 한다.
IBM Tivoli Directory Server를 시작하고 LDIF 파일을 서버에 업로드 하려면 Listing 3의 명령어를 입력하라.
Listing 3. Directory Server 명령어
adding suffix : idscfgsuf -s dc=ibm,dc=com
start itds : ibmslapd
add ldap entries from ldif : ldapadd -h ldap://<ldaphostname> -D "cn=root" -w
"********" -f <ldif_directory_path><filename>.ldif
|
그림 2는 Directory Server에 만들어진 LDAP 엔트리를 보여준다.
그림 2. Directory Server의 LDAP 엔트리
웹 애플리케이션 보안과 LDAP
웹 애플리케이션 보안은 인증과 권한으로 구성된다. 전개 디스크립터에 이것을 정의한다. 전개 디스크립터 내에서 인증과 권한을 위한 특정 영역들을 설정할 수 있다. LDAP를 사용하려면 인증을 FORM 기반으로 정의해야 하고 LDAP를 호출하여 사용자 아이디와 크리덴셜을 검사한다.
이와 비슷하게 전개 디스크립터에 정의된 역할들을 기반으로 사용자들을 그룹핑 하고 LDAP 서버에 상응하는 엔트리들을 만들 수 있다. 그림 3은 웹 전개 디스크립터에 있는 보안 제약조건과 역할들을 보여준다. WebSphere Application Server Community Edition의 경우 "Geronimo" 플랜이고 LDAP에 있는 이들의 매핑이다.
그림 3. 보안 제약조건과 역할 매핑
LDAP 영역을 위해 Community Edition Plan 만들기
WebSphere Application Server Community Edition에서 LDAP를 사용하려면 영역 플랜을 만들어야 한다. 그런 다음 이 플랜을 서버에 전개하거나 애플리케이션이나 모듈의 범위 안에 전개할 수 있다. Listing 4는 Community Edition용 LDAP 영역 플랜 샘플을 보여주고 있다.
Listing 4. LDAP 영역 플랜
<?xml version="1.0" encoding="UTF-8"?>
<configuration
xmlns="http://geronimo.apache.org/xml/ns/deployment-1.0"
configId="org/apache/geronimo/ldap-secure"
>
<gbean name="ldap-login"
class="org.apache.geronimo.security.jaas.LoginModuleGBean">
<attribute name="loginModuleClass">
org.apache.geronimo.security.realm.providers.LDAPLoginModule</attribute>
<attribute name="serverSide">true</attribute>
<attribute name="options">
initialContextFactory=com.sun.jndi.ldap.LdapCtxFactory
connectionURL=ldap://<host>:389
connectionUsername=cn=root
connectionPassword=*******
connectionProtocol=
authentication=simple
userBase=ou=people,dc=ibm,dc=com
userSearchMatching=uid={0}
userSearchSubtree=false
roleBase=ou=groups,dc=ibm,dc=com
roleName=cn
roleSearchMatching=(uniqueMember={0})a
roleSearchSubtree=false
userRoleName=
</attribute>
<attribute name="loginDomainName">ldap-realm</attribute>
</gbean>
<gbean name="ldap-realm"
class="org.apache.geronimo.security.realm.GenericSecurityRealm">
<attribute name="realmName">ldap-realm</attribute>
<reference name="LoginModuleConfiguration">
<name>ldap-login</name>
</reference>
<reference name="ServerInfo">
<module>geronimo/j2ee-system/1.0/car</module>
<name>ServerInfo</name>
</reference>
<reference name="LoginService">
<module>geronimo/j2ee-security/1.0/car</module>
<name>JaasLoginService</name></reference>
</gbean>
<gbean name="ldap-login" class="org.apache.geronimo.security.jaas.JaasLoginModuleUse">
|-------- XML error: The previous line is longer than the max of 90 characters ---------|
<attribute name="controlFlag">REQUIRED</attribute>
<reference name="LoginModule">
<name>ldap-login</name>
</reference>
</gbean>
</configuration>
|
LDAP 영역 플랜은 세 개의 Gbean들로 구성된다. 이것이 전개되면 JAAS를 설정하여 LDAP 서버에 연결하고 사용자 크리덴셜을 가져올 때 LDAPLoginModule을 사용한다. 사용자 상세를 알고 싶으면 이 쿼리를 사용한다. userSearchMatching=uid={0} and roleSearchMatching=(uniqueMember={0}). 이러한 엔트리에 기반하여 LDAPLoginModule은 사용자와 역할들을 가져온다.
Community Edition 콘솔이나 전개 툴을 사용하여 LDAP 영역을 전개할 수 있다.
java -jar bin\deployer.jar deploy ldap-realm-ibm.xml
LDAP 영역이 전개되었으니, 이 LDAP 영역을 사용할 LDAP 웹 애플리케이션을 설정해야 한다. Listing 5에서처럼 geronimo-web.xml 플랜 파일에 상세들을 추가한다.
Listing 5. geronimo-web.xml 플랜
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://geronimo.apache.org/xml/ns/web"
xmlns:sec="http://geronimo.apache.org/xml/ns/security"
configId="org/apache/geronimo/ldap-secure-demo"
parentId="org/apache/geronimo/ldap-secure">
<context-root>/ldap-demo</context-root>
<context-priority-classloader>false</context-priority-classloader>
<container-config container="Tomcat">
<config-param name="TomcatRealm">TomcatJAASRealm</config-param>
</container-config>
<security-realm-name>ldap-realm</security-realm-name>
<security>
<default-principal realm-name="ldap-realm">
<principal class="org.apache.geronimo.security.realm.providers.GeronimoUserPrincipal"
name="system" />
</default-principal>
<role-mappings>
<role role-name="admin">
<realm realm-name="ldap-realm">
<principal class="org.apache.geronimo.security.realm.providers.GeronimoGroupPrincipal"
name="admin" designated-run-as="true" />
<principal class="org.apache.geronimo.security.realm.providers.GeronimoUserPrincipal"
name="system" />
</realm>
</role>
<role role-name="users">
<realm realm-name="ldap-realm">
<principal class="org.apache.geronimo.security.realm.providers.GeronimoGroupPrincipal"
name="users" designated-run-as="true" />
<principal class="org.apache.geronimo.security.realm.providers.GeronimoUserPrincipal"
name="user1" />
<principal class="org.apache.geronimo.security.realm.providers.GeronimoUserPrincipal"
name="user2" />
</realm>
</role>
<role role-name="guest">
<realm realm-name="ldap-realm">
<principal class="org.apache.geronimo.security.realm.providers.GeronimoGroupPrincipal"
name="guest" designated-run-as="true" />
<principal class="org.apache.geronimo.security.realm.providers.GeronimoUserPrincipal"
name="guest1" />
</realm>
</role>
</role-mappings>
</security>
</web-app>
|
geronimo-web 플랜에 있는 역할들은 웹 전개 디스크립터와 LDAP 그룹에서 만들어진 그것과 맞아야 한다.
웹 애플리케이션은 EAR 파일로 패키지 되고 샘플 ZIP 파일(LDAPExample.ear)에서 사용할 수 있다. Community Edition 콘솔을 사용하여 이를 전개한다.
샘플 애플리케이션 사용하기
이전 섹션에서 LDAP 영역을 만들었고 이 영역을 사용하는 웹 애플리케이션을 설정했다. 그리고 애플리케이션과 영역들을 전개했다. 웹 애플리케이션에 액세스 하려면 다음 URL을 입력하라. http://localhost:8080/LDAPWeb 이제 웹 애플리케이션에 로그인 할 수 있다. LDAP 디렉토리에서 엔트리들을 검색하여 사용자 아이디와 크리텐셜을 확인한다. 로그인 할 때, 애플리케이션은 웹 전개 디스크립터에 정의된 역할들에 기반하여 보호 리소스들에 대한 액세스를 체크한다.
결론
Directory Server에 사용자 레코드를 만들고 Community Edition에 LDAP 영역을 전개해 보았다. 샘플 웹 애플리케이션을 사용하여 LDAP 영역을 사용하여 사용자 크리덴셜과 역할들을 얻는 방법을 설명했다.
기사의 원문보기
다운로드 하십시오 | 설명 | 이름 | 크기 | 다운로드 방식 |
|---|
| Sample Web application | wasce-ldap-sample.zip | 25 KB |
FTP | HTTP |
참고자료 교육
제품 및 기술 얻기
토론
필자소개  | 
|  | Krishnakumar Balachandar는 인도 IBM 소프트웨어 연구실 소속의 소프트웨어 엔지니어이다. Geronimo와 WebSphere Community Edition 지원 팀에도 속해있다. (krishnakumarb@in.ibm.com) |
기사에 대한 평가
|