제2장 보안 시스템 설정

내용 목차

2.1. 개요
2.2. 보안 도메인 설정
2.2.1. WebAdmin 사용 설정
2.2.2. XML 편집 설정
2.2.3. 사용자 계정 및 보안 정책 설정
2.3. 보안 도메인 구성요소 설정
2.3.1. WebAdmin 사용 설정
2.3.2. XML 편집 설정
2.4. 보안 서비스 설정
2.4.1. WebAdmin 사용 설정
2.4.2. XML 편집 설정
2.5. 보안 시스템 사용자 정보 설정
2.5.1. WebAdmin 사용
2.5.2. XML 편집 설정
2.5.3. 데이터베이스 사용 설정
2.5.4. 패스워드 보안 설정
2.5.5. 로그인 정보 캐시 기능
2.6. 보안 시스템 정책 설정
2.6.1. WebAdmin 사용 설정
2.6.2. XML 편집 설정
2.6.3. 데이터베이스 사용 설정
2.7. 추가 항목 설정
2.7.1. Java SE SecurityManager 설정
2.7.2. JACC Provider 설정
2.7.3. Identity 부여를 위한 정보 설정
2.7.4. Identity에 대한 인증서 정보 설정

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

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

JEUS의 보안 시스템은 Security Installer를 통해 서버를 실행할 때 시작된다. Security Installer는 domain.xml에 정의된 정보를 바탕으로 보안 도메인을 만들고 보안 서비스를 시작하여 JEUS를 안전하게 보호한다. 디폴트 보안 시스템에서는 accounts.xml과 policies.xml에 정의된 사용자 계정과 보안 정책이 적용된다.

보안 도메인에 대해 다음의 2가지를 설정할 수 있다.

  • 보안 도메인과 보안 서비스에 대한 정의

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

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

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

  2. 각 보안 도메인별로 구성요소와 보안 서비스를 설정한다.

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

  4. 각 도메인에 대한 Policies(보안 정책 데이터)를 설정한다.

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

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

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

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

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

JEUS_HOME/domains/<domain name>
|--config
     |--security
           |--security.key
           |--policy
           |--security-domains.xml
           |--SYSTEM_DOMAIN
                   |--accounts.xml
                   |--policies.xml                

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

security
구분설명
security.key대칭키 암호화 알고리듬의 Key를 저장하는 파일이다. 최초로 암호화를 수행하면 파일이 생성된다.
policyJava Permission 설정 파일이다. JEUS의 보안 시스템과는 별도로 Java SE Security Manager에서 사용된다.
security-domains.xmlJEUS의 보안 도메인에 대한 설정을 저장하는 파일이다.
SYSTEM_DOMAIN

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

참고

애플리케이션에 JEUS 시스템과 다른 보안정책을 적용하려면 별도의 보안 도메인 디렉터리를 생성하고 관련 설정을 적용한 뒤 사용해야 한다.

도메인 설정은 WebAdmin을 사용해서 방법과 설정이 저장되는 domain.xml 및 security-domains.xml을 직접 편집하는 방법이 있다. 사용자 계정 설정과 보안 정책 설정을 제외한 나머지 사항은 동적 변경이 불가능하다. 따라서 보안 도메인을 추가하거나, 보안 서비스 설정 등을 수정했을 경우 서버를 재부팅해야 수정된 사항이 적용됨에 유의한다.

주의

보안과 관련된 모든 설정은 JEUS 도메인에 속한 모든 서버에 동일하게 적용된다. 따라서 사용자 계정 설정과 보안 정책 설정을 제외하고는 동작하고 있는 모든 서버를 재부팅해야 보안 설정 적용이 가능하다.

보안 도메인 설정을 위해서는 JEUS Master Server가 기동 중이어야 하고 설정 적용을 위해선 JEUS Master Server를 포함한 서버 재부팅이 필요하다. 본 절에서는 WebAdmin과 XML 편집을 통해 보안 도메인을 정의하는 방법에 대해 설명한다.

XML을 직접 편집하려면 JEUS_HOME/domains/<domain name>/config/domain.xml 및 JEUS_HOME/domains/<domain name>/config/security/security-domains.xml 내의 다음 태그를 이용하여 설정한다.

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


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


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

본 절에서 설명은 디폴트로 제공되는 XML을 이용한 설정에 대해 설명한다.

