Tagged: JBOSS EAP 6

Jboss EAP 6 기초 보안

Jboss EAP 6 를 설치하고 난후에 해야할 기초 보안에 대해서 알아본다.

기본 페이지 비활성화 하기

Jboss EAP 6 를 설치하고 난후 도메인:포트 만 넣고 접속을 하면 다음과 같이 Jboss EAP 6 에서 제공하는 페이지가 나온다.

Jboss EAP 6 의 기본 페이지

내가 설정하지도 않았는데도 위와같이 Jboss EAP 6 에서 기본적으로 제공을 해준다. 이것을 안나오게 하고 싶다면 standalone-*.xml, domain.xml 파일에서 virtual-server 의 enable-welcome-root 값을 false 로 변경해주면 된다.

위와같이 고친후에 서버를 재시작하고 다시 접속을 하면 404 오류 페이지가 나온다.

jboss-cli 를 이용해서 다음과 같이 설정도 가능하다.

 

HTTP Header 에서 Server 값 변경하기

화면에는 잘 보이지 않지만, HTTP 프로토콜 보기에서 서버에서 응답한 헤더값을 보면 다음과 같이 나온다.

최대한 정보를 은닉하는 것이 보안상 권장하는 것으로 이것을 다른 값으로 바꿔 어떤 서버를 사용하는지 추론하지 못하도록 해야 한다.

역시, standalone-*.xml, domain.xml 혹은 host.xml 에서 다음과 같을 추가해준다.

jboss-cli 를 이용해서 다음과 같이 설정도 가능하다.

아니면 시작시에 -D 옵션으로 다음과 같이 주어도 적용된다.

 

HTTP Header 에서 X-Powered-By 값 변경하기

위 Jboss EAP 6 의 HTTP 응답 헤더를 보면 X-Powered-By 값이 보인다. 이 역시 서버 정보를 알려주는 것으로 보안상 안보이게 하는게 좋다.

역시, standalone-*.xml, domain.xml 혹은 host.xml 에서 다음과 같을 추가해준다.

jboss-cli 를 이용해서 다음과 같이 설정도 가능하다.

 

참고 사이트

JBoss EAP 6 Clustering

이 문서는 JBoss EAP 6 Clustering 에 대해서 다룬다. Clustering 은 고가용성과 고확장성을 보장하는 수단으로 이 둘의 개념은 대략 다음과 같다.

  • 고확장성: 클러스터에 손쉽게 컴퓨터 자원을 추가할 수 있어야 한다.
  • 고가용성: 내부 서버의 오류를 숨기는 투명한 페일오버를 사용해야 한다.

보통 고확장성은 고가용성을 제한하는 법인데,  JBoss EAP 6 는 이두가지 기능을 모두 충족한다.

JBoss EAP 6 는 이전의 JBoss 시스템과는 다르다. 여러가지 기능적인 컴포넌트들는 서브시스템(Sub System)이라고 불리운다. Clustering 기능도 JBoss EAP 6 의 서브시스템이다.

Clustering Subsystem.

고가용성을 구현하기 가장 손쉬운 방법은 클러스터내 시스템이 가지고 있는 데이터를 모두 공유하는 것이다. 이를 위해서 특정 노드에서 데이터가 생성되면 이 데이터를 다른 노드와 공유하기위한 작업인 복제(Replication) 를 하게 된다. 데이터 복제를 통해서 특정 노드의 장애가 발생하더라도 다른 노드를 통해서 똑같은 데이터를 계속해서 접근할 수 있게 된다.

JBoss EAP 6 에서 데이터 복제를 위해서 Infinispan 시스템의 분산캐쉬 기능을 이용해 구현한다. JEE 스펙에 따르면 각각의 데이터들은 서로 다른 레이어에 저장되는데 이를 위해서 JBoss EAP 6 는 각 클러스터 노드간의 복제를 위한 미리 설정된 4개의 캐쉬 컨테이너를 가지고 있다.

  • web – HTTP 세션 복제
  • sfsb – stateful 세션 빈 복제
  • hibernate – JPA/Hibernate 두번째 레벨 엔터티 캐쉬
  • cluster – 클러스터에서 일반적인 목적의 객체 복제

