14장. 보안 서브시스템

Name

Date

Reason For Changes

Version

오픈나루

2013/11

Initial Version

1.0

전준식, jjeon@opennaru.com

2018/02

Second Version

2.0

이번 장에서는 애플리케이션이나 JBoss 콘솔, CLI의 접근을 제한하는 보안 설정방법에 대해서 살펴보자. Java EE의 표준 보안 아키텍처에 대한 구조 및 JBoss EAP 6의 서브시스템 설정 방법에 대해서도 설명한다. 또, 데이터베이스 접속 패스워드가 XML파일에 노출되지 않도록 암호화하는 방법에 대해서도 설명한다.

14-1.보안 서브시스템

보안은 모든 엔터프라이즈 애플리케이션의 필수 요소 중 하나이다. 애플리케이션에 접근할 수 있는 권한을 가진 사용자만 사용할 수 있도록 제한하는 기능도 필요하며, 사용자의 역할에 따라 사용할 수 있는 기능을 제한하는 기능도 필요하다. Java EE 표준에서는 EJB나 웹 애플리케이션에 대한 접근 권한을 역할 기반 보안 모델(role-based security model)로 정의하고 있다. JAAS(Java Authentication and Authorization Service) 표준을 기반으로 하고 있다.

JBoss EAP 6에서는 JBoss의 PicketBox와 PicketLink Framework으로 보안 서브시스템을 사용하고 있다. PicketBox는 가장 기본이 되는 보안 프레임워크로 인증(Authentication), 인가(Authorization), 감사(Audit)와 Java 애플리케이션과 맵핑하는 기능을 제공하는 프레임워크이다. PicketBox와 비슷한 이름의 PicketLink는 애플리케이션 보안 프레임워크로 사용자 인증, 애플리케이션의 비즈니스 메서드에 대한 인가 및 사용자, 그룹, 역할, 권한을 관리하는 기능을 제공한다.

JBoss EAP 6의 보안은 도메인이나 보안 영역의 개념을 도입하였고, 설정 파일이 통합되어 이전 버전보다 사용하기 편리해졌다. 이번 장에서는 EAP 6의 보안 서브시스템, 보안 도메인, 보안 영역의 설정 방법에 대해 설명한다.

보안 서브시스템은 다음과 같은 4개 항목으로 구성된다.

파라미터 설명

security-domains

보안 도메인은 인증, 보안 감사, 보안 맵핑을 제어하기 위해 애플리케이션이 사용하는 JAAS(Java Authentication and Authorization Service) 보안 설정들의 집합이다.

여러 개의 보안 도메인을 설정할 수 있다. 보안 도메인에 인증, 권한 부여, 맵핑, 감사 모듈 및 JASPI 인증, JSSE 구성 정보를 포함할 수 있다. 애플리케이션에서 보안 도메인의 이름을 지정하여 보안 설정을 한다.

security-management

보안의 동작이나 클래스를 설정한다. 이것을 설정하면 보안 서브시스템의 실행방법이 바뀐다. 이 설정을 변경하는 일은 거의 없다.

subject-factory

서브젝트 팩토리는 서브젝트(주체) 인스턴스 생성을 제어한다. 서브젝트 팩토리는 주로 JCA 구성요소에 사용된다. 이 설정을 변경하는 일은 거의 없다.

security-properties

java.security.Security 클래스에 사용할 프로퍼티의 이름과 값을 설정한다.

표 1. 보안 서브시스템의 주요 설정 항목

<subsystem xmlns="urn:jboss:domain:security:1.2">
  <security-management>
    …
  </security-management>
  <subject-factory>
    …
  </subject-factory>
  <security-domains>
    <security-domain name="other" cache-type="default">
      <authentication>
        <login-module code="Remoting" flag="optional">
          <module-option name="password-stacking" value="useFirstPass"/>
            <login-module code="RealmDirect" flag="required">
            </login-module>
          <module-option name="password-stacking" value="useFirstPass"/>
        </login-module>
      </authentication>
    </security-domain>
    <security-domain name="jboss-web-policy" cache-type="default">
      <authorization>
        <policy-module code="Delegating" flag="required"/>
      </authorization>
    </security-domain>
    <security-domain name="jboss-ejb-policy" cache-type="default">
      <authorization>
        <policy-module code="Delegating" flag="required"/>
      </authorization>
    </security-domain>
  </security-domains>
  <security-properties>
    …
  </security-properties>
