내용 목차
본 장에서는 기본적으로 JEUS 서버를 사용하는 데 있어서 필요한 암호화된 패스워드 및 계정 관리 등 몇 가지 보안 방식에 대해서 간단하게 설명한다. Security 정보는 도메인에 속한 모든 서버가 공유하며, DAS를 통해 설정해야 한다.
JEUS Security에 대한 자세한 내용은 "JEUS Security 안내서"를 참고한다.
JEUS에서 계정은 개인 단위인 User(사용자)와 User들의 집합인 Group(그룹)으로 관리된다.
JEUS의 권한 부여 모델은 Resource(리소스)들에 대한 권한을 Role(역할)이 갖고 Role에 User를 지정하여, Role이 가진 Resource 권한을 User가 갖는 구조이다.
다음은 Role에 User를 지정하는 3가지 방법이다.
Role에 User의 Name을 직접 지정한다.
Role에 User가 속한 Group의 Name을 지정한다.
Role에 User가 속한 Group의 상위 Group의 Name을 지정한다.
계정의 구조가 User, Group, Subgroup 등의 계층을 갖기 때문에 JEUS에서 비슷한 역할을 하는 User에게 한 번에 비슷한 권한을 부여할 수 있다. 보안 정책에 대한 자세한 설정 방법은 “JEUS Security 안내서”의 “2.6. 보안 시스템 정책 설정”을 참고한다.
JEUS 7부터는 시스템 관리를 위한 사용자의 패스워드를 간편하게 암호화하여 저장할 수 있다.
암호화 정보는 다음의 형식으로 저장된다.
{알고리즘}암호문
가능한 암호화 알고리즘은 다음과 같다.
AES
DES
DESede
blowfish
SEED
패스워드 암호화 저장은 WebAdmin 또는 콘솔 툴(jeusadmin)을 사용하거나, 암호화 툴을 통해 직접 설정하는 방법이 있다. 본 절에서는 각 방법에 대해 설명한다.
다음은 WebAdmin을 통해 사용자 계정 패스워드를 설정하는 방법에 대한 예제이다.
WebAdmin 화면 왼쪽의 [Security] 메뉴를 선택한다. Security Manager 화면의 Security Domains 영역의 목록에서 보안 도메인을 선택한다.
[LOCK & EDIT] 버튼을 클릭하여 설정변경 모드로 전환한다. WebAdmin의 설정변경 모드에 대한 자세한 설명은 “JEUS WebAdmin 안내서”의 “2.3.2. 메뉴 영역”을 참고한다.
[Accounts & Policies Management] > [accounts] 메뉴로 이동한 후 Users 영역에서 패스워드를 변경할 사용자명을 선택한다.
다음과 같이 User 화면이 나타나면 'Password' 항목 오른쪽의 [입력] 버튼을 클릭한다.
패스워드 암호화에 적용할 알고리즘을 선택하고, 패스워드를 입력한 뒤 [확인] 버튼을 클릭한다.
사용자의 정보 입력이 완료되면 [확인] 버튼을 클릭한 뒤, 변경 내용의 동적 반영을 위해 [Activate Changes] 버튼을 클릭한다.
자신의 패스워드를 변경한 경우에는 WebAdmin 로그인 화면으로 되돌아가며, 변경한 패스워드로 다시 로그인해야 한다. 다른 계정의 패스워드를 변경한 경우에는 변경 완료 메시지를 확인할 수 있다.
다음은 콘솔 툴(jeusadmin)을 통해 'administrator'라는 계정의 'password'라는 암호를 암호화 알고리즘 'AES'를 사용하여 암호화하고 저장하는 예제이다.
[DAS]domain1.adminServer>set-password administrator password -algorithm AES
The password is set for [administrator].
[DAS]domain1.adminServer>exit
JEUS_HOME/bin$ ./jeusadmin -u administrator -p password
Attempting to connect to 127.0.0.1:9736.
The connection has been established to Domain Administration Server adminServer
in the domain domain1.
JEUS7 Administration Tool
To view help, use the 'help' command.
[DAS]domain1.adminServer>
암호화 툴을 통해 직접 암호화를 수행하여 저장할 수도 있다. 예를 들어 DB 패스워드, accounts.xml 계정들의 패스워드의 경우 일반 문자열 대신 암호화된 문자열로 입력할 수 있다.
암호화된 문자열은 다음의 형식으로 패스워드가 필요한 위치에 설정한다.
{알고리즘}암호문
이러한 암호화된 문자열을 사용하기 위해서는 JEUS가 제공하는 암호화 툴(Encryption Tool)을 사용해야 한다. 암호화 툴은 암호화될 대상이 되는 문자열과 알고리즘을 입력받아 결과물인 암호문을 출력하는데, 그 암호문을 위에서 언급한 형식에 맞춰서 기록한다.
암호화 툴의 사용법에 관한 자세한 사항은 “JEUS Reference Book”의 “4.6. encryption”을 참고한다.
base64 또는 Hash 알고리즘 (sha 등)은 평문이 정해지면 결과값도 항상 동일하게 출력되지만, 그 외의 알고리즘들은 수행하기 위한 비밀 Key(secret key)가 필요하다. 이러한 비밀 Key 관리 방법에 관한 자세한 사항은 “7.3. 비밀 Key 파일 관리”를 참고한다.
다음은 accounts.xml 편집을 통해 암호화된 문자열을 패스워드로 설정하는 예제이다.
[예 7.1] 암호화된 문자열 패스워드 설정 : <<accounts.xml>>
<accounts xmlns="http://www.tmaxsoft.com/xml/ns/jeus"> <users> <user> <name>administrator</name> <password>{base64}amV1czEyMw==</password> </user> <user> <name>user1</name> <password>{AES}i06wYRz3Gqun2sKtXHIq+Tw3vUcc=</password> </user> . . . </users> . . . </accounts>
최초 도메인을 구성했을 때에는 xml을 직접 수정할 수 있으나, 도메인 구성 후에는 WebAdmin이나 콘솔 툴(jeusadmin)을 통해 설정하는 것을 권장한다.
본 절에서는 비밀 Key 파일을 생성하고 관리하는 방법과 비밀 Key 파일의 보호 옵션 및 서버 기동 방법에 대해 설명한다.
JEUS_HOME/bin에 위치한 암호화 툴(Encryption Tool)이 제공하는 AES, DES, DESede, SEED, BlowFish 등의 알고리즘은 암호화, 복호화를 수행하기 위해 비밀 Key가 필요하다. 이를 위해서 JEUS는 비밀 Key 파일을 사용한다. 비밀 Key 파일은 암호화 툴을 처음으로 사용할 때 자동으로 생성되며, 그 이후로는 그 파일을 계속 사용한다.
비밀 Key 파일은 기본적으로 다음 경로의 security.key 파일이다.
JEUS_HOME/domains/<domain-name>/config/security
또는 jeus.security.keypath 시스템 프로퍼티로 지정할 수 있다. 이 경로는 절대 경로, 상대 경로 모두 가능하며, 상대 경로의 기준 경로는 JVM을 실행한 경로이다. 경로를 디렉터리로 지정할 경우에는 해당 디렉터리의 security.key 파일을 이용하며, 파일로 지정할 경우에는 지정된 파일을 사용한다.
JEUS에서는 위에서 언급한 비밀 Key 파일 자체를 보호하는 옵션도 제공한다. 이를 위해서는 비밀 Key 파일을 암호화하기 위한 패스워드가 필요하다. 이를 마스터 패스워드(Master Password)라고 한다. 암호화 툴을 실행할 때 -protectkey 옵션을 입력하면 이 마스터 패스워드를 이용해서 비밀 Key 파일을 보호할 수 있다.
암호화 툴을 통해 마스터 패스워드가 설정되었다면 서버를 기동할 때 반드시 마스터 패스워드가 필요하게 된다.
마스터 패스워드를 입력하는 방법은 다음과 같이 크게 2가지가 있다.
서버를 백그라운드 프로세스로 시작할 경우 시스템 프로퍼티 jeus.security.master로 지정하는 방법
JEUS에서 제공하는 스크립트를 이용하여 시작할 때 콘솔 툴로 입력받는 방법
jeus.security.master로 지정하는 방법은 셸 스크립트에 마스터 패스워드를 입력해야 하므로 보안상 안전하지 않다. 만약 마스터 패스워드를 사용해야 하는 상황이라면 되도록 후자의 방법을 추천한다.
1. 서버 기동에 대한 자세한 내용은 “JEUS Reference Book”의 “제3장 JEUS 서버 실행”을 참고한다.
2. 비밀 Key에 대한 자세한 내용은 “JEUS Reference Book”의 “4.6. encryption”을 참고한다.
본 절에서는 SSL 통신에 사용되는 Keystore와 Truststore의 관리에 대해 간단히 설명한다.
Keystore와 Truststore는 모두 Java Key Store(JKS) 형식으로 본질적으로 동일하며, JDK에서 제공하는 Key 툴을 사용하여 생성 및 관리할 수 있다.
Keystore, Truststore 및 SSL에 대한 자세한 정보를 원한다면 Java SE 문서나 http://www.oracle.com/technetwork/java/index.html에서 JSSE, JKS, Key 툴(keytool) 관련 정보를 찾아볼 수 있다.
JEUS는 기본적으로 다음 경로의 파일들을 각각 Keystore, Truststore로 지정해서 사용하며, Keystore, Truststore가 다른 경로에 혹은 다른 이름으로 존재한다면 이를 직접 설정해야 한다.
설정 방법은 시스템 전체적으로 시스템 프로퍼티로 설정할 수도 있고, Keystore와 Truststore가 필요한 부분에서 각각 설정할 수도 있다. 각각 설정하는 방법은 안내서의 각 파트에 별도로 설명이 되어 있다.
사용하는 시스템 프로퍼티는 다음과 같다.
Keystore와 Truststore를 사용하기 위해서는 패스워드가 필요하며 위에서 설명한 것처럼 JEUS는 Keystore와 Truststore의 패스워드를 설정할 수 있다. 경로를 설정하는 것과 마찬가지로 시스템 프로퍼티로 전체적으로 설정하거나 필요한 부분에서 각각 설정할 수도 있다.
특히 Keystore는 저장소 자체의 패스워드 외에 Keystore 내에 존재하는 Key별로 각각 패스워드가 요구된다. 하지만 대부분의 경우에 이 패스워드들이 Keystore의 패스워드와 동일하기 때문에 JEUS 내부적으로 Keystore 패스워드와 동일하게 사용된다.
Keystore의 Key 패스워드를 저장소 패스워드와 구분해야 하는 경우에는 각 설정에 <keystore-keypassword> 지정하는 태그가 있으므로 이를 지정하여 사용한다. 또한, Keystore 내의 Key들의 패스워드가 서로 다를 경우 해당 Keystore를 이용할 수 없으며 동일 Keystore 내부의 Key들은 모두 동일한 패스워드로 설정되어 있어야 한다.
JEUS를 설치할 때 기본적으로 Keystore와 Truststore가 포함되어 있지만 직접 Keystore와 Truststore를 새로 생성하여 설정하는 것을 권장한다.
본 절에서는 Domain에서 각 서버의 Base Listener를 SSL로 동작하도록 설정하였을 때 각종 실행 스크립트에 추가해야할 설정에 대해서 설명한다.
Domain에 속하는 각 서버들을 SSL로 설정할 경우 서버들 간의 통신은 서버에 설정된 SSL 설정들이 이용되지만, Console Admin 혹은 실행 스크립트 등 클라이언트 입장에서 동작하는 프로세스들에는 SSL 설정이 따로 필요하게 된다.
설정이 필요한 경우는 다음과 같다.
이름 | 설명 |
---|---|
jeusadmin | Console Admin을 실행하기 위한 스크립트 |
startManagedServer | MS를 직접 구동하기 위한 스크립트 |
stopServer | 서버의 동작을 정지시키기 위한 스크립트 |
기타 Standalone Client | 스크립트는 아니나 SSL을 이용하여 서버와 통신해야 하는 Standalone Client |
다음 예제에서 볼드체로 강조된 부분은 스크립트에 추가해야 할 내용이다.
. . . # execute jeusadmin "${JAVA_HOME}/bin/java" -classpath "${BOOTSTRAP_CLASSPATH}" ${TOOL_OPTION} -Djmx.remote.x.request.timeout=600000 -Djava.library.path="${JEUS_LIBPATH}" -Djeus.home="${JEUS_HOME}" -Djeus.baseport=${JEUS_BASEPORT} -Djeus.tool.console.useJLine="false" -Djava.endorsed.dirs="${JEUS_HOME}/lib/endorsed" -Djava.naming.factory.initial=jeus.jndi.JEUSContextFactory -Djava.naming.factory.url.pkgs=jeus.jndi.jns.url -Djava.util.logging.config.file="${JEUS_HOME}/bin/logging.properties" -Djeus.net.client.use-ssl=true -Djavax.net.ssl.trustStore=${JEUS_HOME}/domains/domain1/config/truststore -Djavax.net.ssl.trustStorePassword=changeit -Djavax.net.ssl.trustStoreType=JKS -Dssl.TrustManagerFactory.algorithm=SunX509 -Djavax.net.ssl.keyStore=${JEUS_HOME}/domains/domain1/config/keystore -Djavax.net.ssl.keyStorePassword=changeit -Djavax.net.ssl.keyStoreType=JKS -Dssl.KeyManagerFactory.algorithm=SunX509 ${JAVA_ARGS} jeus.tool.console.ConsoleBootstrapper ${BOOT_PARAMETER}