제2장 보안 시스템의 설정

내용 목차

2.1. 개요
2.2. 보안 시스템 도메인 설정
2.2.1. 도메인 정의
2.2.2. 도메인 계정 및 정책 설정
2.3. 보안 시스템 서비스 설정
2.4. 보안 시스템 사용자 정보 설정
2.4.1. 패스워드 보안 설정
2.4.2. Master Password를 통한 SecretKey 파일 관리
2.4.3. 데이터베이스를 이용한 사용자 설정
2.5. 보안 시스템 Policy 설정
2.5.1. Custom Permission 구현 및 설정
2.5.2. 데이터베이스를 이용한 Policy 설정
2.6. 추가 항목 설정
2.6.1. Java SE SecurityManager 설정
2.6.2. JACC Provider 설정
2.6.3. 전역 시스템 패스워드 설정
2.6.4. Identity 부여를 위한 정보 설정
2.6.5. Identity에 대한 인증서 정보 설정

본 장에서는 JEUS에서 핵심적인 보안 시스템을 실제로 어떻게 설치하고 설정하는지를 설명한다. 설명한 서비스 이외의 서비스를 도메인에 설정하는 방법은 참고 자료를 참고한다.

2.1. 개요

본 절에서는 보안 시스템 설정과 관련된 기본적인 사항들을 간단하게 설명한다.

디폴트 보안 시스템의 설정 과정은 다음과 같다.

  1. 보안 도메인들을 설정한다.

  2. 각 보안 도메인별로 보안 서비스를 설정한다.

  3. 각 도메인에 대한 Subjects(인증 데이터)의 사용자 정보를 설정한다.

  4. 각 도메인에 대한 Policies(권한 부여 데이터)를 설정한다.

  5. Subject와 Policy 이외의 추가 사항을 설정한다.

  6. Java SE SecurityManager를 설정한다(선택).

  7. JACC Provider를 설정한다(선택).

디폴트 보안 시스템의 디렉터리

다음은 디폴트 보안 시스템의 디렉터리 구조이다. 각 디렉터리에는 보안 시스템에서 사용하는 설정 파일들이 나열되어 있다.

JEUS_HOME
|--config--<node_name>
               |   
            security
               |-- SYSTEM_DOMAIN
               |         |--accounts.xml
               |         |--policies.xml
               |--DEFAULT_APPLICATION_DOMAIN
                         |--accounts.xml
                         |--policies.xml                

다음은 각 디렉터리에 대한 설명이다.

security

각 디렉터리의 accounts.xml에는 사용자 정보가 저장되고, policies.xml 파일에는 Policy 데이터(권한 부여 데이터)가 저장된다.

하위 디렉터리설명
SYSTEM_DOMAINJEUS 서버가 사용자 인증과 권한 체크를 위해 사용하는 도메인이다. 이 도메인은 JEUS를 기동하고, 종료하는 등의 Permission들과 JEUS 시스템 administrator 계정을 포함하고 있다.
DEFAULT_APPLICATION_DOMAIN애플리케이션이나 관리 툴에서 특별히 도메인을 설정해 놓지 않았을 때 적용되는 메인 보안 도메인이다. 만약 이 도메인에 대한 설정이 없을 경우(디렉터리 자체가 없을 경우) 애플리케이션에서는 SYSTEM_DOMAIN을 DEFAULT_APPLICATION_DOMAIN으로 사용하게 된다.

참고

설정 중에 DEFAULT_APPLICATION_DOMAIN이 존재하지 않으면 이 도메인 역할을 기본으로 SYSTEM_DOMAIN이 하게 된다. SYSTEM_DOMAIN에는 accounts.xml, policies.xml이 존재해야 올바른 JEUS 시스템 동작이 가능하나 다른 도메인들에 대해서는 설정 파일 및 디렉터리들이 반드시 필요하지는 않다

2.2. 보안 시스템 도메인 설정

JEUS를 기동할 때 디폴트 SecurityInstaller로 보안 도메인에 대해 다음의 2가지를 설정해야 한다.

  • 도메인에 대한 정의

  • 해당 도메인에 대한 계정 및 정책 설정

2.2.1. 도메인 정의

JEUS_HOME\config\<node_name>\JEUSMain.xml 내의 다음 태그를 이용하여 설정한다.

도메인에 대한 XML 파일 설정 방법은 JEUS_HOME\lib\schemas\jeus 디렉터리 내의 jeus-main.xsd와 jeus-security.xsd의 XML 스키마에 정의되어 있다. 상위 태그는 <security-manager>이며, 이 태그는 도메인 설정과 관련된 다음 하위 태그를 가진다. 하위 태그는 0개 이상씩 설정 가능하다.

[예 2.1] <<JEUS_HOME\config\<node name>\JEUSMain.xml>>

<security-manager>
    <security-domains>
        <security-domain>
           <name>domain name</name>
           ...
        </security-domain>
        <security-domain>
           <name>domain name</name>
           ...
        </security-domain>
    <security-domains>
</security-manager>           


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

태그설명
<use-nio>

JEUS Security에서 Network 통신 방식에 NIO 방식 사용 여부를 정의한다.

(기본값: true)

<connect-retries>

JEUS Security NetworkService에서 connection retry count 값을 정의한다.

(기본값: 10)

<security-domains>

JEUS Manager에 등록할 Security Domain들을 설정한다.

<security-domains>에 대한 보안 설정 파일의 예제는 “2.3. 보안 시스템 서비스 설정”을 참조한다.

참고

<security-domains>에 대한 설정이 없다면 SYSTEM_DOMAIN 및 DEFAULT_APPLICATION_DOMAIN들이 기본으로 설정된 서비스으로 동작하게 된다.

2.2.2. 도메인 계정 및 정책 설정