</subsystem>

14-2.보안 도메인

보안 도메인은 JBoss EAP 6의 보안 서브시스템의 일부이다. 보안 설정은 모든 관리 도메인의 도메인 컨트롤러나 스탠드얼론 모드에서 관리 할 수 있도록 한다.

보안 도메인은 인증, 인가, 맵핑, 감사의 설정으로 구성된다. 보안 도메인은 Java 인증 및 권한 서비스(JAAS)의 보안을 구현한다.

인증은 사용자 신원을 확인하는 것을 말한다. 보안에서는 사용자를 Principle이라고 한다. 인증 및 권한 부여는 다르지만, 인증 모듈의 대부분은 권한에 대해서도 처리한다.

권한은 허가 또는 금지된 작업에 대한 정보가 포함된 보안 정책이다. 보안에서는 역할이라고 한다.

보안 맵핑은 정보를 애플리케이션에 전달하기 전에 서브젝트(주체) 및 역할 특성에 대해 정보를 추가, 편집, 삭제하는 기능이다.

감사는 보안 관련 이벤트를 보고하는 방법을 설정한다.

애플리케이션에서 보안 도메인을 사용하면 애플리케이션의 보안 모듈이나 프로그래밍으로 처리하던 부분을 제거할 수 있다. 애플리케이션에는 어떤 보안 도메인을 사용한다는 설정만 하면 된다.

보안 서브시스템 중 가장 많이 사용되는 것이 보안 도메인이며, 기본적으로 jboss-ejb-policy, jboss-web-policy, other의 3개 보안도메인이 설정되어있다.

보안 도메인이 지원하는 보안의 종류와 사용할 수 있는 모듈들은 다음과 같다.

보안의 종류 설명 모듈

인증(Authentication)

서브젝트(주체)를 식별하여 진짜가 맞는지 검증한다. 가장 일반적인 인증 방식은 사용자 아이디와 패스워드를 사용하는 방식이다. 사용자 정보를 Principle이라고 한다.

•Client
•Certificate
•Database
•Identity
•Ldap
•Kerberos외

인가(Authorization)

자원에 대한 접근 권한을 검증하는 역할을 한다. Principle에 대해 제공할 수 있는 보안 역할(Role)이다

•DenyAll
•PermitAll
•Delegating
•Web
•JACC
•XACML

맵핑(Mapping)

인증, 인가가 실행된 후 애플리케이션에 전달되기 전 인증, 인가 정보를 Principle이나 역할(Role), 보증서(Credential) 등 정보와 맵핑한다.

•PropertiesRoles
•SimpleRoles
•DeploymentRoles
•DatabaseRoles
•LdapRoles

감사(Audit)

보안 서브시스템 내에서 발생한 이벤트를 로그에 기록하는 등의 작업을 한다.

•LogAuditProvider

표 2. 보안 도메인의 보안의 종류와 모듈

14-3.보안 영역

보안 영역(Security Realm)은 인증이나 인가를 설정하는 곳으로 관리 인터페이스나 JMX, RMI 등에서 사용할 수 있다. JBoss EAP 6에서는 다음과 같이 2개의 보안 영역이 설정되어 있다.

  • ManagementRealm

    CLI나 관리 콘솔의 인증 방법이 설정되어 있다. 기본적으로 mgmt-users.properties 파일을 사용하여 관리자를 설정되어 있다.

  • ApplicationRealm

    RMI 인터페이스의 인증 방법을 규정한다. 기본적으로 application-users.properties, application-roles.properties 파일을 사용하도록 설정되어 있다.

보안 도메인과 보안 영역의 차이점

보안 영역은 위에서 설명한 보안 도메인과 비슷하지만, 설정 내용이나 설정 방법 등에서 몇 가지 차이점이 있다.

항목 보안 도메인 보안 영역

개요

애플리케이션에 대한 JAAS 인증

관리 인터페이스에 대한 인증

설정 파일

standalone.xml

domain.xml

standalone.xml

host.xml

설정 내용

  • 인증

  • 인가

  • 맵핑

  • 감사

  • 인증

  • 인가

  • 보안 도메인

사용자 인증 방법

  • 로그인 모듈(DB, LDAP, 구현)

  • 프로퍼티 파일

  • 설정 파일

  • JAAS(보안 도메인을 이용)

