Руководство по повышению безопасности
Конечные точки Spring Boot Actuator предоставляют конфиденциальную информацию о нашем приложении, такую как Bean-компоненты, измерения и т. д. Поэтому крайне важно добавить безопасность для ограничения доступа.
Хотя Actuator предоставляет множество конечных точек из коробки, иногда может быть полезно настроить свою собственную. Например, если мы хотим получить информацию, относящуюся к нашему приложению.
Точно так же мы можем захотеть добавить метрики Prometheus для мониторинга функций, не включенных в решения по умолчанию. Например, подсчет количества посещений URL-адреса, одновременных запросов и т. д.
К концу этого урока вы будете знать, как:
- Защитите конечные точки Spring Boot с помощью Spring Security.
- Создайте пользовательские конечные точки Spring Boot Actuator.
- Регистрируйте метрики и просматривайте их в Prometheus и Grafana.
Это руководство связано с моей предыдущей статьей о мониторинге приложения Spring Boot. Если вы хотите узнать, как настроить Prometheus и Grafana для мониторинга вашего приложения, ознакомьтесь с ним. Но не волнуйтесь, вы все еще можете следить за этой статьей, потому что сейчас мы сосредоточимся на других темах.
Давайте начнем!
Добавьте Spring Security в проект
Я повторно использую исходный код предыдущей демонстрации и улучшаю его.
Чтобы включить безопасность, нам нужно добавить модуль spring-boot-starter-security
в наши зависимости:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency>
В первом проекте мы включили метрику здоровья, доступную на http://localhost:8080/actuator/health
, и показали подробности всем:
Мы можем ограничить доступ к подробной информации, изменив эту строку в нашем файле application.yml
:
management.endpoint.health.show-details=WHEN_AUTHORIZED
Если пользователь не авторизован, он увидит только следующие данные:
Добавить учетные данные безопасности
Допустим, мы хотим разрешить доступ только для администраторов. Добавьте эти строки в application.yml
, чтобы определить пользователя:
security: user: name: user password: password roles: admin
Обратите внимание, что без этих строк Spring Boot автоматически сгенерирует пароль и распечатает его в консоли приложения при запуске. Роль не является обязательной.
Протестируйте конфигурацию безопасности
- Нажмите на конечную точку
http://localhost:8080/actuator/health
. - Вы должны увидеть всплывающее окно с запросом учетных данных. Введите данные из файла YAML. Вы должны снова увидеть информацию о состоянии здоровья.
- Измените роль в
application.yml
на любую другую, кроме admin. - Перезапустите приложение и снова нажмите на вышеуказанный URL-адрес.
- Вы должны видеть только основную информацию без деталей.
Добавить базовую аутентификацию
Мы можем настроить базовую аутентификацию с помощью Spring Boot. Для этого создайте такой класс конфигурации:
Мы разрешили конечную точку метрик только пользователям-администраторам.
Если мы вызовем URL-адрес и попытаемся войти в систему с другой ролью, мы увидим сообщение об ошибке:
There was an unexpected error (type=Forbidden, status=403).
Добавить пользовательскую конечную точку актуатора
Чтобы добавить пользовательскую конечную точку, просто добавьте аннотацию @Endpoint
к классу. Вот простой пример:
Spring Boot поддерживает операции чтения, записи и удаления, соответствующие запросам HTTP GET
, POST
и DELETE
.
В этом примере мы используем аннотацию @ReadOperation
.
Давайте включим конечную точку в application.yml
:
include: [ "health","prometheus", "metrics", "customEndpoint" ]
Перезапустите приложение и попробуйте получить доступ к новой конечной точке, нажав http://localhost:8080/actuator/customEndpoint
.
Не удивляйтесь, если увидите эту ошибку:
There was an unexpected error (type=Bad Request, status=400).
Причина в том, что мы не добавили параметр запроса в URL. Правильный запрос должен быть http://localhost:8080/actuator/customEndpoint?id=1
.
Результат вернет фрукт kiwi
, потому что он соответствует номеру 1
в нашем fruitsMap
.
Защитите конечную точку
Теперь давайте защитим пользовательскую конечную точку. Для этого нам просто нужно добавить его в наш класс SecurityConfiguration.java
:
Вот и все! Добавлять и защищать пользовательские конечные точки в Spring Boot очень просто!
Добавьте метрики Prometheus
Обзор типов метрик
Во-первых, давайте взглянем на поддерживаемые метрики:
Counter
— используется для измерения событий, которые увеличиваются. Например, количество посещений URL.Gauges
— используется для измерения значений, которые могут увеличиваться и уменьшаться. Например, использование памяти, температура и т. д.Histogram
— используется для измерения продолжительности запроса и размера ответа. Данные разбиты на настраиваемые сегменты. Гистограммы отображают количество наблюдений с сегментированием и расчет квантилей на стороне сервера с использованием функцииhistogram_quantile()
.Summary
— используется для отслеживания распределения значений в процентилях. Это похоже на метрику гистограммы. Он использует функцию φ-квантиля на стороне клиента и напрямую предоставляет расчеты.
Создать метрику счетчика
Давайте создадим пользовательскую метрику Counter
, чтобы увидеть, сколько раз кто-то посещал URL-адрес из нашего приложения.
Я буду использовать customEndpoint
для простоты. Вот код:
Вот обзор кода:
- Мы добавили переменную
Counter
. - Мы увеличиваем счетчик, когда кто-то посещает
customEndpoint
. - Мы зарегистрировали метрику в файле
MeterRegistry
.
Протестируйте и соскребите метрику счетчика
- Посетите
http://localhost:8080/actuator/customEndpoint?id=1
два раза. - Откройте Prometheus и найдите новую метрику.
- Вы должны увидеть аналогичный результат:
Конечно, вы также можете визуализировать новую метрику в Grafana. Это должно выглядеть так:
Если вам интересно, как подключить Grafana к Prometheus, ознакомьтесь с инструкциями в моем предыдущем руководстве.
Вы можете использовать аналогичную логику для регистрации других показателей. Тип зависит от вашего варианта использования. Ознакомьтесь с официальной документацией для получения дополнительных примеров и вариантов использования.
Заключение
В этом руководстве вы узнали, как создавать пользовательские конечные точки Spring Boot Actuator и защищать их с помощью Spring Security. Теперь вы также знаете, как добавлять собственные метрики для Prometheus и просматривать их с помощью PromQL или Grafana.
Вы можете найти полный исходный код для этой демонстрации в разделе «Ссылки» ниже.
Если вы хотите изучить первую часть этого руководства, вы можете найти ее здесь:
«Как контролировать приложение Spring Boot с помощью Prometheus и Grafana
Пошаговое руководство по настройке мониторинга для лучшего программирования приложения Spring Boot. паб"
Спасибо за чтение и удачного кодирования!
Рекомендации
- Исходный код этого руководства Репозиторий GitHub
- Предыдущее руководство Репозиторий GitHub
- https://prometheus.io/docs/practices/histograms/