다음은 도메인 계정 및 정책 설정하는 과정에 대한 설명이다.

  1. 새로운 보안 도메인을 설정하려면, JEUS_HOME\config\<node_name>\security 아래에 새로운 디렉터리를 생성해야 한다.

    디렉터리명은 생성하려는 도메인의 이름과 일치해야 한다. 관례로 도메인명은 모두 대문자로 쓰고 "_DOMAIN"으로 끝맺는다. 예를 들면 "MY_DOMAIN"으로 명명할 수 있다.

    MY_DOMAIN 도메인을 생성하기 위해 MS Windows 명령 프롬프트에서 다음 명령어를 실행한다.

    c:\>mkdir c:\jeus\config\webhost\security\MY_DOMAIN

    "webhost"는 실제 머신의 호스트명으로 대체되어야 한다.

  2. 새로운 도메인 디렉터리를 생성한 후에 그 안에 몇 가지 설정 파일들을 생성한다. 가장 좋은 방법은 기존 도메인 디렉터리의 설정 파일들을 그대로 복사해서 필요에 따라 설정 파일을 변경하는 것이다(다음의 명령어는 모두 한 라인에 쓴다). 복사된 설정 파일에 대한 설명은 다음 절에서 설명한다.

    c:\>copy c:\jeus\config\webhost\security\SYSTEM_DOMAIN\*.*
        c:\jeus\config\webhost\security\MY_DOMAIN

    JEUS_HOME\config\<node_name>\security 아래에 다음 2가지 도메인이 이미 디폴트로 존재한다.

    구분설명
    SYSTEM_DOMAINJEUS 서버가 사용자 인증과 권한 체크를 위해 사용하는 도메인이다. 이 도메인은 JEUS를 기동하고, 종료하는 등의 Permission들과 JEUS 시스템 administrator 계정을 포함하고 있다.
    DEFAULT_APPLICATION_DOMAIN

    애플리케이션이나 관리 툴에서 특별히 도메인을 설정해 놓지 않았을 때 적용되는 메인 보안 도메인이다.

    만약 이 도메인에 대한 설정이 없을 경우(디렉터리 자체가 없을 경우) 애플리케이션에서는 SYSTEM_DOMAIN을 DEFAULT_APPLICATION_DOMAIN으로 사용하게 된다.

  3. 마지막으로 서버가 시작할 때 새로운 도메인을 인식할 수 있도록 JEUSMain.xml을 수정해야 한다. 이에 대한 것은 “3.4.2. JEUSMain.xml 설정”을 참조한다.

    새롭게 생성된 도메인은 JEUS를 다시 시작해야 적용된다.

    SYSTEM_DOMAIN, DEFAULT_APPLICATION_DOMAIN의 도메인은 JEUSMain.xml의 설정과는 관계없이 항상 포함된다. 기본적으로 JEUS_HOME\config\<node_name>\security 패스 아래에 도메인과 같은 이름의 디렉터리를 생성하여 각 도메인 별로 정의할 Repository에 대한 계정 정보(account.xsd)와 보안 정책 정보(policies.xsd)를 정의할 수 있고, 기타 도메인별 Security Service 등록은 JEUSMain.xml의 설정을 이용할 수 있다. 이에 대한 것은 “2.4.3. 데이터베이스를 이용한 사용자 설정”을 참조한다.

2.3. 보안 시스템 서비스 설정

JEUS 보안 시스템은 플러그(plug) 형태의 보안 서비스를 지원한다.

각 도메인에서 로딩되는 보안 서비스는 JEUSMain.xml 내에 다음과 같이 설정되어 있다. 서비스에 대한 XML 파일 설정 방법은 JEUS_HOME\lib\schemas\jeus 디렉터리 내의 jeus-security.xsd 의 XML 스키마에 정의되어 있다. <security-domains> 태그의 하위에는 서비스 설정과 관련된 <security-domain>을 설정한다. <security-domain>은 0개 이상 설정이 가능하고 각 태그는 JEUS에서 사용하는 보안 도메인을 정의한다.

다음은 보안 설정 파일의 예제이다.

[예 2.2] 보안 시스템 서비스 설정 : <<JEUSMain.xml>>

<?xml version="1.0" encoding="UTF-8"?>
<jeus-system xmlns="http://www.tmaxsoft.com/xml/ns/jeus">
        . . .
        <security-manager>
            <use-nio>true</use-nio>
            <security-domains>
                <security-domain>
                    <name>SYSTEM_DOMAIN</name>
                    <authentication>
                        <repository-service>
                            <xml-file-repository>
                                <config-file>
                                    <filename>user.properties</filename>
                                    <filepath>/nodename/jeus/config</filepath>
                                </config-file>
                            </xml-file-repository>
                        </repository-service>
                    </authentication>
                </security-domain>
                <security-domain>
                    <name>MY_DOMAIN</name>
                </security-domain>
            </security-domains>
        </security-manager>
        . . .
    </jeus-system>

참고

<security-domain>에서 기타 다른 Service Provider에 대한 정보를 설정하지 않고 <name>에 대한 설정만 한다면 해당 도메인에 기본으로 보안 서비스들이 동작하게 된다.