설정 방법

  • 관리 콘솔

  • CLI

  • CLI

이용 대상

애플리케이션, 보안 영역

관리 인터페이스, JMX 인터페이스

표 3. 보안 도메인과 보안 영역의 차이점

관리 인터페이스

JBoss EAP 6에서 서버의 설정을 변경하는 관리 인터페이스는 웹 콘솔과 CLI가 있다. 이 두 가지 관리 인터페이스의 인증처리에 보안 영역을 사용한다. 기본적으로 설정된 ‘ManagementRealm’을 사용하는데, 관리자가 접속하는 위치에 따라 동작이 다르다.

  • 로컬 접속

    CLI에서 같은 서버(localhost)에서 접근할 경우 인증 처리를 생략한다.

  • 리모트 접속

    웹 콘솔로 접속하거나 외부 서버에서 CLI로 접속할 때는 인증 처리 한다.

ManagementRealm은 $JBOSS_HOME/configuration/mgmt-users.properties 파일을 사용하여 인증하도록 설정되어 있다. 이 파일의 패스워드는 암호화되어 있기 때문에 직접 입력할 수 없고 앞서 설명한 add-user.sh 파일을 실행하여 관리자 ID와 패스워드를 추가해야 한다.

‘ManagementRealm’의 <authentication>을 수정하면 mgmt-users.properties 파일이 아니라 데이터베이스에 있는 패스워드나 LDAP을 사용하도록 변경할 수 있다. 만약 변경이 필요하면 매뉴얼을 참고하라.

14-4.데이터베이스 패스워드 암호화 방법

설정 파일에 데이터베이스 접속 패스워드가 평문(plain-text)으로 노출되는 것을 허용하지 않는 엔터프라이즈 시스템들이 많이 있다. JBoss EAP 6에서는 패스워드를 암호화하는 방법으로 Java의 KeyStore를 사용한 RSA 방식의 높은 수준의 암호화 방식을 제공하고 있다. Java의 KeyStore를 만들고 valut.sh 파일을 실행하여 암호화한 텍스트를 standalone.xml이나 domain.xml에 설정하는 방법이다. 사용방법은 다음 URL을 참고하라.

하지만, 이런 높은 수준의 암호화가 필요한 경우가 아니라면, SecureIndentityLoginModule을 사용하여 더 간편하게 암호화된 문자열을 사용할 수 있다.

JBoss EAP 6.2 버전에서는 다음과 같이 실행한다. 다른 버전의 JBoss에서 사용하려면 picketbox나 jboss-logging 모듈의 버전이 달라서 jar 파일의 이름을 해당 버전에 맞게 변경하여야 한다.

파라미터로 ‘password’를 입력하면 암호화된 패스워드가 출력된다. 문자열 암호화에는 내부적으로 ‘Blowfish’라는 암호화 알고리즘이 사용된다.

$ java -cp $JBOSS_HOME/modules/system/layers/base/org/picketbox/main/picketbox-4.0.19.SP2-redhat-1.jar:$JBOSS_HOME/modules/system/layers/base/org/jboss/logging/main/jboss-logging-3.1.2.GA-redhat-1.jar org.picketbox.datasource.security.SecureIdentityLoginModule password

Encoded password: 5dfc52b51bd35553df8592078de921bc

암호화된 문자열을 사용하는 보안 도메인을 standalone.xml파일이나 domain.xml파일에 아래와 같이 설정한다.

<security-domain name="*EncryptedPasswordDomain*">
  <authentication>
    <login-module code="SecureIdentityLogin" flag="required">
      <module-option name="username" value="test"/>
      <module-option name="password" value="*5dfc52b51bd35553df8592078de921bc*"/>
      <module-option name="managedConnectionFactoryName" value="jboss.jca:service=LocalTxCM,name=**dataSource-1-PoolName,dataSource-2-PoolName**"/>
    </login-module>
  </authentication>
</security-domain>

마지막으로 암호화된 문자열을 사용할 데이터소스에 <user-name>, <password>를 삭제하고 <security-domain>을 추가한다.

<datasource ... >
  ...
  <security>
    <security-domain>EncryptedPasswordDomain</security-domain>
  </security>
</datasource>

이런 방식으로 데이터베이스에 접근하는 사용자의 패스워드를 암호화하여 사용할 수 있다.