Сервер Prometheus и TLS

Stepan Mikulov

Administrator
Команда форума
Prometheus теперь поддерживает TLS и базовую аутентификацию для HTTP эндпоинтов.


Скрейпинг таргетов через HTTPS вместо HTTP поддерживается уже давно. Метрики можно собирать с поддержкой HTTPS, аутентификации по клиентским сертификатам и базовой аутентификации.


В прошлом году Node Exporter стал первым официальным экспортером, который нативно предоставляет метрики по HTTPS. Все подробности в предыдущем посте. На этой неделе (прим. переводчика: статья вышла 6 января 2021 года) мы встречаем Prometheus 2.24.0. В последнее время Prometheus радует нас крутыми новшествами — это и TLS, и backfilling (обратное заполнение, тоже в версии 2.24) и даже переход на современный пользовательский интерфейс на React.


В этом посте мы расскажем о TLS и базовой аутентификации.


Здесь можно узнать больше о модели безопасности Prometheus и о том, как пожаловаться на уязвимости.


Если вы обнаружили в Prometheus, официальном экспортере или библиотеке какую-нибудь критическую уязвимость, не рассказывайте об этом публично, а сообщите нам, чтобы мы все исправили.


API для администрирования и управления жизненным циклом​


По умолчанию Prometheus предоставляет эндпоинты API только для запроса данных. При необходимости можно включить еще эндпоинты для управления жизненным циклом (перезагрузка конфигурации, выход) и для администрирования (удаление метрик, создание снапшотов).


При этом нужно будет защитить порт Prometheus, например, с помощью аутентификации.


Защита доступа к Prometheus​


Раньше между клиентами и сервером Prometheus для защиты обычно ставили обратный прокси:


5rvieda-boeotuvs5o7kgdbrfng.png



С такой конфигурацией можно не только управлять доступом и шифрованием, но и автоматизировать создание сертификатов, использовать троттлинг, дополнительные средства контроля, изменения имен (mangling) и так далее. За задачи балансировщиков нагрузки и обратных прокси Prometheus не отвечает, так что продолжайте использовать обратный прокси, если вам нужны эти расширенные функции.


Если ваш сценарий попроще или нужно защитить трафик между обратным прокси и Prometheus, теперь у вас есть встроенные средства для защиты входящего HTTP-трафика.


cvxybizxjfarcpatz9u9vyhf_qm.png



Как настроить TLS​


Посмотрим, как это работает на практике, на примере Prometheus на Linux.


Настройка рабочего каталога​


Мы будем работать в отдельном каталоге:


$ mkdir ~/prometheus_tls_example
$ cd ~/prometheus_tls_example

Создание TLS-сертификатов​


Для начала создадим самоподписанный TLS-сертификат.


$ cd ~/prometheus_tls_example
$ openssl req -new -newkey rsa:2048 -days 365 -nodes -x509 -keyout prometheus.key -out prometheus.crt -subj "/C=BE/ST=Antwerp/L=Brasschaat/O=Inuits/CN=localhost" -addext "subjectAltName = DNS:localhost"

Здесь localhost — это имя хоста для сервера Prometheus.


Создается два файла: prometheus.crt и prometheus.key.


Веб-конфигурация Prometheus​


Скачиваем Prometheus v2.24.0, распаковываем, переносим сертификаты, которые создали выше:


$ cd ~/prometheus_tls_example
$ wget https://github.com/prometheus/prome.../v2.24.0/prometheus-2.24.0.linux-amd64.tar.gz
$ tar xvf prometheus-2.24.0.linux-amd64.tar.gz
$ cp prometheus.crt prometheus.key prometheus-2.24.0.linux-amd64
$ cd prometheus-2.24.0.linux-amd64

Сейчас нужно создать новый файл конфигурации. Мы не будем настраивать TLS и аутентификацию в основном файле конфигурации prometheus.yml. Это позволит нам перечитывать отдельный файл конфигурации при каждом запросе, чтобы на лету подхватывать новые учетки и сертификаты.


Создадим файл web.yml с конфигурацией TLS:


tls_server_config:
cert_file: prometheus.crt
key_file: prometheus.key

Запускаем сервер Prometheus, указывая --web.config.file в командной строке:


$ ./prometheus --web.config.file=web.yml
[...]
enabled and it cannot be disabled on the fly." http2=true
level=info ts=2021-01-05T13:27:53.677Z caller=tls_config.go:223 component=web
msg="TLS is enabled." http2=true

Если мы видим это сообщение, сервер Prometheus запущен с поддержкой TLS.


Примечание: Все параметры TLS можно менять динамически, но если уж мы включили TLS, то без перезапуска Prometheus его не отключишь.


