본문으로 건너뛰기
개발 머꼬
개발 노트Spring
hohyeon.dev24

Spring Boot Actuator를 켰다가 환경변수가 그대로 노출된 사고

  • #Engineering Note
  • #Security
  • #Spring

문제 발생

모니터링을 위해 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: 내부 구조 정보 — 직접적인 정보 유출은 아니지만 공격 정찰에 활용될 수 있음

해결 방안

  1. 필요한 엔드포인트만 명시적으로 엽니다. *로 전부 열지 않습니다.
management:
  endpoints:
    web:
      exposure:
        include: health, info, prometheus  # 실제로 필요한 것만
  1. Actuator 엔드포인트도 Spring Security로 인증/인가를 적용합니다 — 특히 /env, /heapdump, /shutdown 같은 민감한 엔드포인트는 내부 네트워크나 별도 관리자 인증 뒤에만 노출되도록 합니다.
http.authorizeHttpRequests(auth -> auth
    .requestMatchers("/actuator/health").permitAll()
    .requestMatchers("/actuator/**").hasRole("ADMIN")
);
  1. management.endpoint.env.show-values 같은 세부 옵션으로 민감한 값을 마스킹하는 설정도 있습니다 — Spring Boot는 기본적으로 password, secret, key 같은 이름 패턴을 감지해 값을 ******로 마스킹하는 기능(sanitization)을 제공하지만, 커스텀 설정 키 이름이 이 패턴에 안 걸리면 마스킹되지 않을 수 있으므로 실제 응답을 직접 확인해봐야 합니다.
  2. Actuator를 별도 포트(management.server.port)로 분리해, 애플리케이션 포트와 다른 네트워크 경로로만 접근 가능하게 하는 것도 흔히 쓰이는 방어 계층입니다.
  3. 배포 전에 실제로 /actuator/env 같은 엔드포인트에 접근해 어떤 정보가 보이는지 직접 확인하는 체크리스트를 두는 것이 안전합니다.

공식 문서

마지막 수정

좋아요북마크

댓글0

아직 댓글이 없어요. 첫 의견을 편하게 남겨 보세요.