모니터링

Spring Actuator 안전하게 사용하기

Junuuu 2024. 1. 30. 00:01
728x90

 

개요

Spring Actuator를 더 안전하게 사용하기 위한 방법들을 알아보고자 합니다.

 

 

Spring Actuator란 무엇인가?

# build.gradle 예시
dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-actuator'
}

간단하게 gradle 의존성만 추가해 주면 Spring Application의 모니터링 및 관리 측면에 지원을 주는 라이브러리입니다.

JMX, HTTP을 통하여 앱을 모니터링하고, 메트릭을 수집하고, 트래픽이나 데이터베이스의 상태를 파악하는 것이 해당합니다.

 

JMX란?

Java Management Extension의 약어로 Java Application을 모니터링하고 관리하기 위해 사용되는 기술입니다.

Mbean이라는 도구를 통하여 데이터를 수집하고 JMX는 Mbean과 상호 작용할 수 있는 제어판을 제공합니다.

 

 

 

양날의 검 - 보안 이슈

편리한 만큼 보안적으로 주의해야 할 부분들이 있습니다.

  • 환경변수로 중요한 정보를 볼 수 있다.
  • 중요 정보가 메모리에 올라가 있는 경우 볼 수 있다.
  • Application을 강제로 종료시킬 수 있다.

 

 

환경변수로 중요한 정보를 볼 수 있다

비밀번호, API KEY, Token 등 유출되면 위험한 정보들이 유출될 수 있습니다.

그뿐만 아니라 url 호출을 통하여 Application을 강제로 종료시켜 버릴 수도 있습니다.

해당 문제는 Spring Actuator의 env endpoint에서 일어날 수 있는 문제입니다.

 

첫 번째로 매우 매우 중요하다고 가정되는 환경변수를 application.yml에 설정하였습니다.

very:
  important:
    password: top-secret

 

 

두 번째로는 application.yml에 env endpoint에 대한 설정을 추가합니다.

application.yml

web의 노출에 대해 모든 endpoint들을 열어두고 env endpoint에 대하여 show-values 옵션을 항상으로 주어보았습니다.

기본값으로 사용 시에는 value에 *으로 마스킹 처리가 되어 보안성이 존재합니다.

(Spring Docs에서 마스킹 처리는 Sanitize 살균하다고 부르는 것 같습니다.)

이런 상황은 개발자가 env value가 노출될 수 있게 의도적으로 열어주었기 때문에 가능합니다.

 

이제 localhost:8080/actuator/env 엔드포인트에 접근합니다.

매우 중요한 비밀번호가 노출되었다.

 

이런 흐름으로 환경변수에 중요한 정보들이 노출될 수 있습니다.

 

 

HeapDump로 기밀정보들이 노출될 수 있다

Spring Actuator는 heapdump라는 endpoint를 제공함으로써 현재 Application의 메모리 값을 통해 중요 정보가 유출될 수 있습니다.

 

ChatGPT에게 HeapDump의 보안적 위험요소에 대해 질문해 보았습니다.

 

 

 

https://velog.io/@mohai2618/SpringBoot-Actuator-%EC%95%88%EC%A0%84%ED%95%98%EA%B2%8C-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0

실제 application.properties에 작성되어 사용되고 있는 Database의 정보가 누출되거나, 코드 취약점을 통해 공격이 들어올 수 있습니다.

 

 

Application을 강제로 종료할 수 있다

shtudown endpoint는 위험하기 때문에 기본적으로 비활성화되어 있지만 임의로 enable으로 활성화해 주고 expose로 노출하는 경우에 POST localhost:8080/actuator/shutdown 을 호출하면 Application이 종료될 수 있습니다.

 

 

Spring Actuator 안전하게 사용하기

# Actuator 보안 설정 샘플

# 1. Endpoint all disable
management.endpoints.enabled-by-default = false

# 2. Enable specific endpoints
management.endpoint.info.enabled = true
management.endpoint.health.enabled = true

# 3. Exclude all endpoint for JMX and Expose specific endpoints
management.endpoints.jmx.exposure.exclude = *
management.endpoints.web.exposure.include = info, health

# 4. Use other port for Actuator
management.server.port = [포트번호]

# 5. Change Actuator Default path
management.endpoints.web.base-path = [/변경된 경로]

 

모든 endpoint는 disable 상태에서 필요한 것만 include 해서 사용하면 좋습니다.

management.endpoints.enabled-by-default 속성을 false로 만듦으로써 모든 endpoint에 대하여 disable 상태를 유지하며 필요한 endpoint가 있다면management.endpoint.[endpoint name].enable 속성을 true로 설정하면 됩니다.

 

enable 해주더라도 Actuator에서 expose(노출) 시키지 않으면 이용할 수 없습니다.

JMX와 HTTP 방식은 각각 기본적으로 expose(노출) 되는 endpoint들이 다르기 주의해야 합니다.

 

HTTP에 비해 JMX가 기본적으로 노출되는 endpoint가 많기 때문에 JMX를 사용하지 않으면  management.jmx.exposure.exclude: "*"  설정을 추가할 수 있습니다.

 

tomcat은 기본적으로 8080 포트를 노출해서 사용합니다.

따라서 공격자들이 8080에 actuator가 동작하는지 스캐닝을 수행할 수 있습니다.

서비스의 운영포트와 Actuator를 다른 포트로 운영하는 경우에 공격자가 actuator를 조금 더 찾기 힘들어집니다.

management.server.port 속성을 활용할 수 있습니다.

추가적으로 기본 base-path도 변경해 주어 보안성을 향상할 수 있습니다.

 

또한 Actuator에 Spring Security나 Filter 등을 활용하여 인증된 권한이 있는 사용자만 접근이 가능하도록 구성할 수도 있습니다.

하지만 이 부분은 k8s 환경등에서 actuator로 health check 하는 경우에 401이 떨어지면서 pod가 잘 구동되지 않을 가능성이 있습니다.

 

 

 

 

참고자료

https://velog.io/@mohai2618/SpringBoot-Actuator-%EC%95%88%EC%A0%84%ED%95%98%EA%B2%8C-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0

https://techblog.woowahan.com/9232/

https://docs.spring.io/spring-boot/docs/current/actuator-api/htmlsingle/#heapdump

https://docs.spring.io/spring-boot/docs/current/actuator-api/htmlsingle/#env