본문 바로가기
Spring

[Spring Boot] 액추에이터(Actuator) 문제 및 해결 방법

by 개미가되고싶은사람 2024. 10. 16.

Spring Actuator란

Spring Actuator는 org.springframework.boot:spring-boot-starter-actuator 패키지를 Dependency에 추가만 해주면 바로 사용할 수 있는 기능으로, 애플리케이션 모니터링 및 관리 측면에서 도움을 줄 수 있습니다.

 

Actuator 보안 이슈

애플리케이션 모니터링 및 관리 측면에서 개발자에게 편의를 주는 기능이나, 잘못 사용할 경우 비밀번호, API KEY, Token 등 Credential들이나 내부 서비스 도메인, IP 주소와 같은 중요 정보들이 유출될 수 있습니다.

 

 

1. 환경변수로 중요 정보를 저장해 둔 경우

개발자들은 보안 문제로 API KEY, DB Password 등 중요한 정보들을 하드 코딩을 하지 않고 application.yml파일도 Github에 노출되지 않게 설정을 따로합니다.

 

이때, Spring Actuator의 env, info endpoint가 필요하여 활성화시키고 노출까지 시켜두었다면, 서비스에서 사용 중인 환경 변수를 볼 수 있게 되기 때문에, 의도치 않게 설정해둔 중요 정보가 유출될 수 있습니다.

 

2. 중요 정보가 메모리에 올라가 있는 경우

서비스 운영 중 사용한 중요 정보가 아직 메모리에 남아있는 경우에도 문제가 될 수 있습니다. Spring Actuator는 heapdump라는 endpoint를 제공함으로써 현재 서비스가 점유 중인 heap메모리를 덤프 하여 그 데이터를 제공해 주는 기능이 있어, 덤프 된 메모리 값을 통해 중요 정보가 유출될 위험이 있습니다.

 

예를 들어, 애플리케이션에서 사용자가 로그인할 때, 사용자의 ID와 비밀번호를 메모리에 저장한다고 가정해 보겠습니다. 사용자가 로그인한 후, 애플리케이션은 이 정보를 사용하여 세션을 관리합니다. 만약 heapdump 엔드포인트가 활성화되어 있고, 공격자가 이 엔드포인트에 접근할 수 있다면, 메모리 덤프 파일에서 사용자의 비밀번호가 노출될 수 있습니다. 이 경우, 공격자는 해당 비밀번호를 사용하여 다른 계정에 접근하거나, 사용자의 개인정보를 탈취할 수 있습니다.

 

3. Shutdown endpoint를 사용한 경우

Shutdown endpoint는 기본적으로 사용하지 않는 것이 좋습니다. 만약 이 엔드포인트를 사용해야 하는 상황이 생긴다면, 몇 가지 주의할 점이 있습니다.

Shutdown endpoint가 탈취될 경우, 공격자는 서버를 임의로 중지시킬 수 있습니다. 이로 인해 서비스의 가용성이 크게 저하될 수 있으며, 사용자에게 불편을 초래할 수 있습니다.

 

Spring Actuator 안전하게 사용하는 방법

필요한 엔드포인트만 활성화

기본적으로 Actuator는 shutdown endpoint를 제외한 나머지 엔드포인트가 활성화되어 있습니다. 그러나 이러한 기본 설정은 잠재적인 위험 요소가 될 수 있으므로, 필요에 따라 별도로 설정을 조정하는 것이 좋습니다.

특히, 사용하지 않는 엔드포인트는 비활성화하여 보안을 강화하고, 서비스의 안정성을 높이는 것이 중요합니다. 이를 통해 불필요한 공격 경로를(엔드포인트) 줄일 수 있습니다.

 

shutdown endpoint는 활성화 ❌❌

shutdown endpoint는 말 그대로 웹 애플리케이션을 shutdown 시킬 수 있는 기능을 제공하기에, 서비스 가용성을 침해할 우려가 있음을 위에서 예시로 설명했었습니다. shutdown endpoint는 기본적으로 비활성화되며, 노출 되지 않기 때문에 진짜 웬만하면 사용하면 안됩니다.

 

JMX형태로 Actuator 사용이 필요하지 않을 경우, 반드시 disable한다.

JMX는 기본적으로 노출 되어있는 endpoint가 많기 때문에, 사용하지 않음에도 활성화 시켜두면 잠재적 위험이 될 수 있습니다.


이에 JMX형태로 Actuator 사용을 하지 않는 경우 
management.endpoints.jmx.exposure.exclude = false로 속성을 추가함으로써, 모든 endpoint가 JMX로 사용 불가하게 설정해 주어야 합니다.

 

Actuator는 다른 포트를 사용

Actuator는 다양한 기능을 제공하는 만큼, 특정 상황에서는 사용할 수 있습니다. 공격자들은 웹 사이트를 공격할 때 Actuator 관련 페이지가 존재하는지를 스캐닝 하는 경우가 굉장히 빈번합니다.

이때 서비스를 운영하는 포트와 다른 포트로 Actuator를 사용할 경우, 공격자들의 스캔으로부터 1차적으로 보호받을 수 있다는 장점이 있습니다. 이에 management.server.port  속성을 통해 서비스를 운영하는 포트와 다른 포트로 설정할 수 있습니다.

 

Actuator Default 경로를 사용하지 않고, 경로를 변경하여 사용

포트 관련 항목에서 언급했듯이, Actuator가 다양한 기능을 가진 만큼, 공격자들은 웹 사이트를 공격할 때 Actuator 관련 페이지가 존재하는지를 스캐닝 하는 경우가 많은데, 이때 주로 알려진 URI형태의 스캐닝을 많이 수행하게 됩니다.

그렇기에 Actuator 서비스에서 기본 경로(/actuator/[endpoint]) 대신 다른 경로를 사용함으로써 외부 공격자의 스캐닝으로부터 보호받을 수 있기 때문에 경로 변경을 추천하고자 합니다.
management.endpoints.web.base-path 속성을 통해 설정이 가능하며, 유추하기 어려운 문자열의 경로로 설정함으로써 보안성을 향상시킬 수 있습니다.

 

Actuator에 접근할 때에는, 인증되었으며 권한이 있는 사용자만이 접근가능하도록 제어

Actuator는 인증된 관리자만 접근할 수 있도록 제어하는 것이 중요합니다. 이를 위해 세션이나 인증 토큰을 사용하여 인증 여부와 접근 권한을 확인한 후, 적절한 검증 과정을 거쳐 제어를 해야 합니다.

하지만 이러한 인증 절차가 필요하기 때문에, Actuator를 사용할 때는 health check와 같은 용도로는 부적합할 수 있습니다. 따라서 환경과 상황에 맞게 접근 제어 방식을 신중하게 검토하는 것이 필요합니다.

 

 

지금까지 소개드린 보안대책들이 모두 반영된 application.properties 는 아래와 같습니다.

# Actuator 보안 설정 샘플

# 1. 엔드포인트 모두 비활성화
management.endpoints.enabled-by-default = false

# 2. 필요한 엔드포인트만 활성화
management.endpoint.info.enabled = true
management.endpoint.health.enabled = true

# 3. Actuator는 다른 포트를 사용
management.server.port = [포트번호]

# 4. Actuator 기본 경로 변경
management.endpoints.web.base-path = [/변경된 경로]

 

 

참고

[1] - 스프링 부트 핵심 원리와 활용(김영한)