[JAVA] JMX 인증 설정 정리
Spring Boot / 순수 Java 어플리케이션 운영 시 JMX 보안 설정 및 오류 해결 방법을 정리하고자 한다.
1. JMX 인증 설정
jmx.id=xxx, jmx.pw=yyy 와 같이 프로퍼티로 설정하는 것이 아님
JMX 인증은 application.properties 에 ID/PW 를 쓰는 게 아닌 연결 시 ID/PW 를 사용하는 것이며, JMX 인증은 JVM 레벨에서 설정하며 ID/PW는 반드시 파일로 관리해야 한다.
JMX 기본 설정 (Windows 기준)
com.sun.management.jmxremote=true
com.sun.management.jmxremote.port=1099
com.sun.management.jmxremote.rmi.port=1099
com.sun.management.jmxremote.authenticate=true
com.sun.management.jmxremote.ssl=false
com.sun.management.jmxremote.password.file=C:/app/jmx/jmxremote.password
com.sun.management.jmxremote.access.file=C:/app/jmx/jmxremote.access
경로의 경우 절대경로를 권장하나 상대경로로 사용은 가능하다 (./app/jmx/jmxremote.password)
jmxremote.password 파일
monitorRole monitor123
controlRole control123
- 앞: ID (Username)
- 뒤: 비밀번호 (Password)
계정 권한 설정
jmxremote.access
monitorRole readonly
controlRole readwrite
계정 권한의 경우 readonly, readwrite 가 존재하며 readonly를 사용하는 경우 조회만 가능 (내 프로그램의 경우 켜지지 않는 것으 readwrite 사용 필요하다 왜인지 추후 확인 필요)
| monitorRole | 조회만 가능 |
| controlRole | GC, HeapDump, 설정 변경 가능 |
위와 같이 설정한 다음 프로그램을 실행하면, 아래와 같은 오류 발생
java.lang.SecurityException: 비밀번호 파일 읽기 액세스는 제한되어야 합니다
원인은 JMX 비밀번호 파일 권한이 너무 열려있는 것. Linux의 chmod 600을 Windows 보안 권한으로 흉내내야한다. jmxremote.password 우크릭 -> 속성 -> 보안 탭 -> 고급 -> 상속 사용 안 함 -> 상속된 권한 제거 -> 계정 전체 삭제 후, administrators 혹은 Java 실행 계정 1개 추가하여 읽기 권한만 부여
jmxremote.access 파일도 동일하게 설정하여 파일 권한 설정해주어 오류 해결하였다.
두 번째 에러
java.lang.SecurityException: Access denied! Invalid access level
원인은 readonly 계정으로 write 작업을 시도하여 발생. 권한이 readwrite인 계정으로 접속하면 해결된다.
JMX ID/PW 적용 여부 확인 방법은
CMD -> jconsole 입력 시 아래와 같은 화면이 표시된다.

해당 RemoteProcess 선택 후 host에는 localhost:9999 와 같이 접속할 IP:PORT 입력, UserName/Password 입력 후 접속해보면 된다. 맞는 NAME/PW로 입력 시 연결이 된다면 성공이다.