본문 바로가기

WAS/JBoss_WildFly

[JBoss_WildFly] 보안취약점 진단 & 성능 진단 튜닝 예시

보안취약점 진단

 
01. 불필요 디렉토리 nouse 처리
JBOSS_HOME 디렉토리 하위에 welcome-content 디렉토리는 필요없다.
welcome-content_nouse 와 같이 이름 변경하여 사용되지 못하도록 조치
 


 
02. HTTP Method 제한
일반적으로 HTTP Method 제한 설정은 WEB서버 측에 되어있을 것이므로,
해당 작업은 선택사항으로 봐도 될 것으로 판단된다.
 
WAS서버 측에서도 2차로 제한해주면 보안 자체는 강화되겠지만,
제한/허용할 HTTP Method 가 변경될 경우 WEB, WAS 양 측에 모두 작업해주어야 한다.
한 쪽에만 적용하여 서비스 에러가 발생하는 일이 없도록 꼼꼼하게 체크해야 할 필요가 있다.
 
적용 방법은 아래와 같다.

subsystem -> Web -> Server -> default-server 메뉴 이동

Listener -> ajp
Edit 클릭 -> Disallowed Methods 수정

Listener -> http
Edit 클릭 -> Disallowed Methods 수정

 

 


 
데이터소스 패스워드 암호화
(JBoss 7.4.7버전)
https://hyuunchul.tistory.com/281
(WildFly 26버전)
https://hyuunchul.tistory.com/271
 


 
그 외 설정들 확인하기
 


 

성능 개선 튜닝

 
01. jvm options
기본적으로 세팅해주는 Heap Memory, Metaspace옵션, NewSize옵션, GC옵션, HeapDump 옵션 등

#Heap Memory
-Xms2048m -Xmx2048m
-XX:MetaspaceSize=512m -XX:MaxMetaspaceSize=512m
-XX:NewSize=1024m -XX:MaxNewSize=1024m

#GC
-Xlog:gc:file=/log/wildfly/server1/gclog/gclog.txt:time:filecount=0
-XX:+DisableExplicitGC

#HeapDump
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/log/wildfly/server1/dump_files/heapdump.hprof

#urandom
-Djava.security.egd=file:///dev/./urandom

 
#. NewSize 옵션
Heap Memory의 young 영역 사이즈를 튜닝하는 옵션이다.
Heap Memory 사이즈에 비례하여 알맞게 설정한다.
Heap Memory Max 사이즈의 1/4 값으로 설정. 1/3 으로 나누어 지는 경우에는 1/3 값으로 설정.
 
#. urandom 옵션
여러 블로그에 urandom 옵션 버그 관련 글들이 있다.
각 블로그마다 workaround가 다르다.

-Djava.security.egd=file:/dev/urandom

-Djava.security.egd=file:/dev/./urandom

-Djava.security.egd=file:///dev/urandom

-Djava.security.egd=file:///dev/./urandom

 
PISA 가이드에 따르면 아래와 같이 작성하는게 올바른 방법이라 한다.

-Djava.security.egd=file:///dev/./urandom

 


 
02. Enable Statistics 활성화
APM 툴 등을 사용할 시에 데이터 수집을 위해 enable 되어 있어야 한다.

runtime -> server groups -> 그룹 -> 서버 인스턴스 메뉴로 이동

Monitor 항목들 하나씩 클릭하면서
Statistics Disabled 로 되어있으면 Enable Statistics 버튼 클릭해주기

 


 
03. 데이터소스
각 메뉴 별로 아래 옵션들을 수정한다.
validation 관련 상세 내용은 아래 글 참고.
https://hyuunchul.tistory.com/268
 

validation 설정

쿼리문으로 check
Oracle DB의 경우 "SELECT 1 FROM DUAL"

connection-checker-class 사용 (쿼리문보다 해당 옵션이 우선순위 가진다)
Orcle DB의 경우 "org.jboss.jca.adapters.jdbc.extensions.oracle.OracleValidConnectionChecker"

"Validate On Match" 와 "Background Validation" 중 하나만 사용 가능
PISA 가이드에서는 Background Validation 사용을 권장하고 있음

---------------------------------------

connection 메뉴
use-ccm="true"

---------------------------------------

pool 메뉴
Pool Prefill="true"
Pool Use Strict Min="true"

---------------------------------------

Timeouts 메뉴
Blocking Timeout Wait Millis = 3000MILLISECONDS

---------------------------------------

Statements 메뉴
Share Prepared Statements="true"
Prepared Statements Cache Size = 10

 

 


 
04. http, ajp 리스너가 사용할 전용 worker 생성 + 성능 튜닝
효율적인 서비스 처리를 위해
http 포트와 ajp 포트를 서비스 할 전용 worker를 각각 생성한다

01) 전용 worker 생성

subsystem -> IO -> Worker 메뉴로 이동

Add 클릭
ajp-worker 생성
http-worker 생성

ajp-worker와 http-worker 모두 Task Max Threads 옵션 알맞게 설정해주기 (Thread 갯수 최대값)

----------------------------------------------------------------------

02) http, ajp 리스너가 전용 worker를 사용하도록 지정

subsystem -> Web -> Server -> default-server 메뉴 이동

Listener -> ajp
Edit 클릭 -> 맨 하단의 Worker를 default 에서 ajp-worker로 변경