Подробности об этом дополнительном файле конфигурации смотрите в документации.


Проверка конфигурации TLS вручную​


В curl проверим конфигурацию TLS. В новом терминале запустим пару команд для теста:


$ cd ~/prometheus_tls_example
$ curl localhost:9090/metrics
Client sent an HTTP request to an HTTPS server.
$ curl --cacert prometheus.crt https://localhost:9090/metrics
[...]

Вместо --cacert prometheus.crt можно передать -k, чтобы пропустить проверку
сертификата в curl.


Конфигурация скрейпа​


Настроить TLS выборочно не получится — если он включен, он распространяется на все эндпоинты. Это значит, что собственные метрики Prometheus тоже будет извлекать через TLS, поэтому настроим использование HTTPS.


Изменим задание prometheus в файле prometheus.yml:


global:
scrape_interval: 15s
evaluation_interval: 15s
scrape_configs:
- job_name: 'prometheus'
scheme: https
tls_config:
ca_file: prometheus.crt
static_configs:
- targets: ['localhost:9090']

Для tls_config и scheme установим https. Полный список параметров клиента tls_config см. в конфигурации Prometheus.


Перечитаем конфигурацию Prometheus:


$ killall -HUP prometheus

Откроем https://localhost:9090/targets локально в браузере и увидим https://localhost:9090/metrics в списке таргетов.


Таргет имеет статус UP? Ура! Мы настроили TLS для сервера Prometheus и теперь собираем метрики с шифрованием.


Как настроить базовую аутентификацию​


Давайте пойдем еще дальше и затребуем имя пользователя и пароль. TLS здесь не обязателен, но крайне рекомендуется (настраивать его мы уже умеем).


Веб-конфигурация​


Для начала создадим хэш паролей (с помощью bcrypt). Для этого используем команду htpasswd (пакет apache2-utils или httpd-tools есть в дистрибутиве; если это не продакшен, можно найти генераторы bcrypt онлайн).


$ htpasswd -nBC 10 "" | tr -d ':\n'
New password:
Re-type new password:
$2y$10$EYxs8IOG46m9CtpB/XlPxO1ei7E4BjAen0SUv6di7mD4keR/8JO6m

Для примера возьмем пароль inuitsdemo.


Добавим пользователя в файл веб-конфигурации Prometheus web.yml:


tls_server_config:
cert_file: prometheus.crt
key_file: prometheus.key
basic_auth_users:
prometheus: $2y$10$EYxs8IOG46m9CtpB/XlPxO1ei7E4BjAen0SUv6di7mD4keR/8JO6m

Примечание: В этом файле prometheus — это имя пользователя.


Если Prometheus еще запущен, введите пароль для доступа к веб-интерфейсу по адресу https://127.0.0.1:9090, иначе на странице targets для таргета будет отображаться ошибка 401 Unauthorized.


mdtyd7w_0w07izsbpahwhqvozvq.png



Конфигурация Prometheus​


Внесём изменения в prometheus.yml, чтобы скрейпинг шёл с использованием логина и пароля.


global:
scrape_interval: 15s
evaluation_interval: 15s
scrape_configs:
- job_name: 'prometheus'
scheme: https
basic_auth:
username: prometheus
password: inuitsdemo
tls_config:
ca_file: prometheus.crt
static_configs:
- targets: ['localhost:9090']

Перезагрузим конфигурацию Prometheus сигналом SIGHUP:


$ killall -HUP prometheus

Если все работает, Prometheus снова откроет страницу targets.


nl-yamb7w_1wjssgslum1gqps88.png



Promtool​


У Prometheus есть свой инструмент командной строки — promtool, которым теперь можно проверять и файлы веб-конфигурации:


$ ./promtool check web-config web.yml
web.yml SUCCESS

Используйте любой инструмент автоматизации для удобного обновления файлов web.yml.


Grafana​


Grafana поддерживает все необходимые функции для подключения к серверу Prometheus. Можно указать CA (наш prometheus.crt) или пропустить проверку сертификатов.


5obmrpm5xbjtlp0qhhb-nrb_xck.png



Заключение​


Это только общий обзор. В продакшене нужно будет использовать подходящий CA и продумать еще много деталей. Можно настроить клиентские сертификаты, но из соображений безопасности эта функция считается экспериментальной. Со временем поддерживаемая версия TLS может меняться, а с ней и поведение функций.


В следующие несколько месяцев мы планируем развернуть эту поддержку HTTPS по всем официальным экспортерам Prometheus и другим проектам, например, Alertmanager, Pushgateway.


Мы за безопасный мониторинг.

Источник статьи: https://habr.com/ru/company/southbridge/blog/537504/
 
Сверху