JGroup.

데이터복제를 위해서 JBoss EAP 6 는 Infinispan 을 사용한다. 복제한 데이터를 전송하는데에는 Infinispan 의 JGroup 를 이용한다. JGroup 은 분산 노드로부터 가상의 그룹을 생성하도록 해준다. JGroup 은 새로운 노드를 추가, 명시적으로 노드를 제거하고 자동적으로 오류가 있는 노드들을 찾아내서 제거하는 기능을 제공한다.

JGroup 내의 클러스터 노드 사이의 통신을 위해서 UDP, TCP 를 사용한다. 이 둘의 사용에는 환경적인 요소를 고려해 선택하면 된다. UDP 는 멀티캐스트를 발생시켜 동작하고 TCP 는 멀티캐스트를 지원하지 않는 환경에 사용하면된다. (AWS 가 UDP 멀티캐스트를 지원하지 않는다. 따라서 TCP 를 사용하면 된다.)

standalone-ha.xml

JBoss EAP 6 에서는 JBoss 운영 환경에 맞게 Configuration 파일을 작성해 뒀다. 이 파일들은 필요로하는 핵심 기능들을 서브시스템에 포함시켜 놓은 것이여서 내용을 작성할 줄 안다면 얼마든지 커스터마이징 할 수 있다.

standalone-ha.xml 은 Clustering 을 위한 JGroup 서브시스템을 포함한 설정이 들어 있다. statndalone.xml 설정파일에서 Clustering 내용을 추가한 것이라 보면 맞다. 기본적으로 UDP 멀티캐스트 환경일 지원한다면 Clustering 을 위한 별도의 추가 설정을 할 필요가 없다.

Node name

Clustering 설정을 위해서는  Cluster 내에 노드(Node)를 구분할 이름을 정해줘야 한다. 이것은 커맨드라인에 인자로 다음과 같이 주면 된다.

 

HTTP SESSION REPLICATION

가장 많이 활용하는 것이 HTTP 의 SESSION 복제 이다. 위에서 설명한 서버 설정을 다 했다고 하더라도 Web.xml 에 다음과 같은 태그를 추가해 주어야 동작한다.

아무리 서버 설정을 Clustering 이 되도록 했다고 하더라도 위 사항을 추가하지 않으면 동작하지 않는다. 정상적으로 Clustering 되었을때에 로그는 다음과 같이 나온다.

내용을 보면 Protocol 이 UDP 로 나오고 Cluster Member 들도 인식이 잘 된다.

UDP 를 사용한 Cluster 는 별 설정할 필요가 없다. 그냥 standalone-ha.xml 을 사용하면 잘 된다.

TCP 를 이용한 Clustering

TCP를 이용한 Cluster, 좀 더 정확하게는 TCPPING 을 이용한 Cluster 는 UDP 멀티캐스트를 이용하지 못하는 AWS 클라우드와 같은 환경에 적합하다. 다만 이것을 사용하기 위한 설정에 조금의 수고가 필요하다.

여기서 주의해야할 사항이 하나 있는데, 사용할 TCPPING Port 는 자동으로 할당된다. 만약 PORT-OFFSET 설정을 100 으로 했다면 7700 으로 자동 할당 됨을 유의 해야 한다.

로그는 다음과 같이 나온다.

 

JBOSS EAP 6 Standalone 환경 구성하기

JBOSS EAP 6 설치를 끝내고 나면 Standalone 이나 Domain 모드로 운영하기 위한 환경 구성을 해야 한다. JBOSS EAP 6 Standalone 환경 구성은 설치한 JBOSS 에서 Standalone 디렉토리를 복사해서 구성하게 된다.

JBOSS 를 설치는 JBOSS_HOME 을 설치하는 것이다. 이것 자체로 서버를 운영할수 있지만 이것을 GLOBAL 로 하고 각각의 운영위한 서버는 JBOSS_HOME 에 Standalone, Domain 디렉토리를 복사하고 Localize 해서 만들어진다. 이는 마치 Tomcat 의 Multi Instance 구성하기와 유사하다.