다음은 <security-domain>의 하위 태그에 대한 설명이다.

  • <name> (필수)

    보안 도메인에 대한 이름이다.

  • <cache-config> (0개 이상, 선택)

    해당 도메인에 적용된 보안 서비스에서 적용할 cache 정책값을 정의한다.

    태그설명
    <min>repository service에 적용할 cache entry 최소 size 값을 설정한다.
    <max>repository service에 적용할 cache entry 최대 size 값을 설정한다.
    <timeout>repository service에 적용할 cache entry의 timeout 값을 설정한다.
  • <keystore-config> (0개 이상, 선택)

    해당 도메인의 보안 서비스에 적용할 keystore 파일에 정보값을 정의한다.

    하위의 설정값이 없는 경우 –Djeus.ssl.* 또는 –Djavax.net.ssl.* 설정이 되어 있는지 확인해 보고 해당 값이 없을 경우에는 기본값이 적용된다.

    태그설명
    <keystore-path>

    keystore 파일 경로를 설정한다.

    (기본 경로: JEUS_HOME\config\<node_name>\security\keystore)

    <keystore-password>keystore 파일에 대한 패스워드를 설정한다(changeit).
    <keystore-keypassword>

    keystore 파일에 대한 key 패스워드를 설정한다.

    (기본값: <keystore-password> 값과 동일)

    <truststore-path>

    truststore 파일 경로를 설정한다.

    (기본 경로: JEUS_HOME\config\<node_name>\security\truststore)

    <truststore-password>truststore 파일에 대한 패스워드를 설정한다(changeit).
  • <authentication> (0개 이상, 선택)

    해당 도메인에 적용할 인증 서비스를 정의한다.

    • <repository-service>

      인증을 위한 사용자 정보 저장소 타입에 따른 서비스 정의한다.

      태그설명
      <xml-file-repository>사용자 정보가 XML 파일에 정의된 경우 설정한다.
      <database-repository>사용자 정보가 Database에 정의된 경우 설정한다.
      <custom-repository>jeus.security.spi.AuthenticationRepositoryService SPI를 상속하여 사용자 정보를 로딩하는 방식을 확장 Repository service를 구현하여 적용하는 경우 설정한다.
    • <custom-authentication-service>

      jeus.security.spi.AuthenticationService SPI를 상속하여 기본으로 제공되는 인증 서비스를 확장 적용하고 싶은 경우 정의한다. 설정은 커스텀 보안 서비스 설정 방식을 따른다.

  • <authorization> (0개 이상, 선택)

    해당 도메인에 적용할 권한 부여 서비스를 정의한다.

    • <repository-service>

      권한 부여를 위한 정책 정보 저장소 타입에 따른 서비스 정의한다.

      태그설명
      <xml-file-repository>정책 정보가 XML 파일에 정의된 경우 설정한다.
      <database-repository>정책 정보가 Database에 정의된 경우 설정한다.
      <custom-repository>jeus.security.spi.AuthorizationRepositoryService SPI를 상속하여 정책 정보를 로딩하는 방식을 확장 Repository service를 구현하여 적용하는 경우 설정한다.
    • <custom-authorization-service>

      jeus.security.spi.AuthorizationService SPI를 상속하여 기본으로 제공되는 인증 서비스를 확장 적용하고 싶은 경우 정의한다. 설정은 커스텀 보안 서비스 설정 방식을 따른다.

    • <jacc-service>

      JACC1.1 기반의 권한 부여 서비스를 적용하는 경우 설정한다.

  • <login-service> (0개 이상, 선택)

    해당 도메인에 적용할 로그인 서비스를 정의한다.

    • <jaas-login-config>

      해당 도메인에 적용할 JAAS 서비스를 등록한다.

      • <callback-handler-class> : JAAS Callback Handler Factory 클래스 이름을 정의한다.

      • <login-module> : LoginModule 관련 내용을 설정한다.

        태그설명
        <login-module-classname>LoginModule을 implements한 패키지를 포함한 클래스 이름을 정의한다.
        <control-flag>required/requisite/sufficient/optional 4가지 속성들 중 하나를 정의하여 전반적으로 authentication stack에 대하여 조정하는 속성을 정의한다.
        <option> (0개 이상)LoginModule 초기화하는 경우 적용할 속성값을 정의한다.
    • <custom-login-service>

      jeus.security.spi.LoginService SPI를 상속한 로그인 서비스를 구현하여 확장 정의한다. 설정은 커스텀 보안 서비스 설정 방식을 따른다.

  • <identity-assertion> (0개 이상, 선택)

    해당 도메인에 적용할 Identity Assertion Service를 정의한다.

    • <default-identity-assertion-service>

      JEUS Security Framework에서 제공하는 기본 Identity Assertion Service를 정의한다.

      • <x509-identity-assertion> : X509Certificate Token에 대한 Identity Assertion Service를 지원한다.

        태그설명
        <config-file>X509Certificate Token에 대한 사용자 매핑을 하기 위해서 정보를 정의한 파일(기본값: DOMAIN 폴더 하위에 위치한 user-cert-map.xml)의 위치를 지정한다.
        <default-user-mapper>X509Certificate Token 값에 attribute type(cert-attr-type) 값 또는 attribute Type(attribute-type), attribute value에 대한 delimiter 값(attribute-value-delimiter)을 정의한다.
    • <custom-identity-assertion-service>

      jeus.security.spi.IdentityAssertionService SPI를 상속한 Identity Assertion Service를 확장 구현하여 정의한다. 설정은 커스텀 보안 서비스 설정 방식을 따른다.

  • <credential-mapping> (0개 이상, 선택)

    해당 도메인에 적용할 CredentailMapping 서비스를 정의한다.

    • <default-credential-mapping-service>

      JEUS Security Framework에서 제공하는 기본 Credential Mapping Service를 지원한다.

      • <x509-credential-mapping> : x509Certificate에 대한 Credential Mapping Service를 지원한다.

        태그설명
        <truststore-path>현 도메인에 적용할 truststore 파일에 대한 경로를 정의한다.
        <truststore-password>현 도메인에 적용된 truststore 파일 대한 password를 정의한다.
    • <custom-credential-mapping-service>

      jeus.security.spi.CredentialMappingService SPI를 상속한 Credential Mapping Service를 확장 구현하여 정의한다. 설정은 커스텀 보안 서비스 설정 방식을 따른다.

  • <credential-verification> (0개 이상, 선택)

    해당 도메인에 적용할 CredentialVerification 서비스를 정의한다.

    • <default-credential-verification-service>

      JEUS Security Framework에서 제공하는 기본 Credential Verification Service를 지원한다.

      태그설명
      <password-verification>PasswordFactory 클래스에 대한 검증 서비스 정의한다.
      <jeus-certificate-verification>X509Certificate에 대한 검증 서비스 정의한다.
    • <custom-credential-verification-service>

      jeus.security.spi.CredentialVerificationService SPI를 상속한 Credential Verification Service를 확장 구현하여 정의한다. 설정은 커스텀 보안 서비스 설정 방식을 따른다.

  • <audit> (0 개 이상, 선택)

    JEUS Security Framework에서 발생하는 이벤트에 대한 정보를 수집할 수 있도록 해당 도메인에 적용할 EventHandlingService를 정의한다.

    태그설명
    <default-audit-service>

    해당 이벤트 정보를 기록하는 파일 경로와 이벤트 로그 레벨을 정의한다.

    • config-file: 로그 파일 경로

    • audit-level: 로그 레벨

    <custom-audit-service>jeus.security.spi.EventHandlingServiceService SPI를 상속한 Audit Service를 확장 구현하여 정의한다. 설정은 커스텀 보안 서비스 설정 방식을 따른다.

커스텀 보안 서비스

다음은 커스텀 보안 서비스를 설정하는 방법이다.

  • <classname> (필수)

    커스텀 보안 서비스를 구현한 Java 클래스명이다. 이 클래스는 파라미터가 없는 디폴트 public 생성자를 가지고 있어야 하며, jeus.security.spi 패키지의 SPI 클래스를 상속받거나, jeus.security.base.Service 클래스를 직접 상속해야 한다.

  • <property> (0개 이상)

    jeus.security.base.PropertyHolder 인터페이스( jeus.security.base.Service 클래스가 구현한다)를 통해 보안 서비스에 name-value 쌍으로 속성을 설정할 수 있다. 속성은 각 보안 서비스를 초기화하는 데 사용된다.

    다음 2개의 하위 태그를 가진다.

    태그설명
    <name>속성명을 설정한다.
    <value> (선택)속성명에 해당하는 String 속성값을 설정한다.

참고

JEUS 가 디폴트로 제공하는 보안 서비스의 종류에 대한 자세한 내용은 참고 자료를 참고한다. 만약 커스텀 보안 서비스를 작성하려면, “제5장 커스텀 보안 서비스 개발”을 참고한다.

2.4. 보안 시스템 사용자 정보 설정

디폴트 보안 설정에서 사용자 데이터는 "accounts.xml"로 불리는 XML 파일에서 읽어 들인다. 이 파일은 JEUS_HOME\config\<node name>\security\<domain name>\accounts.xml 경로에 있다. 여기서 <node name>은 호스트 머신의 이름이고, <domain name>은 사용자가 속한 보안 도메인의 이름을 나타낸다

accounts.xml의 XML 스키마는 accounts.xsd이며, JEUS_HOME\lib\schemas\jeus 경로에 있다.