Listener -> http
Edit 클릭 -> 맨 하단의 Worker를 default 에서 http-worker로 변경

----------------------------------------------------------------------

03) http, ajp 리스너 성능 튜닝

동일 화면에서 

Max Parameters 옵션 값과
No Request Timeout 옵션 값을 각각 수정해준다.

max-parameters="10000" 
no-request-timeout="10000"

 

 

 

 

 


 
05. Cached Connection Manager 설정

subsystem -> JCA 메뉴
Cached Connection Manager 항목 중 Error 옵션을 true로 변경

 


 
06. StuckThreadMaxTime 시간 설정
StuckThreadMaxTime 설정을 위해 별도로 filter 옵션을 추가해야 한다.

01)Filter 추가

subsystem -> Web(undertow) -> Filters -> Expression Filter 메뉴로 이동

Add 클릭

name : stuck
Expression : blocking; stuck-thread-detector(600)

-------------------------------------------------------------

02)추가한 filter 사용하도록 설정
subsystem -> Web(undertow) -> default-server -> Hosts 메뉴로 이동

Add 클릭

Name 항목을 클릭하면 앞서 추가한 stuck filter가 있다
해당 filter를 선택 후 Add 버튼 클릭하여 완료

 

 

 


 
07. access 로그 활성화
pattern 관련 참고 글
https://kb.novaordis.com/index.php/Undertow_WildFly_Subsystem_Configuration_-_access-log#Pattern_Elements
 
Default 상태에서는 access log를 기록하지 않는다.
아래 절차대로 access log 설정을 추가한다.

subsystem -> Web(undertow) -> default-server -> Hosts 메뉴로 이동
Access Log 메뉴 클릭 후 Add 클릭

Directory 항목
${jboss.server.log.dir}/access

Pattern
%h %l %u %t %r %s %b %{i,Referer} %{i,User-Agent} %s %T

 

 

 


 
08-1. Thread min/max 값 튜닝 - task-max-threads 설정 (Thread Max 값)
subsystem -> IO 메뉴에서 설정한다.
각 worker 별로 알맞은 값을 설정해준다.
(Default 값은 CPU Core 개수 * 16)

 


 
08-2. Thread min/max 값 튜닝 - task-core-threads 설정 (Thread Min 값)
해당 설정은 cli 명령어 통해서만 가능하다.
관리 콘솔 상에 옵션 설정하는 부분이 아무리 찾아도 안 보임.
아래 스크립트를  실행한다

#java home
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-17.0.5.0.8-2.el8_6.x86_64

#---------------------------------------------------------------------------

#server_info
WILDFLY_HOME=/app/wildfly/wildfly_2612

IP_ADDRESS=마스터 호스트의 ip address
MANAGEMENT_PORT=마스터 호스트의 management port

#---------------------------------------------------------------------------

#command run
$WILDFLY_HOME/bin/jboss-cli.sh --connect --controller=$IP_ADDRESS:$MANAGEMENT_PORT --command="/profile=full/subsystem=io/worker=default:write-attribute(name=task-core-threads, value=10)"

 
아래와 같이 정상적으로 설정이 되었다면

 
관리콘솔 상에 Core Pool Size 값이 수정된 것을 확인할 수 있다.
서버 인스턴스 재기동 없이 바로 적용된다.

 


 
08-3. Thread min/max 값 튜닝 - EJB Thread Pool 설정
EJB를 사용할 경우에만 설정한다.
일반적인 경우라면 Runtime 메뉴에서 확인했을 시 동작하고 있지 않는 것을 확인할 수 있다.

 
설정 방법은 아래와 같다.

subsystem -> EJB 메뉴로 이동

Container 메뉴에 마우스 올려놓기 -> Thread Pool 메뉴 이동

Core Threads (min 값)
Max Threads (max 값)

 

 


 
09. Transaction 튜닝 - unique 한 node name 가지도록 설정
Node Identifier 부분을

${jboss.server.name} 으로 수정한다

 


 
10. Infinispan 튜닝 - 동일 세션의 다수 요청 병렬 처리
ha profile 사용할 경우에만 해당한다. (ha, full-ha)
https://s-core.co.kr/post_middleware/wildfly-session-cluster-%EC%9D%B4%EC%8A%88%EC%82%AC%ED%95%AD-%EB%B0%8F-%EC%A1%B0%EC%B9%98%EB%B0%A9%EB%B2%95/
 
Infinispan 서브시스템에 4개의 Cache Container가 있다.
이 중에서 web의 dist 항목을 수정한다.

 
Locking Isolation 항목은 READ_COMMITED 로 수정

 
Transaction Mode 항목은 NONE 으로 수정

 


 

4. session timeout 설정

어플리케이션 레벨에서 설정
	=> 소스 내의 WEB-INF/web.xml 파일에 옵션 추가

   <session-config>
      <session-timeout>30</session-timeout>
   </session-config>

--------------------------------------------------------------

jboss config 에서 설정
	=> JBoss 자체적으로도 session timeout 설정이 존재합니다
	=> default 값은 30분 입니다

subsystem -> web -> servlet container -> default -> default session timeout (기본값 30분)

 


 

5. keepalive 설정

jboss 자체적으로 keepalive 설정이 있는지
	=> subsystem -> io -> task keepalive

 


 

 - 요청이 처리될 때 까지 커넥션 유지하는 시간?
	=> Subsystem -> Transaction -> Default Timeout 옵션