📚 Теория: Actuator в проде (раскрыть)
Почему это опасно?
/actuator/health, /info, /metrics выдают информацию о сервисах, версиях, базах данных. В проде это упрощает разведку и атаки.
⚠️ Утечки сервисов, очередей, конфигов.
Лучшие практики
Экспонируй только нужные эндпоинты, требуй авторизацию, маскируй детали, разводи профили dev/prod. Используй reverse-proxy с ACL.
🔐 `management.endpoints.web.exposure.include=health` + `show-details=never`.
Атакующий вызывает /actuator/health и получает список сервисов.
Изучает статусы, порты, имена сервисов, что облегчает дальнейшую атаку.
Использует знания для подбора эндпоинтов, brute force в очередях, SSRF и т.д.
Как надо: ограничивай экспозицию, требуй токены/Basic Auth, включай `show-details=never` в проде, добавляй smoke-тесты, проверяющие недоступность без авторизации.
Контекст
DevOps хотели мониторинг без логина и временно отключили защиту, чтобы «быстрее интегрировать Prometheus». Забыли вернуть настройки — прод открывает Actuator всем.
- Проверь, как
WebSecurityCustomizerобрабатывает/actuator/**. - Предложи разделять конфиг по профилям и включать авторизацию.
- Подумай о тестах: `MockMvc`/`curl --fail` должны получать 401/403 без токена.
Сниппет
Code Review
Референс-исправление
Actuator должен требовать авторизацию и показывать минимум деталей. Используй профили и whitelisting.
Флаг ревью: FLAG{java-actuator-health}
@Bean
SecurityFilterChain actuatorFilter(HttpSecurity http) throws Exception {
http.securityMatcher("/actuator/**")
.authorizeHttpRequests(req -> req.anyRequest().hasRole("ACTUATOR"))
.httpBasic(Customizer.withDefaults());
return http.build();
}
Добавь тесты, что без токена ответ 401, а детали health скрыты. Для prod профиля выстави `show-details=never`.
Проверка флага
После ревью зафиксируй флаг, чтобы дашборд засчитал лабораторию.