제5장 Security 관리

내용 목차

5.1. 암호화된 패스워드 설정 방법
5.2. 비밀 키 파일 관리
5.2.1. 파일의 생성과 관리
5.2.2. 파일 보호 옵션과 JEUS 기동 방법
5.3. keystore/truststore 관리
5.4. 계정 관리 방법

본 장에서는 기본적으로 JEUS 서버를 사용하는 데 있어서 필요한 암호화된 패스워드 및 계정 관리 등 몇 가지 보안 방식에 대해서 간단하게 설명한다.

참고

JEUS Security에 대한 자세한 내용은 "JEUS Security 안내서"를 참고한다.

5.1. 암호화된 패스워드 설정 방법

JEUS 설정 파일에 기록해야 하는 패스워드값에 대해 암호화를 지원한다.

예를 들어 데이터베이스 패스워드, accounts.xml 계정들의 패스워드의 경우 일반 문자열 대신 암호화된 문자열로 적을 수 있도록 하는 것이다. 암호화된 문자열로 설정하는 방법은 "{알고리즘}암호문" 형식으로 패스워드가 필요한 곳에 설정하면 된다.

이러한 암호화된 문자열을 사용하기 위해서는 JEUS가 제공하는 암호화 툴(Encryption Tool)을 사용해야 한다. 암호화 툴은 암호화될 대상이 되는 문자열과 알고리즘을 입력받아 결과물인 암호문을 출력하는데 그 암호문을 위에서 언급한 형식에 맞춰서 기록한다.

참고

암호화 툴의 사용법에 관한 자세한 사항은 JEUS Reference Book”의 “4.6. encryption”을 참고한다.

base64 또는 Hash Algorism(sha 등)은 평문이 정해지면 결과값도 항상 똑같게 나오게 되지만, 그 외의 알고리즘들은 수행하기 위한 비밀 키(secret key)가 필요하다. 이러한 비밀 키 관리 방법에 관한 자세한 사항은 “5.2. 비밀 키 파일 관리”를 참고한다.

다음은 암호화된 문자열을 패스워드로 설정하는 예제이다.

[예 5.1] 암호화된 문자열 패스워드 설정 : <<accounts.xml>>

<accounts xmlns="http://www.tmaxsoft.com/xml/ns/jeus">
    <users>
        <user>
            <name>administrator</name>
            <password>{base64}amV1czEyMw==</password>
        </user>
        <user>
            <name>javajoe</name>
            <password>{AES}i06wYRz3Gqun2sKtXHIq+Tw3vUcc=</password>
        </user>
        . . .
    </users>
    . . .
</accounts>


[예 5.2] 암호화된 문자열 패스워드 설정 : <<JEUSMain.xml>>

<jeus-system xmlns="http://www.tmaxsoft.com/xml/ns/jeus">
    . . .
    <resource>
        <data-source>
            <database>
                <export-name>datasource1</export-name>
                . . .
                <user>scott</user>
                <password>{DES}Yz3GTtzH+Tw3vR60i=</password>
                . . .
            </database>
            . . .
        </data-source>
        . . .
    </resource>
</jeus-system>


[예 5.3] 암호화된 문자열 패스워드 설정 : <<WEBMain.xml>>

<web-container xmlns="http://www.tmaxsoft.com/xml/ns/jeus">
    . . .
    <context-group>
    . . .
        <webserver-connection>
            <http-listener>
                <port>8089</port>
                . . .
                <thread-pool>
                    . . .
                </thread-pool>
                . . .
                <ssl-config>
                    <enable-secure>true</enable-secure>
                    . . .
                    <keystore-pass>
                    {desede}Cb7TML6654mUvOhBh9MzVDnW8ZE
                    </keystore-pass>
                    <keystore-keypassword>
                    {desede}Cb7TML6654mUvOhBh9MzVDnW8ZE
                    </keystore-keypassword>
                    . . .
                    <truststore-pass>
                    {desede}Cb7TML6654mUvOhBh9MzVDnW8ZE
                    </truststore-pass>
                    . . .
                </ssl-config>
            </http-listener>
            . . .
        </webserver-connection>
        . . .
    </context-group>
    . . .
</web-container>


5.2. 비밀 키 파일 관리

5.2.1. 파일의 생성과 관리

암호화 툴(Encryption Tool)에서 제공하는 AES, DES, DESede, SEED, BlowFish 등의 알고리즘은 암호화, 복호화를 수행하기 위해 비밀 키가 필요하다. 이를 위해서 JEUS는 비밀 키 파일을 사용한다. 비밀 키 파일은 암호화 툴을 처음으로 사용할 때 자동으로 생성되며, 그 이후로는 계속 그 파일을 사용한다.