기본환경

먼저 기본적인 환경을 체크하고 넘어가자. 다음과 같다.

  • Linux: CentOS 6, 7
  • JAVA_HOME: /opt/jdk1.8.0_91
  • JBOSS_HOME: /opt/EAP-6.4.0

기본적으로 위와 같은 환경이 기본으로 갖추고 있어야 한다. 이를 기반으로 서비스를 위한 Local 서버를 구성할 수 있게 된다.

Command Line Parameter

JBOSS EAP 6 는 독자적인 서비스 노드를 구성하기위해서 Command Line Parameter 를 제공한다. 이를 이용하면 JBOSS EAP 6 에게 값을 전달할 수 있고 JBOSS EAP 6 행동을 제어할 수 있게 된다. 유용한 Command Line Parameter 는 다음과 같다.

Standalone

속성 이름사용법기본값
java.ext.dirsJDK 확장 디렉토리 경로null
jboss.home.dirJBOSS EAP 6 설치된 ROOT 디렉토리$JBOSS_HOME 환경변수로 standalone.sh 파일에 지정되 있음
jboss.server.base.dir서버 컨텐츠를 위한 기본 디렉토리jboss.home.dir/standalone
jboss.server.config.dir기본 설정 디렉토리jboss.server.base.dir/configuration
jboss.server.data.dirpersistent 데이터 파일 스토리지를 위해 사용되는 디렉토리jboss.server.base.dir/data
jboss.server.log.dirserver.log 파일을 가지는 디렉토리jboss.server.base.dir/log
jboss.server.temp.dir임시파일 스토리지를 위한 디렉토리jboss.server.base.dir/tmp
jboss.server.deploy.dir배포된 컨텐츠를 저장하하는데 사용되는 디렉토리jboss.server.base.dir/deployments

위 파라메터는 standanlone.sh 스크립트를 시작할때에 명령행 인자로 줄수 있다. 다시 바꿔 말하면 쉘 환경변수로 저장해 놓고 사용할 수 있다는 걸 의미한다.

이제 본격적으로 독자적인 서비스 노드를 구성해 보자.

독자적인 서비스 노드 구성

독자적인 서비스 노드를 구성하기 위해서 시스템 계정을 하나 만들고 JBOSS_BASE_DIR 로 쓰일 nodes 디렉토리를 생성한다.

그리고 JBOSS_HOME 디렉토리에 standalone 디렉토리를 /home/jboss/nodes/node1 으로 복사한다.

WAS 서비스를 위해서 JBOSS_HOME 을 이용하는게 아니라 node1 을 이용하게 하는게 목적이다. 모든 서비스는 node1 을 통해서 이루어진다. WAS 의 설정, 컨텐츠 배포, 또 다른 WAS 와 연동등도 모두 node1 을 통해서 이루어지게 된다. 결국에는 JBOSS_HOME 은 일종의 라이브러리와 같은 역활을 담당하게 된다.

그렇다면 node1 을 구동시키기 위한 스크립트가 필요하다. 그리고 이러한 스크립트는 앞에서 설명한 Command Line Parameter 를 이용해서 구동환경을 조성하게 된다.

구동 스크립트

구동스크립트를 만들때에는 다음과 같은 세가지 영역을 포함한다.

  • JBOSS 를 위한 변수
  • JVM  옵션 변수
  • 시작 스크립트

각각의 영역은 파일로 작성되어지고 시작스크립트에서 호출되어서 사용되어지게 될 것이다. 앞으로 작성하게될 파일들의 목록은 다음과 같다.

  • jboss-env.conf
  • jboss-env.sh
  • jboss.properties
  • jvm-env.conf
  • jboss-run.sh
  • jboss-cli.sh

한가지 덧붙이자면, 꼭 이렇게 파일들을 조각낼 필요는 없다. 조각난 파일들로 인해서 오히려 효율이 떨어지고 실수가능성이 높아지는 경우도 많다. 하나의 파일에서 모두 다 처리해도 상관이 없다.

jboss-env.conf