이 파일에는 최상위태그 <accounts> 하위에 <users> 및 <groups> 태그가 있으며 0개 이상의 <user> 및 <group>태그가 포함되어 있다. 각각은 user 및 group을 나타내고 있다.

[예 2.3] 보안 시스템 사용자 정보 설정 : <<accounts.xml>>

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<accounts xmlns="http://www.tmaxsoft.com/xml/ns/jeus">
    <users>
        <user>
            <name>j2ee</name>
            <password>{SHA}blSUPYpdjb8QDcq+ozfbIEZx5oY=</password>
            <group>cts_group</group>
        </user>
        <user>
            <name>jeus</name>
            <password>{SHA}McbQlyhI3yiOG1HGTg8DQVWkyhg=</password>
        </user>
        <user>
            <name>j2ee_vi</name>
            <password>{SHA}w3k9VDtBr/gxIs1Zvb0jmn2Khcg=</password>
            <group>nested_group</group>
        </user>
        <user>
            <name>javajoe</name>
            <password>{SHA}v+mA+p1iHBwdg7Hz09gAzvo702Y=</password>
            <group>nested_group</group>
        </user>
    </users>
    <groups>
        <group>
            <description>For CTS</description>
            <name>cts_group</name>
            <subgroup>nested_group</subgroup>
        </group>
        <group>
            <description>For NestedGroup</description>
            <name>nested_group</name>
        </group>
    </groups>
</accounts>


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

  • <user>

    각 <user> 태그는 다음과 같은 하위 태그를 가지고 있다.

    태그설명
    <description> (선택)<user>에 대한 설명이다(문자열).
    <name>(필수)<user>에 대한 이름을 나타낸다. (예: 사용자명, 사용자 ID)
    <password>(0개 이상, 선택)

    <user>에 대한 패스워드를 나타낸다.

    <password>는 어떤 특정 알고리즘을 사용하여 인코딩된 값을 정의한다. <password> 태그에 적용된 알고리즘 혹은 인코딩 방식을 ’{}’ 블록 사이에 기입하도록 한다. 인코딩 방식에 대한 자세한 내용은 “2.4.1. 패스워드 보안 설정”을 참고한다.

    <group>(0개 이상, 선택)<user>가 포함된 그룹을 나타낸다. 한 사용자는 여러 그룹에 포함될 수 있으며, 다음의 <group>태그에서 정의된 그룹을 지칭해야 한다.
  • <group>

    각 <group> 태그는 다음과 같은 하위 태그로 그룹을 정의한다.

    태그설명
    <description>(선택)<group>에 대한 설명이다(문자열).
    <name>(필수)<group>에 대한 이름을 나타낸다.
    <subgroup> (0개 이상, 선택)해당 group role을 동일하게 부여할 수 있도록 nested하게 속한 그룹 이름들을 정의한다.

2.4.1. 패스워드 보안 설정

사용자 설정을 할 때 패스워드를 지정해야 한다. 패스워드는 특정 알고리즘을 사용해 인코딩한 데이터를 정의한다. 기본 패스워드 인코딩 방식은 plain-text이다.

특정 Hash 알고리즘이나 JCE에서 정의한 Cipher 알고리즘 값을 적용해서 <password> 값을 생성 한 경우 해당 값에 적용된 다음의 정의된 알고리즘 혹은 인코딩 정보를 <password> 값으로 함께 설정한다.

항목설명
SHA<password>에 사용되는 Hash 알고리즘이다.
DES/DESede/AES/ SEED/ Blowfish<password>에 사용되는 Cipher 알고리즘이다.
base64<password>에 사용되는 인코딩을 지원한다

2.4.2. Master Password를 통한 SecretKey 파일 관리

encryption 툴을 통해서 패스워드를 암호화하는 경우 해당 암호화 파일에 적용되는 SecretKey 정보를 security.key 파일에 암호화 알고리즘 별로 저장하여 관리한다.

Master Password를 입력받아 이 패스워드로 security.key 파일을 암호화하여 저장할 수 있다. security.key 파일은 다음 경로에 위치한다. 클러스터링 환경을 구성하는 경우 해당 security.key 파일을 함께 다른 노드에 옮겨놓아야 한다

JEUS_HOME\config\<node_name>\security\

JEUS에 등록하는 DB 패스워드를 암호화하였을 경우 클라이언트에서는 이를 decrypt하기 위해 key가 필요하다. 이때 secret key file path를 system property를 이용해 설정할 수 있다.

또한, security.key 파일에 Master Password가 설정된 경우 Master Password도 system property를 이용해서 설정할 수 있다. key path를 지정하는 property 이름은 jeus.security.keypath이며, Master Password를 설정하려면 jeus.security.master를 이용하면 된다. 이 property들은 JEUS를 기동할 때도 이용할 수 있다. 다만, 보안의 이유로 Master Password는 프롬프트(standard input)로 입력하는 것을 권장한다.

2.4.3. 데이터베이스를 이용한 사용자 설정

본 절에서는 JEUS가 정의한 DB 테이블을 이용한 Authentication을 설정하는 방법에 대해서 설명한다.

다음 예제는 JEUS에 정의한 Datasource를 이용할 때 설정하는 방법이다.

[예 2.4] 데이터베이스를 이용한 사용자 설정 : <<JEUSMain.xml>>

<?xml version="1.0" encoding="UTF-8"?>
<jeus-system xmlns="http://www.tmaxsoft.com/xml/ns/jeus">
    . . .
    <security-manager>
        <seuciry-domains>
            <security-domain>
                <name>MY_DOMAIN</name>
                    <authentication>
                        <repository-service>
                            <database-repository>
                              <datasource-export-name>auth</datasource-export-name>
                            </database-repository>
                        </repository-service>
                    </authentication>
                    . . .
                </security-domain>
            </security-domains>
        </security-manager>
        . . .
</jeus-system> 


위의 예제에서 <datasource-export-name>에는 authentication에 사용할 JEUSMain.xml에 등록한 datasource의 export-name을 명시해야 한다. 또 다른 방법으로 DriverManager를 이용해 JEUS에서 제공하는 JDBC를 이용하지 않고 직접 DB와 통신하면서 authentication을 이용할 수 있는데, 위의 예제에서 <datasource-export-name> 태그 부분을 다음과 같이 변경하면 된다.

다음 예제는 JEUS JDBC를 이용하지 않을 때 DB repository를 설정하는 방법이다.

[예 2.5] JEUS JDBC를 사용하지 않는 경우 설정 : <<JEUSMain.xml>>

<security-manager>
  ...
    <repository-service>
        <dbdriver-config>
           <vendor>oracle</vendor>
           <driver>oracle.jdbc.OracleDriver</driver>
           <url>jdbc:oracle:thin:@127.0.0.1:1521:ORA9I</url>
           <username>scott</username>
           <password>{base64}dGlnZXI=</password>
        </dbdriver-config>
     </repository-service>
  ...