비밀 키 파일은 기본적으로 JEUS_HOME/config/<node>/securitysecurity.key 파일이다. 또는 jeus.security.keypath 시스템 프로퍼티로 지정할 수 있다. 이 경로는 절대 경로, 상대 경로 모두 가능하며, 상대 경로의 기준 경로는 JVM을 실행한 경로이다. 경로를 디렉터리로 지정할 경우 해당 디렉터리의 security.key 파일을 이용하며, 파일로 지정할 경우에는 지정된 파일을 사용한다.

5.2.2. 파일 보호 옵션과 JEUS 기동 방법

JEUS에서는 위에서 언급한 비밀 키 파일 자체를 보호하는 옵션도 제공한다. 이를 위해서는 비밀 키 파일을 암호화하기 위한 패스워드가 필요하다. 이를 마스터 패스워드(master password)라고 한다. 이 마스터 패스워드를 이용해서 비밀 키 파일을 보호하는 방법은 암호화 툴을 실행할 때 -protectkey 옵션을 입력한다. 그리고 비밀 키 파일을 보호하는 옵션을 사용하면 JEUS를 기동할 때 반드시 마스터 패스워드가 필요하다.

마스터 패스워드를 입력하는 방법은 크게 2가지가 있다.

  • JEUS를 백그라운드(background) 프로세스로 띄울 경우 시스템 프로퍼티 jeus.security.master로 지정하는 방법

  • JEUS를 포그라운드(foreground) 프로세스로 띄울 경우 [-protectkey] 옵션을 명시하고 콘솔로 입력받는 방법

jeus.security.master로 지정하는 방법은 셸 스크립트에 마스터 패스워드는 입력해야 하므로 보안상 안전하지 않다. 만약 마스터 패스워드를 사용해야 하는 상황이라면 되도록 후자의 방법을 추천한다. 백그라운드 프로세스는 콘솔 입력을 받을 수 없기 때문에 백그라운드 프로세스로 띄우면서 [-protectkey] 옵션을 사용할 수 없다.

참고

1. JEUS 기동에 관한 사항은 JEUS Reference Book”의 “3.1. 사용법”을 참고한다.

2. 비밀 키에 관한 자세한 사항은 JEUS Reference Book”의 “4.6. encryption”을 참고한다.

5.3. keystore/truststore 관리

본 절에서는 SSL 통신에 사용되는 keystore 및 truststore에 관리에 관해 간단히 설명한다.

본질적으로 keystore와 truststore는 모두 Java Key Store(JKS) 형식으로 동일하다. 다만 개인키(private key)들만 따로 모아서 만든 저장소를 keystore, 공개키(public key)들만 따로 모아서 만든 저장소를 truststore라고 한다.

이 저장소들은 JDK에서 제공하는 keytool을 이용하여 생성 및 관리할 수 있으며, keystore, truststore 및 SSL에 대해 더 많은 정보를 원한다면 Java SE 문서나 java.sun.com에서 JSSE, JKS, keytool 관련된 정보를 찾아볼 수 있다.

JEUS는 기본적으로 JEUS_HOME\config\<node>\keystore 파일, JEUS_HOME\config\<node>\truststore 파일을 각각 keystore와 truststore로 지정해서 사용한다. keystore와 truststore가 다른 경로에 또는 다른 이름으로 존재한다면 이를 직접 설정해 주어야 한다. 설정 방법은 시스템 전체적으로 시스템 프로퍼티로 설정할 수도 있고, keystore와 truststore가 필요한 부분에서 각각 설정할 수도 있다. 각각 설정하는 방법은 안내서의 각 파트에 따로 설명이 되어 있다.

사용하는 시스템 프로퍼티는 다음과 같다.

시스템 프로퍼티설명
jeus.ssl.keystore

SSL에서 사용하는 keystore 파일 경로를 설정한다.

(기본값: JEUS_HOME\config\<node>\keystore)

jeus.ssl.truststore

SSL에서 사용하는 truststore 파일 경로를 설정한다.

(기본값: JEUS_HOME\config\<node>\truststore)

jeus.ssl.keypass

SSL에서 사용하는 keystore 패스워드를 설정한다.

(기본값: jeuskeypass)

jeus.ssl.trustpass

SSL에서 사용하는 truststore 패스워드를 설정한다.

(기본값: jeustrustpass)

keystore와 truststore를 사용하기 위해서는 패스워드가 필요하며 따라서 위처럼 JEUS는 keystore와 truststore의 패스워드를 설정할 수 있다. 경로와 마찬가지로 시스템 프로퍼티로 전체적으로 설정하거나 필요한 부분에서 각각 설정할 수도 있다. 특히 keystore는 저장소 자체의 패스워드 외에 keystore 내에 존재하는 키별로 각각 패스워드가 요구된다. 하지만 대부분의 경우에 이 패스워드들이 keystore의 패스워드와 동일하기 때문에 JEUS 내부적으로 keystore 패스워드와 같게 사용된다.

