Security 관리
본 장에서는 기본적으로 JEUS 서버를 사용하는 데 있어서 필요한 암호화된 패스워드 및 계정 관리 등 몇 가지 보안 방식에 대해서 간단하게 설명한다. Security 정보는 도메인에 속한 모든 서버가 공유하며, MASTER를 통해 설정해야 한다.
JEUS Security에 대한 자세한 내용은 JEUS Security 안내서를 참고한다. |
1. 계정 관리
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. 패스워드 암호화 저장
시스템 관리를 위한 사용자의 패스워드를 간편하게 암호화하여 저장할 수 있다.
암호화 정보는 다음의 형식으로 저장된다.
{알고리듬}암호문
가능한 암호화 알고리듬은 다음과 같다.
-
AES
-
DES
-
DESede
-
blowfish
-
SEED
패스워드 암호화 저장은 콘솔 툴(jeusadmin)을 사용하거나, 암호화 툴을 통해 직접 설정하는 방법이 있다. 본 절에서는 각 방법에 대해 설명한다.
2.1. 콘솔 툴 사용
다음은 콘솔 툴(jeusadmin)을 통해 'administrator’라는 계정의 'password’라는 암호를 암호화 알고리듬 'AES’를 사용하여 암호화하고 저장하는 예제이다.
[MASTER]domain1.adminServer>set-password administrator password -algorithm AES The password is set for [administrator]. [MASTER]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 JEUS Master Server [adminServer] in the domain domain1. JEUS 9 Administration Tool To view help, use the 'help' command.
2.2. 암호화 툴을 통한 직접 설정
암호화 툴을 통해 직접 암호화를 수행하여 저장할 수도 있다. 예를 들어 DB 패스워드, accounts.xml 계정들의 패스워드의 경우 일반 문자열 대신 암호화된 문자열로 입력할 수 있다.
암호화된 문자열은 다음의 형식으로 패스워드가 필요한 위치에 설정한다.
{알고리듬}암호문
이러한 암호화된 문자열을 사용하기 위해서는 JEUS가 제공하는 암호화 툴(Encryption Tool)을 사용해야 한다. 암호화 툴은 암호화될 대상이 되는 문자열과 알고리듬을 입력받아 결과물인 암호문을 출력하는데, 그 암호문을 위에서 언급한 형식에 맞춰서 기록한다.
암호화 툴의 사용법에 관한 자세한 사항은 JEUS Reference 안내서의 encryption을 참고한다. |
base64 또는 Hash 알고리듬(sha 등)은 평문이 정해지면 결과값도 항상 동일하게 출력되지만, 그 외의 알고리듬들은 수행하기 위한 비밀 Key(secret key)가 필요하다. 이러한 비밀 Key 관리 방법에 관한 자세한 사항은 비밀 Key 파일 관리를 참고한다.
다음은 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)을 직접 수정할 수 있으나, 도메인 구성 후에는 콘솔 툴(jeusadmin)을 통해 설정하는 것을 권장한다. |
3. 비밀 Key 파일 관리
본 절에서는 비밀 Key 파일을 생성하고 관리하는 방법과 비밀 Key 파일의 보호 옵션 및 서버 기동 방법에 대해 설명한다.
3.1. 비밀 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 파일을 이용하며, 파일로 지정할 경우에는 지정된 파일을 사용한다.
3.2. 비밀 Key 파일 보호 옵션과 서버 기동 방법
JEUS에서는 위에서 언급한 비밀 Key 파일 자체를 보호하는 옵션도 제공한다. 이를 위해서는 비밀 Key 파일을 암호화하기 위한 패스워드가 필요하다. 이를 마스터 패스워드(Master Password)라고 한다. 암호화 툴을 실행할 때 -protectkey 옵션을 입력하면 이 마스터 패스워드를 이용해서 비밀 Key 파일을 보호할 수 있다.
암호화 툴을 통해 마스터 패스워드가 설정되었다면 서버를 기동할 때 반드시 마스터 패스워드가 필요하게 된다.
마스터 패스워드를 입력하는 방법은 다음과 같이 크게 2가지가 있다.
-
서버를 백그라운드 프로세스로 시작할 경우 시스템 프로퍼티 jeus.security.master로 지정하는 방법
-
JEUS에서 제공하는 스크립트를 이용하여 시작할 때 콘솔 툴로 입력받는 방법
jeus.security.master로 지정하는 방법은 셸 스크립트에 마스터 패스워드를 입력해야 하므로 보안상 안전하지 않다. 만약 마스터 패스워드를 사용해야 하는 상황이라면 되도록 후자의 방법을 추천한다.
|
4. Keystore와 Truststore 관리
본 절에서는 SSL 통신에 사용되는 Keystore와 Truststore의 관리에 대해 간단히 설명한다.
Keystore와 Truststore는 모두 Java Key Store(JKS) 형식으로 본질적으로 동일하며, JDK에서 제공하는 Key 툴을 사용하여 생성 및 관리할 수 있다.
Keystore, Truststore 및 SSL에 대한 자세한 정보를 원한다면 Java SE 문서나 Oracle Java 기술 문서에서 JSSE, JKS, Key 툴(keytool) 관련 정보를 찾아볼 수 있다. |
JEUS는 기본적으로 다음 경로의 파일들을 각각 Keystore, Truststore로 지정해서 사용하며, Keystore, Truststore가 다른 경로에 혹은 다른 이름으로 존재한다면 이를 직접 설정해야 한다.
-
Keystore
Keystore는 개인 Key(Private Key)들만 별도로 모아서 저장해 놓은 저장소이다.
JEUS_HOME/domains/<domain-name>/config/security/keystore 파일
-
Truststore
Truststore는 공개 Key(Public Key)들만 별도로 모아서 저장해 놓은 저장소이다.
JEUS_HOME/domains/<domain-name>/config/security/truststore 파일
설정 방법은 시스템 전체적으로 시스템 프로퍼티로 설정할 수도 있고, Keystore와 Truststore가 필요한 부분에서 각각 설정할 수도 있다. 각각 설정하는 방법은 안내서의 각 파트에 별도로 설명이 되어 있다.
사용하는 시스템 프로퍼티는 다음과 같다.
시스템 프로퍼티 | 설명 |
---|---|
jeus.ssl.keystore |
SSL에서 사용하는 Keystore 파일 경로를 설정한다. (기본값: JEUS_HOME/domains/<domain-name>/config/security/keystore) |
jeus.ssl.truststore |
SSL에서 사용하는 Truststore 파일 경로를 설정한다. (기본값: JEUS_HOME/domains/<domain-name>/config/security/truststore) |
jeus.ssl.keypass |
SSL에서 사용하는 Keystore 패스워드를 설정한다. (기본값: jeuskeypass) |
jeus.ssl.trustpass |
SSL에서 사용하는 Truststore 패스워드를 설정한다. (기본값: jeustrustpass) |
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를 새로 생성하여 설정하는 것을 권장한다. |
5. SSL이 설정된 도메인에서의 실행 스크립트 관리
본 절에서는 도메인에서 각 서버의 Base Listener를 SSL로 동작하도록 설정하였을 때 각종 실행 스크립트에 추가해야할 설정에 대해서 설명한다.
도메인에 속하는 각 서버들을 SSL로 설정할 경우 서버들 간의 통신은 서버에 설정된 SSL 설정들이 이용되지만, 콘솔 툴 혹은 실행 스크립트 등 클라이언트 입장에서 동작하는 프로세스들에는 SSL 설정이 따로 필요하게 된다.
다음의 경우 SSL 설정이 필요하다.
구분 | 설명 |
---|---|
jeusadmin |
콘솔 툴을 실행하기 위한 스크립트 |
startManagedServer |
MS를 직접 구동하기 위한 스크립트 |
stopServer |
서버의 동작을 정지시키기 위한 스크립트 |
기타 Standalone Client |
스크립트는 아니지만 SSL을 이용하여 서버와 통신해야 하는 Standalone Client |
다음 예제에서 볼드체로 강조된 부분은 스크립트에 추가해야 할 내용이다.
. . . # execute jeusadmin "${JAVA_HOME}/bin/java" -Xmx128m -classpath "${BOOTSTRAP_CLASSPATH}" ${TOOL_OPTION} -Djmx.remote.x.request.timeout=600000 -Djeus.home="${JEUS_HOME}" -Djeus.baseport=${JEUS_BASEPORT} -Djeus.tool.console.useJLine="false" -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 -Djeus.security.keypath=${JEUS_HOME}/domains/domain1/config/security/security.key ${JAVA_ARGS} jeus.tool.console.ConsoleBootstrapper ${BOOT_PARAMETER}
또는 다음과 같이 대부분의 설정을 별도의 파일에 명시한 후 해당 파일을 지칭할 수 있다.
. . . # execute jeusadmin "${JAVA_HOME}/bin/java" -Xmx128m -classpath "${BOOTSTRAP_CLASSPATH}" ${TOOL_OPTION} -Djmx.remote.x.request.timeout=600000 -Djeus.home="${JEUS_HOME}" -Djeus.baseport=${JEUS_BASEPORT} -Djeus.tool.console.useJLine="false" -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.ssl-properties-file=ssl.properties ${JAVA_ARGS} jeus.tool.console.ConsoleBootstrapper ${BOOT_PARAMETER}
다음은 SSL과 관련된 클라이언트 설정을 별도 파일에 명시한 예제이다. 파일에 설정을 할 경우에는 ${JEUS_HOME}으로 시작하는 상대 경로는 사용할 수 없으므로 주의한다.
javax.net.ssl.keyStore=/Users/tmax/JEUS9/domains/domain1/config/keystore javax.net.ssl.trustStore=/Users/tmax/JEUS9/domains/domain1/config/truststore javax.net.ssl.keyStorePassword=jeus javax.net.ssl.trustStorePassword={AES}i06wYRz3Gqun2sKtXHIq+Tw3vUcc= jeus.ssl.keystorekeypass={base64}amV1czEyMw== jeus.security.keypath=/Users/tmax/JEUS9/domains/domain1/config/security/security.key
password가 들어가는 property 항목에는 accounts.xml에 사용되는 것과 동일한 방식으로 인코딩 혹은 암호화된 문자열을 사용할 수 있다. 이때는 JEUS에서 제공하는 암호화 툴을 사용하도록 한다.
암호화 툴 사용법에 대한 자세한 사항은 JEUS Reference 안내서의 encryption을 참고한다. |