</security-manager>


참고

이 방식을 이용할 경우 커넥션을 맺고 끊는 것이 매우 잦기 때문에 성능상 문제가 있을 가능성이 크므로, 위의 방법을 이용하길 추천한다.

데이터베이스에서 사용되는 테이블은 다음과 같이 구성된다.

[그림 2.1] Subject에 대한 사용자 정보를 저장하기 위한 데이터베이스 테이블 구조

Subject에 대한 사용자 정보를 저장하기 위한 데이터베이스 테이블 구조


데이터베이스에 테이블이 존재하지 않을 경우 JEUS_HOME\config\security\dbrealm.sql 파일을 이용해서 DB에 테이블을 생성하면 사용자명이 jeus, 패스워드가 jeus인 사용자가 최초로 생성된다.

참고

만약 사용자를 추가하고 싶다면 WebAdmin을 이용하여 사용자를 추가하고 [save] 버튼을 클릭하여 사용자를 추가한다.

2.5. 보안 시스템 Policy 설정

디폴트 보안을 설정하는 경우 Policy 데이터(권한 부여 데이터)는 policies.xml 파일에서 읽어온다. 이 파일은 다음 경로에 위치한다.

JEUS_HOME\config\<node_name>\security\<domain_name>\policies.xml

<node_name>은 실제 호스트 머신의 이름이어야 하고, <domain_name>은 Policy가 속해 있는 도메인명이어야 한다.

policies.xml의 XML 스키마는 policies.xsd로 JEUS_HOME\lib\schemas\jeus 디렉터리 내에 있다. policies.xml은 0개 이상의 <policy> 태그로 구성되어 있으며, 각 태그는 개별 Policy(권한 부여 데이터)를 나타낸다.

각 <policy> 태그는 다음 태그들로 구성되어 있다.

[예 2.6] 보안 시스템 Policy 설정 : <<policies.xml>>

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<policies xmlns="http://www.tmaxsoft.com/xml/ns/jeus">
    <policy>
        <role-permissions>
            <role-permission>
                <principal>johan</principal>
                <role>administrator</role>
            </role-permission>
            <role-permission>
                <principal>johan</principal>
                <role>teller</role>
                <actions>9:00-17:00</actions>
                <classname>
                    jeus.security.resource.TimeConstrainedRolePermission
                </classname>
            </role-permission>
        </role-permissions>
        <resource-permissions>
            <context-id>default</context-id>
            <resource-permission>
                <role>teller</role>
                <resource>bankdb</resource>
                <actions>select, update</actions>
            </resource-permission>
            <resource-permission>
                <role>administrator</role>
                <resource>jndi</resource>
                <actions>modify, delete</actions>
            </resource-permission>
            <resource-permission>
                <resource>jeus.*</resource>
                <actions>boot, down</actions>
                <excluded/>
            </resource-permission>
            <resource-permission>
                <resource>jndi</resource>
                <actions>lookup</actions>
                <unchecked/>
            </resource-permission>
            <resource-permission>
                <role>administrator</role>
                <resource>jeus.security.*</resource>
                <actions>*</actions>
            </resource-permission>
        </resource-permissions>
    </policy>
</policies>


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

  • <role-permissions> (0 또는 1)

    Principal-to-Role 매핑들에 대한 정보를 제공한다. 하위 태그로 0개 이상의 <role-permissions> 태그를 가지고 있다.

    <role-permissions> 태그는 다음의 태그로 구성되어 있다.

    태그설명
    <principal> (0개 이상)현재 <role-permission>을 소유하고 있는 Principal 이름이다.
    <role>(1개, 필수)Role명을 나타낸다.
    <actions>(선택)Role에 대한 액션을 나타낸다.
    <classname>(선택)Role Permission으로 사용될 java.security.Permission을 구현한 Java 클래스명이다. 생략되면 jeus.security.resource.RolePermission이 디폴트로 사용된다. Custom Permission을 설정하고 구현하는 방법은 “2.5.1. Custom Permission 구현 및 설정”을 참고한다.
    <excluded>(선택)값이 없는 empty 태그( <xxx/> )이다. 설정되어 있으면 해당 Role Permission이 배제된다. 즉, Permission이 암시하는 Role에 아무도 접근할 수가 없다.
    <unchecked>(선택)값이 없는 empty 태그이다. 설정되어 있으면 Role Permission이 체크되지 않는다. 즉, Permission이 암시하는 Role에 누구나 접근할 수 있다.
  • <resource-permissions> (0개 이상)

    Role-to-Resource에 대한 정보는 다음의 태그로 구성되어 있다.

    • <context-id> (선택)

      문자열로 Context ID를 나타낸다. Context란 권한 부여 체크가 일어나는 범위를 나타낸다. JEUS 시스템이 JEUS 리소스에 대해 사용하는 디폴트 Context ID는 "default"이다.

    • <resource-permission> (0개 이상)

      다음의 항목으로 구성되어 있다.

      태그설명
      <role> (0개 이상)현재 Resource Permission을 소유하고 있는 Role명이다.
      <resource>(1개, 필수)리소스명을 나타낸다.
      <actions>(선택)리소스에 대한 액션을 나타낸다.
      <classname>(선택)Resource Permission으로 나타내는 java.security.Permission을 구현한 클래스명이다. 생략하면 jeus.security.resource.ResourcePermission이 디폴트로 사용된다. Custom Permission을 생성하고 설정하는 방법은 “2.5.1. Custom Permission 구현 및 설정”을 참고한다.
      <excluded>(선택)값이 없는 empty 태그이다. 설정하면, 해당 Resource Permission이 배제된다. 즉, Permission이 암시하는 리소스는 누구도 접근할 수 없다.
      <unchecked>(선택)값이 없는 empty 태그이다. 설정하면, 해당 Resource Permission을 체크하지 않는다. 즉 Permission이 암시하는 리소스는 누구나 접근할 수 있다.

보통 policies.xml은 JEUS 서버 리소스에 대한 Permission( JNDI, JMS, Security 서버 등)을 설정하는 데 사용되고, J2EE 애플리케이션과 J2EE 모듈에 대한 Permission을 설정하는 데는 사용하지 않는다. 대신 J2EE 애플리케이션과 모듈에 Permission을 설정하기 위해, 다양한 DD 파일을 사용한다. 자세한 사항은 “제3장 애플리케이션과 모듈에서 보안 설정”을 참고한다.

2.5.1. Custom Permission 구현 및 설정

Permission(Role Permission 또는 Resource Permission)을 policies.xml 파일에 추가할 때마다, Permission을 나타내는 Java 클래스명을 설정해야 한다. 해당 클래스는 java.security.Permission 추상 클래스를 확장한 것이다. 자신만의 java.security.Permission 구현 클래스를 생성해서 policies.xml에 <classname> 태그로 설정해 두면 Custom Permission을 직접 만들 수 있다.

