Spring Boot Actuator를 켰다가 환경변수가 그대로 노출된 사고
문제 발생
모니터링을 위해 Spring Boot Actuator를 추가했는데, 외부에서 /actuator/env에 접근해 DB 비밀번호를 포함한 환경변수 값이 그대로 노출된 것을 뒤늦게 발견했습니다.
원인 분석
Spring Boot Actuator는 애플리케이션의 상태를 확인/관리할 수 있는 여러 엔드포인트를 제공합니다. Spring Boot 2.x부터는 기본적으로 /health와 /info만 웹에 노출되도록 보수적으로 바뀌었지만, 편의를 위해 management.endpoints.web.exposure.include=*처럼 모든 엔드포인트를 열어버리는 설정을 무심코 추가하는 경우가 흔합니다.
*로 전부 열면 다음과 같은 민감한 엔드포인트까지 인증 없이 노출될 수 있습니다.
/actuator/env: 환경변수와 설정 값(비밀번호, API 키 포함 가능)/actuator/heapdump: 힙 덤프 — 메모리에 있는 모든 객체(세션, 토큰 등)를 그대로 덤프/actuator/shutdown: 애플리케이션을 원격으로 종료(기본은 비활성화지만 활성화하면 위험)/actuator/mappings,/actuator/beans: 내부 구조 정보 — 직접적인 정보 유출은 아니지만 공격 정찰에 활용될 수 있음
해결 방안
- 필요한 엔드포인트만 명시적으로 엽니다.
*로 전부 열지 않습니다.
management:
endpoints:
web:
exposure:
include: health, info, prometheus # 실제로 필요한 것만- Actuator 엔드포인트도 Spring Security로 인증/인가를 적용합니다 — 특히
/env,/heapdump,/shutdown같은 민감한 엔드포인트는 내부 네트워크나 별도 관리자 인증 뒤에만 노출되도록 합니다.
http.authorizeHttpRequests(auth -> auth
.requestMatchers("/actuator/health").permitAll()
.requestMatchers("/actuator/**").hasRole("ADMIN")
);management.endpoint.env.show-values같은 세부 옵션으로 민감한 값을 마스킹하는 설정도 있습니다 — Spring Boot는 기본적으로password,secret,key같은 이름 패턴을 감지해 값을******로 마스킹하는 기능(sanitization)을 제공하지만, 커스텀 설정 키 이름이 이 패턴에 안 걸리면 마스킹되지 않을 수 있으므로 실제 응답을 직접 확인해봐야 합니다.- Actuator를 별도 포트(
management.server.port)로 분리해, 애플리케이션 포트와 다른 네트워크 경로로만 접근 가능하게 하는 것도 흔히 쓰이는 방어 계층입니다. - 배포 전에 실제로
/actuator/env같은 엔드포인트에 접근해 어떤 정보가 보이는지 직접 확인하는 체크리스트를 두는 것이 안전합니다.
댓글0
댓글을 남기려면 로그인이 필요해요. 로그인
아직 댓글이 없어요. 첫 의견을 편하게 남겨 보세요.