이 파일은 JBOSS EAP 6 를 위한 환경 변수들을 정의한다. 그 내용은 다음과 같다.

이 파일은 시스템 환경변수를 지정하는데 있다. 이러한 시스템 환경변수는 나머지 환경파일이나 실행스크립트에서 활용하게 된다.

내용을 간단하게 보면 JBOSS_HOME 과 JBOSS_NODE_BASE_DIR 를 정의해주고 있다. 그리고 JBOSS EAP 6에서 이용할 각종 포트와 주소들도 함께 정의해주고 있다.

jboss-env.sh

이 파일은 실제 JBOSS EAP 6 에 명령행 파라메터를 작성한다. 내용은 다음과 같다.

jboss-env.conf 파일에서 정의한 환경변수들을 사용하고 있다.

jvm-env.conf

이름에도 알수 있듯이 jvm 설정을 위한 내용을 담고 있다. 내용은 다음과 같다.

JVM 이 사용할 메모리양과 GC 종류를 정의해주고 있다.

jboss-run.sh

이 파일은 독자적인 서비스 노드인 node1 을 시작하고 중지시키기위한 스크립트이다. 위에서 설명한 모든 파일들을 Source 해 사용하고 JBOSS EAP 6 가 제공하는 레드햇 계열의 init 스크립트를 활용한다. JBOSS EAP 6 를 설치를 하고 나면 JBOSS_HOME/bin/init.d 디렉토리에 레드햇 계열 리눅스를 위한 서비스 시작, 중지 스크립트가 있다. jboss-run.sh 는 위에서 기술한 모든 환경변수 세팅 파일들을 읽어서 최종적으로  JBOSS EAP 6 의 init 스크립트를 실행시키게 된다. 내용은 다음과 같다.

맨 마지막이 바로 JBOSS EAP 6 에서 제공하는 init 스크립트를 호출하는 부분이다. $1 인자값은 start, stop 등으로 시작과 중지를 시킬수 있도록 했다.

jboss.properties

이 파일은 key=value 형태로 값을 지정하고 JBOSS EAP 6 실행시 값을 반영할 수 있게 해준다. 이는 명령행 인자 전달과 동일한 효과를 내지만 오로지 JBOS EAP 6 속성만을 지정해야 한다. 명령해 인자 파라메터는 정확하게 JBOSS EAP 6 에 전달하는것이 아니라 JVM 으로 전달해 JBOSS EAP 6 이 그것을 읽는 방식일 취한다.

어쨌든, jboss.properties 의 내용은 다음과 같다.

jboss-cli.sh

JBOSS EAP 6 로 넘어오면서 많은 변화가 있었지만 그중에 하나가 바로 명령행 콘솔에서 JBOSS EAP 6 을 제어할 수 있다는데 있다. 이것은 JBOSS_HOME/bin/jboss-cli.sh 파일을 통해서 실행되는데, 여기서 jboss-cli.sh 파일을 별도로 만드는 이유는 node1 에 맞추기 위해서다. 내용을 보면 이해가 될 것이다.

node1 을 위한 jboss-env.sh 를 소스하고 있다. 이렇게 함으로써 node1 을 위한 환경변수들을 사용해 node1 을 위한 명령행 콘솔로 진입하게 된다.

정리

지금까지 기술한 것을 정리하면 다음과 같다.

  • /opt/EAP-6.4.0/standalone 디렉토리를 /home/jboss/nodes/node1 으로 복사
  • node1 안에 위에서 기술한 파일들을 작성

시작, 중지

이제 모든 파일을 다 만들었다면, node1 서비스를 시작, 중지 시켜보자. 시작과 중지는 다음과 같이 한다. 참고로 이 스크립트의 실행은 반드시 슈퍼유저인 root 로 해야한다.

init 스크립트를 이용하기 때문에 자동으로 백그라운드로 전환되고 화면에는 아무것도 나오지 않는다. 구동시에 화면에 뿌려지는 내용은 로그로 기록된다.

중지는 다음과 같이 한다.

정상적으로 종료 되는 것을 볼 수 있으며 보다 자세한 내용은 로그를 보면 된다.