다음 요구사항을 가진 새로운 Custom Permission을 구현하는 방법을 설명한다.

새로운 Role Permission은 원래의 Role 외에 다음과 같은 2가지 조건이 충족되는 상황에서 또 다른 Role을 암시할 수 있다.

  • 또 다른 Role도 원래의 Role과 동일한 이름을 가지고 있다.

  • 현재 시간이 특정 시간 범위(오전 9시부터 오후 5시까지) 내에 있을 때만 또 다른 Role을 암시할 수 있다.

예를 들어, 이러한 Role Permission은 뱅킹 애플리케이션에서 "peter"라는 Principal이 오전 9시부터 오후 5시까지 업무시간 동안만 "teller"라는 Role을 가질 수 있도록 만들 수 있다.

이를 위해 2가지 작업이 필요하다.

  1. Custom Permission을 생성한다.

  2. policies.xml에 해당 Permission을 사용하도록 설정한다.

다음은 위의 요구사항을 만족하는 Custom Permission 클래스를 구현한 것으로 자세한 코드는 생략한다.

[예 2.7] Custom Permission 클래스 : <<TimeConstrainedRolePermission.java>>

package jeus.security.resource;

import java.security.Permission;
import java.util.Calendar;
import java.util.StringTokenizer;

/**
 * A time-constrained Role permission.
 * <p>
 * With this permission implementation you can express
 * things such as "X can only be in the role Y between
 * 09:00 AM to 05:00 PM".
*/
public class TimeConstrainedRolePermission extends RolePermission {
    private String timeConstraint = "*";
    private int startTime = Integer.MIN_VALUE;
    private int endTime = Integer.MAX_VALUE;

    public TimeConstrainedRolePermission(String roleName) {
        this(roleName, "*");
    }

    public TimeConstrainedRolePermission(String roleName, String timeConstraint)
    {
        super(roleName);
        if (timeConstraint != null) {
            this.timeConstraint = timeConstraint;
            parseTimeConstraint();
        }
    }

    private void parseTimeConstraint() {
                 . . .
    }

    public boolean equals(Object anotherObject) {
                 . . .
    }

    public int hashCode() {
                 . . .
    }

    public String getActions() {
        return timeConstraint;
    }

    public boolean implies(Permission anotherPermission) {
        if (this.timeConstraint.equals("*")) {
            return super.implies(anotherPermission);
        } else {
            Calendar cal = Calendar.getInstance();
            int curHour = cal.get(Calendar.HOUR_OF_DAY);
            int curMinute = cal.get(Calendar.MINUTE);

            int now = curHour * 60 + curMinute;
            if (now >= this.startTime && now <= this.endTime) {
                return super.implies(anotherPermission);
            } else {
                return false;
            }
        }
    }
}   


해당 클래스는 jeus.security.resource.RolePermission을 상속하고, jeus.security.resource.RolePermission은 다시 java.security.Permission을 상속한다. 이는 코드 재사용성을 높이기 위한 구조이다.

TimeConstrainedRolePermission을 상속해 또 다른 java.security.Permission을 만드는 것도 가능하다.

위의 소스 일부에서 보듯이, 2가지 타입의 생성자가 있다.

첫 번째는(role name) 하나의 파라미터만 받고 있고, 두 번째는(role name, time constraint) 2개의 파라미터를 받는다.

java.security.Permission에서 첫 번째 파라미터는 "name"을 뜻하고 두 번째 파라미터는 "actions"를 뜻한다. "actions" 파라미터는 Permission에 대한 유효 시간을 나타내며, “09:00-17:00”라는 값을 가진다. "name"은 "administrator" 또는 "teller"와 같은 Role 이름을 나타낸다. 몇몇 Permission 구현 클래스는 "actions" 파라미터를 받는 두 번째 타입의 생성자가 생략되기도 한다.

소스의 핵심은 implies(Permission anotherPermission) 메소드로 현재 시스템 시간이 주어진 유효 시간내에 있는지 체크한 다음, 만약 그렇다면 super.implies() 메소드를 호출하고, 그렇지 않으면 false를 리턴한다. 모든 implies() 메소드는 boolean 값을 리턴하게 되어 있는데, 해당 Permission이 파라미터로 넘어온 Permission을 암시하는지를 나타낸다.

참고

1. implies() 메소드와 java.security.Permission 추상 클래스에 대한 자세한 정보는 Java SE Javadoc 문서를 참고한다.

2. jeus.security.resource.RolePermission, jeus.security.resource.TimeConstrainedRolePermission, jeus.security.resource.ResourcePermission에 대한 자세한 정보는 참고 자료와 JEUS Security Javadoc에서 jeus.security.resource 패키지를 참고한다.

지금까지 java.security.Permission 커스텀 클래스를 구현해 보았다. 해당 소스를 javac로 컴파일하고 JEUS 서버의 클래스 패스에 해당 클래스 경로를 설정한다.

마지막으로 Custom Permission 클래스를 policies.xml 파일에 설정한다.

[예 2.8] Custom Permission 클래스 : <<policies.xml>>

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<policies xmlns="http://www.tmaxsoft.com/xml/ns/jeus">
    <policy>
        <role-permissions>
            <role-permission>
                <principal>peter</principal>
                <role>administrator</role>
                <actions>9:00-17:00</actions>
                <classname>
                    jeus.security.resource.TimeConstrainedRolePermission
                </classname>
            </role-permission>
        </role-permissions>
        <resource-permissions>
            <context-id>default</context-id>
            <resource-permission>
                <role>administrator</role>
                <resource>jeus.*</resource>
                <actions>*</actions>
            </resource-permission>
        </resource-permissions>
    </policy>
    . . .
</policies>               


위의 XML은 다음을 나타내고 있다.

"peter"라는 사용자는 "administrator" Role을 오전 9시부터 오후 5시까지 업무시간 동안만 부여받는다. "administrator" Role은 모든 JEUS 리소스(jeus.*)에 대해 모든 액션(<actions>*</actions>)을 실행할 수 있는 권한을 가지고 있다. 따라서 peter는 업무시간 동안만 모든 JEUS 리소스에 대한 모든 권한을 행사할 수 있다.

위의 스키마는 J2EE 애플리케이션과 모듈에서 JEUS DD 파일을 설정할 때도 그대로 적용되고 예제에서 보여준 Principal-to-Role Permission에 적용되고, Role-to-Resource Permission에도 동일하게 적용된다. JEUS DD에서 Custom Permission을 사용하는 방법은 “제3장 애플리케이션과 모듈에서 보안 설정” 을 참고한다.

2.5.2. 데이터베이스를 이용한 Policy 설정