keystore의 키 패스워드를 저장소 패스워드와 구분해야 될 경우에는 각 설정에 keystore keypassword 지정하는 태그가 있으므로 이를 지정하여 사용한다. 그리고 keystore 내의 키들의 패스워드가 서로 다를 경우 해당 keystore를 이용할 수 없으며 동일 keystore 내부의 키들은 모두 같은 패스워드로 설정되어 있어야 한다.

주의

JEUS를 설치할 때 기본적으로 keystore와truststore가 포함되어 있지만, 사이트에서는 사이트용 keystore와 truststore를 새로 만들어 설정하는 게 좋다.

5.4. 계정 관리 방법

JEUS는 도메인별로 계정을 관리하게 되는데, 계정 저장소로 XML 저장소를 사용할 경우 다음의 경로에 계정을 설정해야 한다.

JEUS_HOME\config\<node>\security\<domain>\accounts.xml

다른 저장소를 사용하더라도 계정을 관리하는 기본적인 구조는 비슷한 경우가 많으므로 여기서는 XML을 설정하는 경우만 설명한다. JEUS에서 계정은 개인 단위인 사용자(이하 user)와 개인들의 집합인 그룹(이하 group)으로 관리된다. 따라서, accounts.xml에서 설정할 수 있는 태그는 크게 <users><groups> 2가지로 나누어진다.

다음 예제는 계정을 설정하는 예제이며 <user> 태그의 <name>, <password>만이 필수 태그이고 나머지는 옵션이다.

[예 5.4] <<accounts.xml>>

<accounts xmlns="http://www.tmaxsoft.com/xml/ns/jeus">
    <users>
        <user>
            <description>server administrator's account</description>
            <name>system</name>
            <password>{base64}amV1czEyMw==</password>
            <group>administrators</group>
        </user>
        <user>
            <description>application manager's account</description>
            <name>manager</name>
            <password>{aes}M94siKqwZNWKZd6N7W/UXjFnuQ=</password>
            <group>administrators</group>
        </user>
        <user>
            <name>steve</name>
            <password>{aes}9k44ZY4pV8Z+/4Zl1bBtVT7CYgVndAhU=</password>
            <group>developer</group>
        </user>
        <user>
            <name>alice</name>
            <password>{seed}JAfE5sTFRhqQemf9rJJ++yE=</password>
            <group>developer</group>
        </user>
        <user>
            <name>smith</name>
            <password>{seed}jHfxZ5TxUkhFT41Len29Qy+37nCgnNU=</password>
            <group>developer</group>
        </user>
        . . .
    </users>
    <groups>
        <group>
            <description>collection of administrators</description>
            <name>administrators</name>
        <group>
            <description>Research Center</description>
            <name>research</name>
            <subgroup>developer</subgroup>
        </group>
        <group>
            <description>Develeoper group</description>
            <name>developer</name>
        </group>
        . . .
    </groups>
</accounts>


다음은 설정 태그에 대한 설명이다.

  • <users>

    • 태그 내에는 여러 개의 <user> 태그를 설정할 수 있다.

    • 각각의 <user>는 다음의 태그들을 가진다.

      태그설명
      <description>사용자에 대한 설명을 기술한다.
      <name>사용자의 이름으로 도메인 내에서 그룹 이름까지 포함하여 유일해야 한다.
      <password>사용자의 패스워드를 설정한다.
      <group>사용자가 속하는 그룹을 설정한다.
  • <groups>

    • 태그 내에는 여러 개의 <group> 태그를 설정할 수 있다.

    • 각각의 <group>은 다음의 태그들을 가진다.

      태그설명
      <description>그룹에 대한 설명을 기술한다.
      <name>그룹의 이름으로 도메인 내에서 사용자 이름까지 포함하여 유일해야 한다.
      <subgroup>자신의 하위 그룹을 정의한다. <group> 태그로 정의한 그룹만 정의할 수 있다.

JEUS의 권한 부여 모델은 역할(이하 role)이 리소스(이하 resource)들에 대한 권한을 가지고, user를 role에 지정하여 role이 가진 권한을 결국 role에 지정된 user가 가지게 되는 구조이다.

user를 role에 지정하기 위해서는 user의 name을 role에 바로 지정할 수도 있고 user가 속한 group의 name을 role에 지정할 수도 있고, user가 속한 group의 상위 group의 name에 role을 지정할 수도 있다. 따라서 계정의 구조가 user, group, subgroup 등의 계층을 가지고 있는 것은 JEUS에서 비슷한 역할을 하는 user를 한 번에 비슷한 권한을 부여하는 것이 가능하게 하기 위함이다.