사용자 계정 및 보안 정책 설정은 XML뿐만 아니라 데이터베이스에 사용자 계정 정보와 보안 정책 정보를 저장하여 사용하는 것도 가능하며, 이에 대한 자세한 내용은 “2.5.3. 데이터베이스 사용 설정”“2.6.3. 데이터베이스 사용 설정”을 참고한다.

다음은 사용자 계정 및 보안 정책을 설정하는 과정에 대한 설명이다.

  1. 새로운 보안 도메인을 설정하려면 JEUS_HOME/domains/<domain name>/config/security 아래에 새로운 디렉터리를 생성해야 한다. 디렉터리 이름은 생성하려는 보안 도메인 이름과 일치해야 한다. 일반적으로 보안 도메인 이름은 모두 대문자로 쓰고 "_DOMAIN"으로 끝맺는다. 예를 들면 "DEFAULT_APPLICATION_DOMAIN"으로 명명할 수 있다.

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

    $ mkdir ${JEUS_HOME}/domains/domain1/config/security/DEFAULT_APPLICATION_DOMAIN

    참고

    domain1은 실제 JEUS 도메인 이름으로 대체되어야 한다.

  2. 새로운 도메인 디렉터리를 생성한 후에 디렉터리 내에 몇 가지 설정 파일들을 생성한다.

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

    $ cp ${JEUS_HOME}/domains/domain1/config/security/SYSTEM_DOMAIN/*.*
         ${JEUS_HOME}/domains/domain1/config/security/DEFAULT_APPLICATION_DOMAIN

    JEUS_HOME/domains/<domain name>/security 아래에 SYSTEM_DOMAIN이 이미 디폴트로 존재한다. SYSTEM_DOMAIN은 JEUS 서버가 사용자 인증과 권한 체크를 위해 사용하는 도메인이다. 이 도메인은 JEUS를 기동하고, 종료하는 등의 Permission들과 JEUS 시스템 "administrator" 계정을 포함하고 있다.

  3. 새로운 보안 도메인 이름을 JEUS_HOME/domains/<domain name>/config/domain.xml 및 JEUS_HOME/domains/<domain name>/config/security/security-domains.xml에 각각 추가한다. domain.xml의 경우는 <security-manager><security-domain-names>에 추가해야 하고, security-domains.xml의 경우는 <security-domains><security-domain>에 추가한다.

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

    보안 도메인 SYSTEM_DOMAIN은 domain.xml의 설정과는 관계없이 항상 포함된다. 기본적으로 JEUS_HOME/domains/<domain name>/config/security 경로 아래에 도메인과 같은 이름의 디렉터리를 생성하여 각 도메인별로 정의할 Repository에 대한 계정 정보(account.xsd)와 보안 정책 정보(policies.xsd)를 정의한다. 기타 도메인별 Security Service 등록은 domain.xml에 한다.

주의

디폴트 보안 시스템에서 WebAdmin을 통해 보안 도메인을 추가한 경우에 위의 작업을 해 주지 않으면 SYSTEM_DOMAIN에 존재하는 계정 정보와 보안 정책 정보를 공유하게 된다. 보안 도메인에 따라 계정 정보와 보안 정책 정보를 분리하기 위해서는 위의 작업을 반드시 해야 한다.

본 절에서는 보안 서비스를 제외한 보안 도메인의 구성요소들을 설정하는 방법에 대해 설명한다.

WebAdmin 메인 화면에서 Master Server를 선택한 후 설정 화면의 상단 탭에서 [도메인]을 선택한다.

도메인 화면에서 보안 영역상세 정보를 선택하면 현재 구성된 보안 도메인에 대한 정보가 Security 기본 설정 화면에 조회된다. Security Domains 목록에서 수정할 보안 도메인을 선택한다. 보안 도메인은 “2.2. 보안 도메인 설정”에서 설명한 대로 정의되어 있어야 한다.

목록에서 설정할 도메인 이름을 클릭하면 보안 설정 화면으로 이동한다.


보안 설정 화면은 다음의 탭으로 구성된다. 각 탭의 자세한 설명은 해당 절의 설명을 참고한다.

설명
[Basic]도메인에 적용된 보안 서비스에서 적용할 Keystore 파일의 정보 및 cache 정책값을 정의한다.
[Security Service]보안 서비스들을 설정하는 화면이다.
[Custom Service]JEUS Security Framework에서 제공하는 서비스 속성에 상관없이 JEUS Security API를 Implement한 서비스 속성에 별도의 보안 서비스 등록할 수 있다. 자세한 설명은 “2.4. 보안 서비스 설정”을 참고한다.
[Account & Policy]사용자 계정 및 보안 정책을 설정한다. 자세한 설명은 “2.5. 보안 시스템 사용자 정보 설정”“2.6. 보안 시스템 정책 설정”을 참고한다.

[Basic] 탭

[Basic] 탭에서 도메인 보안 서비스에 적용할 Keystore 파일의 정보 및 Cache 정책값을 정의할 수 있다. [수정] 버튼을 클릭해서 수정 모드로 변경한 후 Keystore Config, Cache Config를 설정할 수 있다.

[Custom Service] 탭

[Custom Service] 탭에서 JEUS Security에서 기본으로 제공하는 보안 서비스를 사용하지 않고, JEUS Security SPI를 Implement한 별도의 보안 서비스 등록할 수 있다. 단, JEUS 시스템이 동작하기 위해서는 AuthenticationService, AuthenticationRepositoryService, AuthorizationService, AuthorizationRepositoryService, CredentialVerificationService SPI는 반드시 등록되어야 한다.

JEUS에서 제공하는 보안 서비스 종류와 Custom 보안 서비스의 개발과 관련된 사항은 “제5장 Custom 보안 서비스 개발”을 참고한다.


각 보안 도메인에서 로딩되는 보안 서비스는 domain.xmlsecurity-domains.xml에 설정되어 있다.

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



참고

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

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

JEUS 보안 시스템은 플러그(plug) 형태의 인증(Authentication) 서비스와 권한 확인(Authorization) 서비스를 지원한다. 본 절에서는 보안 서비스를 포함하여 보안 도메인의 구성요소들을 WebAdmin과 XML 편집을 통해 설정하는 방법에 대해 설명한다.

보안 설정 화면[Security Service] 탭을 선택하면 보안 서비스들을 설정하는 메뉴를 표시한다. 보안과 관련된 작업을 하는 보안 서비스는 도메인별로 정의할 수 있다. 보안 서비스에 따라 해당 보안 도메인에서의 인증, 권한 확인 등에 대한 내부 동작이 달라진다.


다음은 보안 설정화면 설정 메뉴에 대한 설명이다. 각 메뉴에 대한 자세한 내용은 해당 절을 참고한다.

메뉴설명
[Authentication]사용자 인증과 관련된 보안 서비스들을 수정한다.
[Authorization]사용자 권한 확인과 관련된 보안 서비스들을 수정할 수 있다.
[Identity Assertion]인증서로부터 사용자의 이름을 얻어오는 서비스를 설정할 수 있다.
[Credential Mapping]X509Certificate에 대한 Truststore 파일의 경로와 패스워드 경로를 지정할 수 있다.
[Credential Verification]사용자의 Credential에 대해서 검사를 하는 서비스를 선택할 수 있다.
[Audit]JEUS Security Framework에서 발생하는 이벤트에 대한 정보를 수집하는 서비스에 대한 설정을 할 수 있다.
[Subject Validation]사용자(Subject)에 대한 유효성 검사를 한다.

[Authentication] 메뉴

보안 설정 화면의 설정 메뉴에서 [Authentication]를 선택한 후 [수정] 버튼을 클릭해서 수정 모드로 변경하면 사용자 인증과 관련된 보안 서비스들을 수정할 수 있다.

[Authorization] 메뉴

보안 설정 화면의 설정 메뉴에서 [Authorization]를 선택한 후 [수정] 버튼을 클릭해서 수정 모드로 변경하면 사용자 권한 확인과 관련된 보안 서비스들을 수정할 수 있다.

[Identity Assertion] 메뉴

보안 설정 화면의 설정 메뉴에서 [Identity Assertion]를 선택한 후 [수정] 버튼을 클릭해서 수정 모드로 변경하면 인증서로부터 사용자의 이름을 얻어오는 서비스를 설정할 수 있다. jeus.security.spi.IdentityAssertionService를 구현한 클래스 중 하나를 선택한다.


  • Service Type

    항목설명
    Default Identity Assertion Service

    기본값으로 JEUS에서 제공하는 DefaultIdentityAssertionService에 대한 설정을 변경할 수 있다. 이 서비스는 X509Certificate를 기반으로 동작한다.

    'Filename', 'Filepath' 설정을 통해 인증서와 사용자 이름의 매핑 정보가 있는 XML 파일을 지정할 수 있다.

    Kerberos Identity Assertion

    Kerberos 프로토콜을 이용한 Assertion에 대한 설정을 할 수 있다.

    해당 설정을 하게 되면 JEUS에서 제공하는 LoginModule 구현체 중 jeus.security.impl.login.KerberosSharedStateLoginModule이 활성화된다.

    Custome Identity Assertion ServiceCustom Indentity Assertion 서비스를 정의한다. SPI 를 직접 구현한 클래스를 정의한다.

[Credential Mapping] 메뉴

보안 설정 화면의 설정 메뉴에서 [Credential Mapping]를 선택한 후 [수정] 버튼을 클릭해서 수정 모드로 변경하면 X509Certificate에 대한 Truststore와 패스워드 경로를 지정할 수 있다. 기본값으로 jeus.security.spi.CredentialMappingService의 기본 구현체인 jeus.security.impl.credmap.JKSCertificateCredentialMappingService 서비스가 활성화된다.


[Credential Verification] 메뉴

보안 설정 화면의 설정 메뉴에서 [Credential Verification]를 선택한 후 [수정] 버튼을 클릭해서 수정 모드로 변경하면 사용자의 Credential에 대해서 검사하는 서비스를 선택할 수 있다. [Custom Service] 탭에서 [+추가] 버튼을 클릭하면 jeus.security.spi.CredentialVerificationService를 구현한 클래스를 추가해서 사용할 수 있다.


다음은 항목에 대한 설명이다.

항목설명
Jeus Certificate Verification사용함으로 설정하면 X509Certificate 검사가 가능하도록 할 수 있다.
Password Verification기본값으로 사용함으로 설정되어 사용자의 Password를 검사한다.

[Audit] 메뉴

보안 설정 화면의 설정 메뉴에서 [Audit]를 선택한 후 [수정] 버튼을 클릭해서 수정 모드로 변경하면 JEUS Security framework에서 발생하는 이벤트에 대한 정보를 수집하는 서비스에 대한 설정을 할 수 있다. [Custom Service] 탭에서 [+추가] 버튼을 클릭하면 jeus.security.spi.EventHandlingService를 구현한 클래스를 추가해서 사용할 수 있다.


다음은 항목에 대한 설명이다.

항목설명
Audit Level로그 레벨을 설정한다.
Config File'Filename', 'Filepath'에 로그를 남길 파일 이름과 경로를 설정한다. 기본 구현체인 jeus.security.impl.auditlog.BasicAuditLogFileService이 사용된다.

[Subject Validation] 메뉴

보안 설정 화면의 설정 메뉴에서 [Subject Validation]를 선택한 후 [수정] 버튼을 클릭해서 수정 모드로 변경하면 사용자(Subject)에 대한 유효성 검사 여부를 설정할 수 있다.

[Custom Service] 탭에서 [+추가] 버튼을 클릭하면 jeus.security.spi.SubjectValidationService를 구현한 클래스를 추가해서 사용할 수 있다.


각 보안 도메인에서 로딩되는 보안 서비스는 security-domains.xml 내에 다음과 같이 설정되어 있다.

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


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

Custom 보안 서비스

다음은 Custom 보안 서비스를 설정하는 방법이다. JEUS에서 제공하는 보안 서비스 종류와 Custom 보안 서비스의 개발과 관련된 사항은 “제5장 Custom 보안 서비스 개발”을 참고한다.

  • <classname> (필수)

    Custom 보안 서비스를 구현한 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 속성값을 설정한다.

디폴트 보안 설정에서 사용자 데이터는 accounts.xml 파일에서 읽어 들인다.

다음은 파일 저장 경로이다.

JEUS_HOME/domains/<domain name>/config/security/<security domain name>/accounts.xml

여기서 <domain name>은 도메인의 이름이고, <security domain name>은 사용자가 관리될 보안 도메인의 이름을 나타낸다.

다음은 WebAdmin에서 사용자 정보를 설정하는 과정에 대한 설명이다.

  1. WebAdmin 메인 화면에서 Master Server를 선택하면 설정 화면으로 이동한다.

  2. 설정 화면의 상단 탭에서 [도메인]을 선택한 후 보안 영역에서 상세 정보를 클릭하면 현재 구성된 보안 도메인에 대한 정보가 보안 기본 설정 화면에 조회된다.

  3. 기본 설정 화면 상단의 탭에서 [Account & Policy]를 선택한 후 설정 메뉴에서 [Account]를 선택하면 동적 설정변경이 가능한 사용자 정보에 대한 설정이 가능하다. [+추가], [삭제] 버튼을 클릭하여 사용자와 그룹을 추가, 삭제할 수 있다.


    • Group 목록

      그룹을 추가, 삭제하는 것이 가능하다. 'Group' 항목에서 사용자가 속할 Group을 지정한 뒤 [추가] 버튼을 클릭한다.

accounts.xml의 XML 스키마는 accounts.xsd이며, JEUS_HOME/lib/schemas/jeus/supportLocale/ko 경로에 있다. accounts.xml 파일에는 최상위 태그 <accounts> 하위에 <users> 및 <groups> 태그가 있으며 0개 이상의 <user> 및 <group> 태그가 포함되어 있다. 각각은 사용자와 그룹을 나타낸다.


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

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

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


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

다음 예제는 JEUS JDBC를 이용하지 않을 때 데이터베이스 Repository를 설정하는 방법이다.


참고

이 방식을 이용할 경우 커넥션을 맺고 끊는 것이 매우 잦기 때문에 성능상 문제가 있을 가능성이 크므로 JEUS JDBC(<datasource-id>)를 이용하는 방법을 권장한다.

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


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

본 절에서는 패스워드 보안 설정에 대한 사항 중 패스워드의 적합성 검사와 암호화 알고리듬, 그리고 SecretKey 파일 관리방법에 대해서 설명한다.

패스워드의 적합성 검사

사용자가 신규 계정을 생성하기 위해 패스워드를 입력하거나 기존 패스워드를 변경할 경우 패스워드의 적합성을 검사하여 제약을 줄 수 있다. 일반적으로 사용되는 제약 사항(알파벳과 숫자, 특수문자의 사용 여부나 아이디와 패스워드를 같게 하면 안되는 규칙 등등)과 같은 방식을 이용하여 패스워드의 보안을 강화할 수 있다.

Domain administrator는 기본적으로 제공되는 Default Password Validator나 사용자가 직접 구현하는 Custom Password Validator 중에 하나를 선택하여 도메인 전체에 적용할 수 있다. 각각의 기능을 사용하기 위해 사용자는 WebAdmin 또는 jeusadmin의 명령어를 통해 설정을 추가, 변경 및 삭제 할 수 있다. 사용자의 설정 정보는 domain.xml에 저장된다.

암호화 알고리듬

사용자 설정을 할 때는 사용자의 패스워드를 지정해야 한다. 패스워드를 plain-text 형식으로 저장하는 것이 가능하나 암호화 알고리듬을 통해 암호화하여 타인이 알아볼 수 없도록 한다.

참고

안정성이 입증된 대칭키 알고리듬인 AES를 사용하는 것을 권장한다.

jeusadmin의 set-password 명령어나 WebAdmin을 통해 사용자별로 패스워드의 암호화가 가능하며, JEUS_HOME/bin/encryption을 이용하여 직접 암호화할 수도 있다.

직접 암호화한 경우는 패스워드를 설정할 때 다음의 형식으로 설정한다.

{알고리듬}암호화된문자열 

대칭키 암호화 알고리듬의 키 값은 JEUS_HOME/domains/<domain name>/config/security/security.key 파일에 저장된다.

다음은 패스워드 암호화에서 지원하는 알고리듬에 대한 설명이다.

항목설명
AES/DES/DESede/SEED/Blowfish대칭키 암호화 알고리듬이다.
base64인코딩 알고리듬이다. Base64로 인코딩된 정보는 누구나 손쉽게 디코딩할 수 있어 보안상 안전하지 않다.
SHAHash 알고리듬이다. 복호화가 불가능하다.

암호화 알고리듬을 사용할 때 key의 크기를 지정할 수 있다. Key 크기는 관리자가 시스템 프로퍼티로 관리하며 시스템 전체에 통일된 key 크기가 적용된다.

Key 크기의 기본값은 256bit 이며, 시스템 프로퍼티로 jeus.security.keylength 옵션을 주어 key 크기를 변경할 수 있다. 예를 들어 "-Djeus.security.keylength=256" 옵션을 주어 256bit의 key 크기를 갖는 암호화 알고리듬을 사용할 수 있다.

시스템 프로퍼티로 설정한 key 크기가 암호화 알고리듬이 지원하는 최대 key 크기 값보다 큰 경우, 암호화 알고리듬이 지원하는 최대값으로 key 크기가 설정된다. 예를 들어 AES는 key 크기로 128, 192, 256bit만 지원하기 때문에 AES512와 같은 설정은 AES256으로 적용된다.

만약 지정한 key 크기가 암호화 알고리듬이 지원하는 최대 key 크기 값보다 작으면서 지원하지 않는 key 크기인 경우에는 EncryptionException이 발생한다. 예를 들어 AES는 key 크기로 128, 192, 256bit만 지원하기 때문에 AES200과 같은 설정은 EncryptionException이 발생한다.

주의

새롭게 시스템 프로퍼티를 설정한 이후에는 반드시 새롭게 password 초기화 과정을 거쳐야 한다.

마스터 패스워드를 통한 SecretKey 파일 관리

암호화 툴(JEUS_HOME/bin에 위치)을 사용해서 패스워드를 암호화하는 경우 해당 암호화 파일에 적용되는 SecretKey 정보를 security.key 파일에 암호화 알고리듬별로 저장하여 관리한다. 마스터 패스워드를 입력받아 이 패스워드로 security.key 파일을 암호화하여 저장할 수 있다.

security.key 파일은 다음 경로에 위치한다. 도메인 환경을 구성하는 경우 해당 security.key 파일을 함께 다른 노드에 옮겨놓아야 한다.

JEUS_HOME/domains/<domain name>/config/security/security.key

JEUS에 등록하는 데이터베이스 패스워드를 암호화하였을 경우 클라이언트에서는 이를 decrypt하기 위해 Key가 필요하다. 이때 SecretKey 파일 경로를 시스템 프로퍼티를 이용해 설정할 수 있다.

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

JEUS 스크립트를 통한 서버 부트나 jeusadmin으로 서버에 접속할 때는 사용자 정보가 필수로 입력되어야 한다. 이때 사용자 정보를 매번 입력하지 않고 로그인 정보를 캐시하여 사용할 수 있는 기능을 제공한다.

주의

해당 정보는 USER_HOME/.jeusadmin/.jeuspasswd 파일에 AES로 인코딩되어 저장된다. 캐시 로그인 기능은 JEUS_HOME/bin/security.key 파일을 통해 인코딩/디코딩을 수행한다. 파일에 사용자의 중요한 정보인 id/password가 저장되기 때문에 본 기능의 사용은 권장하지 않는다.

로그인 정보의 Cache는 한 번이라도 인증이 이루어진 다음 파일에 기록된다.

JEUS 스크립트를 통한 서버 부트나 jeusadmin의 connect 명령어를 수행할 때 사용자 정보와 함께 -cachelogin 옵션을 추가하면 해당 로그인 정보가 파일에 저장된다. 이때 캐시 파일에 <domain name>:<user name>을 Key로 로그인 정보가 저장된다.

추후 JEUS 스크립트가 실행될 때 사용자 패스워드를 입력하지 않아도 도메인 이름과 사용자 이름에 대한 로그인 정보가 존재하면 자동으로 사용자 정보를 채워준다. 캐시된 로그인 정보가 존재한다 하더라도 사용자가 직접 사용자 정보를 입력한 경우에는 캐시된 로그인 정보는 무시된다.

다음 예제는 저장된 로그인 정보를 보여준다.

#Warning: We don't recommend to use this on Production Environment.
domain1:user1 gEPaqBz6BaAxWxdSXf8wZNPLsWkysgcov/KJnHvDeduKRvTAOb7F6zRaPHc2zLBUIUi46FQFWnl4mQiEIUbG9UEe4yZrsRri7yS9qi+7EwA=

저장된 로그인 정보는 jeusadmin의 off-line 명령어인 remove-login-cache를 통해 삭제할 수 있다.

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

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

JEUS_HOME/domains/<domain name>/config/security/<security domain name>/policies.xml

<domain name>은 도메인의 이름이고, <security domain name>은 정책이 적용될 보안 도메인의 이름을 나타낸다.

WebAdmin 메인 화면에서 Master Server를 선택하면 설정 화면으로 이동한 후 상단 탭에서 [도메인]을 선택한 후 보안 영역에서 상세 정보를 클릭하면 보안 기본 설정 화면에 조회된다. 보안 도메인 목록에서 설정할 도메인은 선택한 후 보안 설정 화면에서 [Account & Policy] 탭을 선택한다. 설정 메뉴에서 [Policy] 메뉴를 선택하면 보안 정책에 대한 사항을 설정할 수 있다. Role Permission 영역에서는 Principal과 Role에 대한 매핑을 정의할 수 있다. 하나의 Role에 여러 개의 Principal이 매핑될 수 있으며, 이렇게 매핑된 Principal을 해당 Role에 대한 권한을 갖는다. [+추가] 버튼을 클릭하여 Principal-to-Role 매핑을 추가할 수 있다.


주의

사용자 정보 설정과 마찬가지로 이 화면에서는 JEUS에서 제공하는 기본 보안 시스템에 사용되는 policies.xml 파일에 대한 수정만이 제공됨에 유의한다.

Role Permission 추가

Policy 설정 화면Role Permision 목록에서 [+추가] 버튼을 클릭하면 Role Permision을 등록할 수 있다. 'Role'에 이름을 지정한 뒤 해당 Role의 권한을 부여할 Principal을 선택한다. 누구도 Role에 접근하지 못하게 하려면 'Excluded'에 사용을 체크하고, 누구나 Role에 접근할 수 있도록 하려면 'Unchecked'에 사용을 체크한다. 정보의 등록이 완료되면 [추가] 버튼을 클릭한다.


Resource Permission 추가

Policy 설정 화면Resource Permission목록에서 [+추가] 버튼을 클릭하면 Resource Permission을 등록할 수 있다.

다음은 Resource Permission을 등록하는 과정에 대한 설명이다.

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


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

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

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은 뱅킹 애플리케이션에서 "user2"라는 Principal이 오전 9시부터 오후 5시까지 업무시간 동안만 "teller"라는 Role을 가질 수 있도록 만들 수 있다.

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

  1. Custom Permission 클래스를 구현한다. 클래스 구현이 완료되면 "javac"로 컴파일하고 JEUS 서버의 클래스 패스에 해당 클래스 경로를 설정한다.

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


    해당 클래스는 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"를 뜻한다. 몇몇 Permission 구현 클래스는 "actions" 파라미터를 받는 두 번째 타입의 생성자가 생략되기도 한다.

      • "actions" 파라미터는 Permission에 대한 유효 시간을 나타내며, “09:00-17:00”라는 값을 가진다.

      • "name" 파라미터는 "administrator" 또는 "teller"와 같은 Role명을 나타낸다.

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

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


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

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

데이터베이스를 이용하여 Policy를 설정하려면 다음과 같이 security-domains.xml에서 보안 도메인 서비스를 지정해야 한다. Authentication과 마찬가지로 Driver Manager를 직접 이용하고 싶은 경우 <datasource-id> 대신에 <dbdriver-config> 태그를 추가한다. 그러나 일반적으로 JEUS JDBC 데이터소스를 사용할 것을 권장한다.


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

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

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


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

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

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

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

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

Java SE SecurityManger를 JEUS와 함께 동작시키기 위해 domain.xml에 특정 서버에 대해 jvm-option을 다음과 같이 정의한다.

-Djava.security.manager 
-Djava.security.policy=${JEUS_HOME}/domains/domain1/config/security/policy(UNIX기준)

정책 파일은 JEUS_HOME/domains/<domain name>/config/security/policy이며 내용은 다음과 같다.


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

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

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

IdentityAssertionService 지원하는 경우 추가적으로 인증서와 사용자 간의 매핑 정보가 있는 cert-user-map.xml 파일에서 읽어 들인다. 이 파일은 다음의 경로에 위치한다.

JEUS_HOME/domains/<domain name>/config/security/<security domain name>/

<domain name>은 도메인의 이름이고, <security domain name>은 사용자가 속한 보안 도메인의 이름을 나타낸다. cert-user-map.xml의 XML 스키마는 cert-user-map.xsd이며, JEUS_HOME/lib/schemas/jeus/supportLocale/ko 경로에 있다.

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


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

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

JEUS_HOME/domains/<domain name>/config/security/<security domain name>/ 

<domain name>은 도메인의 이름이고, <security domain name>은 사용자가 속한 보안 도메인의 이름을 나타낸다. user-cert-map.xml의 XML 스키마는 user-cert-map.xsd이며, JEUS_HOME/lib/schmas/jeus/supportLocale/ko 경로에 있다.

(JEUS_HOME/lib/schmas/jeus/supportLocale/ko )

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


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