데이터베이스를 이용하여 Policy를 설정하려면 다음과 같이 JEUSMain.xml에서 도메인 서비스를 지정해야 한다. authentication과 마찬가지로 driver manager를 직접 이용할 경우 <datasource-export-name> 대신에 <dbdriver-config> 태그를 추가한다. 그러나 일반적으로 JEUS JDBC Datasource를 사용할 것을 권장한다.

[예 2.9] 데이터베이스를 이용한 Policy 설정 : <<JEUSMain.xml>>

<?xml version="1.0" encoding="UTF-8"?>
<jeus-system xmlns="http://www.tmaxsoft.com/xml/ns/jeus">
    ...
    <security-manager>
        <security-domains>
            <security-domain>
                <name>MY_DOMAIN</name>
                <authorization>
                    <repository-service>
                        <database-repository>
                            <datasource-export-name>auth</datasource-export-name>
                        </database-repository>
                    </repository-service>
                </authorization>
                . . .
        </security-domains>
    </security-manager>   
    . . .
</jeus-system> 


데이터베이스를 사용하는 AuthenticationRepositoryService를 사용하려면 데이터베이스에 접근하는 JDBC driver와 접근을 하기위한 정보인 URL, 사용자 이름 그리고 패스워드가 필요하다.

본 예제에서는 Oracle에 접근하기 위한 정보로 패스워드는 base64로 인코딩된 문자가 입력된다. 특정 암호화 알고리즘 혹은 인코딩 방식이 적용된 패스워드 값을 기입하는 경우 accounts.xml의 사용자 패스워드와 동일한 방식으로 기입하면 된다.

데이터베이스에서 사용되는 테이블은 다음과 같이 구성된다.

[그림 2.2] Policy를 저장하기 위한 데이터베이스 테이블 구조

Policy를 저장하기 위한 데이터베이스 테이블 구조


데이터베이스에 테이블이 존재하지 않는다면 JEUS_HOME\config\security\dbrealm.sql 파일을 이용해서 DB에 테이블을 생성하여 기본적인 Policy는 “SYSTEM_DOMAIN”에 “administrator”라는 Role을 가지게 되고, “jeus.*”에 대한 Resource 권한을 가진다. “administrator” Role 포함된 principal은 “2.4.3. 데이터베이스를 이용한 사용자 설정”에서 설명한 jeus이다.

참고

만약 Policy를 추가하고 싶다면 WebAdmin을 이용하여 Policy를 추가하고 [save] 버튼을 클릭하여 Policy를 추가한다.

2.6. 추가 항목 설정

본 절에서는 Subject와 Policy 이외의 추가 항목을 설정하는 방법을 설명한다.

2.6.1. Java SE SecurityManager 설정

JEUS에서 Java SE SecurityManger를 사용하면, 플랫폼에 대한 부수적인 견고성을 얻을 수 있으나, 성능이 저하된다. 일반적으로 Java SE SecurityManger에서는 모든 핵심 JEUS 코드뿐 아니라 JEUS에 디플로이되어 있는 J2EE 애플리케이션 및 모듈이 완벽하게 신뢰받은 코드로 간주되므로, 굳이 보안 관리자를 사용하여 부하를 초래할 필요는 없다. 보안 관리자를 사용하지 않는 모드가 JEUS에서 디폴트 모드이다.

그러나 때때로 Java SE SecurityManger를 사용하여 코드 수준의 보안을 강화시켜 추가적인 견고성을 높이는 문제가 퍼포먼스 저하보다 중요하게 다루어지는 경우가 있다.

예를 들어 시스템 관리자가 미심쩍은 코드를 포함하고 있을 지도 모르는 Java EE 애플리케이션을 JEUS에 디플로이해야 한다고 하자. 이 경우에 퍼포먼스 저하라는 비용을 감수하고서라도 코드 레벨의 보안을 강화시켜, 호스트를 보호하는 것이 더 중요하다고 판단되면, Java SE SecurityManger를 작동시켜야 한다.

Java SE SecurityManger를 JEUS와 함께 동작시키기 위한 절차는 다음과 같다.

JEUS를 실행시키는 jeus.cmd나 JEUS 스크립트, 컨테이너에 command-option에 다음과 같은 속성을 정의해 줄 수 있다.

-Djava.security.manager 
-Djava.security.policy=%JEUS_HOME%\config\security\policy (Windows기준)            

Policy 파일은 JEUS_HOME\config\security\policy이며 내용은 다음과 같다.

[예 2.10] Java SE SecurityManager 설정 : <<policy>>

grant codeBase "file:${jeus.home}/lib/system/*" {
    permission java.security.AllPermission;
};

grant {
    permission java.net.SocketPermission "127.0.0.1:1024-", 
    "connect, accept, connect, listen, resolve";
    permission java.security.SecurityPermission "runTrustedLogin", "read";
    permission java.security.SecurityPermission "loginCodeSubject", "read";
    permission java.security.SecurityPermission "putProviderProperty.*";
    permission java.security.SecurityPermission "insertProvider.*";
    permission javax.management.MBeanPermission "*", "*";
}; 


Java SE SecurityManger는 JEUS의 보안 시스템과는 완전히 별개의 것이다. JEUS 보안 시스템은 코드 수준의 보호(코드를 호출할 수 있는 Permission 설정)가 아니라 사용자 수준의 보호(누가 로그인했고, 해당 자원에 대한 Permission이 있는가)를 다루고 있다.

둘 사이 유일한 접점은 JEUS가 특별한 경우 Java SE SecurityManger를 사용하여 코드 수준의 Permission을 체크함으로써, 악의적인 Servlet이나 EJB 코드로부터 JEUS를 보호하기도 한다는 점이다.

2.6.2. JACC Provider 설정

JEUS에서 JACC 1.0 설정에 대한 이슈는 “제6장 JACC Provider 사용”에서 충분히 설명할 것이다. 더 자세한 내용은 해당 절을 참고한다.

2.6.3. 전역 시스템 패스워드 설정

클러스터로 묶여 있는 모든 보안 서버들은 서로 간의 신뢰를 확보하기 위해 공통의 전역 시스템 패스워드를 사용한다.

보안 서버는 크게 2가지 종류가 있는데, JEUS Manager의 VM에 설치되어 있는 보안 서버와 엔진 컨테이너 VM별로 설치되어 있는 보안 서버가 있다. 이들을 여러 노드의 보안 클러스터로 묶었을 경우 상호 간의 신뢰를 확보하기 위해 VM에 동일한 전역 시스템 패스워드를 설정해 주어야 한다.

시스템 패스워드는 클러스터로 묶여 있는 모든 JEUS VM에서 동일해야 하며, 다양한 목적으로 사용된다. JVM에서 시스템 패스워드를 설정하려면, 다음 Java 시스템 속성을 사용한다.

-Djeus.security.globalPassword=<password>

이 속성은 JEUS_HOME\bin 디렉터리 내의 JEUS 구동 스크립트(예를 들어 Window에서 jeus.cmd)와 JEUSMain.xml에 다음과 같이 설정한다.

[예 2.11] 전역 시스템 패스워드 설정 : <<jeus.cmd 또는 jeus>>

. . .
 java -server . . .
-Djeus.security.globalPassword=syspass
jeus.server.JeusBootstrapper %*                   


[예 2.12] 전역 시스템 패스워드 설정 : <<JEUSMain.xml>>

<?xml version="1.0" encoding="UTF-8"?>
<jeus-system xmlns="http://www.tmaxsoft.com/xml/ns/jeus">
    <node>
        <name>@HOSTNAME@</name>
        <engine-container>
            <name>container1</name>
            <!-- engine container JVM option -->
            <command-option>
             . . .
             –Djeus.security.globalPassword=syspass
           </command-option>
             <engine-command>
                 <type>servlet</type>
                 <name>engine1</name>
                 <startup-mode>xml</startup-mode>
              </engine-command>
          . . .                    


주의

클러스터 내의 모든 VM은 동일한 전역 시스템 패스워드를 가져야 한다는 것을 주의한다.

시스템 패스워드는 application client container와 같은 클라이언트 VM에는 설정하지 않는다. 전역 시스템 패스워드를 별도로 설정하지 않았다면, 디폴트로 "globalpass"가 패스워드로 사용된다.

2.6.4. Identity 부여를 위한 정보 설정

Identity Assertion Service 지원하는 경우 추가적으로 인증서와 사용자 간의 매핑 정보가 있는 cert-user-map.xml 파일에서 읽어 들인다.

이 파일에는 최상위 태그 <cert-user> 하위에 <user> 및 <cert> 태그가 있으며 하위 0개 이상의 <cert-user> 태그가 포함되어 있다. 각각은 사용자에 대한 인증서 매핑을 위한 속성 정보를 나타내고 있다.

[예 2.13] Identity 부여를 위한 정보 설정 : <<cert-user-map.xml>>

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<cert-user-map xmlns="http://www.tmaxsoft.com/xml/ns/jeus">
   <cert-user>
     <username>choco</username>
     <cert>
        <subjectDN>chococa</subjectDN>
     </cert>               
   </cert-user>
</cert-user-map>  

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


  • <user>

    각 <user> 태그는 다음과 같은 하위 태그를 가지고 있다.

    태그설명
    <username> (필수)

    인증서 attribute 값에 매핑되는 사용자에 대한 이름을 나타낸다.

    (예: 사용자명, 사용자 ID)

  • <cert>

    각 <cert> 태그는 다음과 같은 하위 태그를 가지고 있으며 사용자에 대한 인증서 매핑 정보을 정의한다. 이는 truststore 파일에 포함된 인증서에 대해서 하위 attribute 값들이 unique한 ID를 보장해서 idenity를 부여할 수 있도록 사용자 이름과 매핑되는 값들을 정의한다.

    태그설명
    <alias>(선택)keystore 내의 certificate에 대한 Alias를 정의한다(문자열).
    <subjectDN>(선택)keystore 내의 certificate에 대한 subjectDN를 정의한다(문자열).
    <SKI>(선택)keystore 내의 certificate에 대한 SKI를 정의한다(문자열).
    <issuer>(선택)keystore 내의 certificate에 대한 issuer를 정의한다(문자열).
    <serialNo>(선택)keystore 내의 certificate에 대한 serial number를 정의한다(문자열).

이 파일은 다음의 경로에 위치한다.

JEUS_HOME\config\<node_name>\security\<domain_name>\cert-user-map.xml

<node_name>은 호스트 머신의 이름이고, <domain_name>은 사용자가 속한 보안 도메인의 이름을 나타낸다. cert-user-map.xml의 XML 스키마는 cert-user-map.xsd이며, JEUS_HOME\lib\schemas\jeus 경로에 있다.

2.6.5. Identity에 대한 인증서 정보 설정

JEUS 보안 시스템에서는 인증서로 인증된 Identity 사용자 정보에 대한 인증서 정보를 얻을 수 있는 API를 제공하는 UserCertMappingService를 제공한다. UserCertMappingService 지원하는 경우 추가적으로 사용자별 인증서 파일을 얻기 위한 매핑 정보가 있는 user-cert-map.xml 파일에서 읽어 들인다.

이 파일에는 최상위 태그 <user-cert-map> 태그 하위에 0개 이상의 <user-cert> 태그가 포함되어 있다. 각각은 keystore 파일에서 사용자에 대한 인증서를 얻기 위한 속성 정보를 나타내고 있다.

[예 2.14] Identity에 대한 인증서 정보 설정 : <<user-cert-map.xml>>

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<user-cert-map xmlns="http://www.tmaxsoft.com/xml/ns/jeus">
   <user-cert>
     <username>choco</username>
     <alias>chococa</alias>
     <keypassword>changeit</keypassword>
     <secretkey>
       <keyname>testkeypass</keyname>
       <keyalgorithm>AES</keyalgorithm>
       <keyvalue>bjhTUjJvSXRTOGlkVEdlNHJnM2N3VnljSDZXV0JkYz0=</keyvalue>
     </secretkey>
   </user-cert>
</user-cert-map>      


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

  • <user-cert>

    각 <user-cert> 태그는 다음과 같은 하위 태그를 가지고 있다.

    태그설명
    <username>(필수)

    keystore 내의 certificate에 대한 사용자 이름을 정의한다.

    primary identify로서 유일해야 한다. (예: 사용자명, 사용자 ID)

    <alias>(필수)keystore 내의 certificate에 대한 Alias를 정의한다.
    <keypassword>(선택)keystore 내의 certificate에 대한 private key를 얻기위한 keypassword를 정의한다(예: changeit).
    <secretkey>(선택)private key를 정의한다.
  • <secretkey>

    각 <secretkey> 태그는 다음과 같은 하위 태그를 가지고 있다.

    태그설명
    <keyname>(필수)private key의 이름을 정의한다. <user-cert-map> 태그 하위에 존재하는 keyname 값은 유일해야 한다(문자열).
    <keyalgorithm>(필수)private key의 키 알고리즘을 나타낸다(문자열).
    <keyvalue>(필수)private key의 값을 base64형태로 나타낸다.

이 파일은 다음의 경로에 위치한다.

JEUS_HOME\config\<node_name>\security\<domain_name>\user-cert-map.xml

<node name>은 호스트 머신의 이름이고, <domain_name>은 사용자가 속한 보안 도메인의 이름을 나타낸다. user-cert-map.xml의 XML 스키마는 user-cert-map.xsd이며, JEUS_HOME\lib\schmas\jeus 경로에 있다.