[Перевод] Сервер Prometheus и TLS

dflskt2r_70txcer_3gcbvdfb4c.png

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/prometheus/releases/download/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.

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

От редакции: Подробнее о работе с Prometheus можно узнать на курсе Слёрма «Мониторинг и логирование инфраструктуры в Kubernetes». Сейчас курс находится в разработке и его можно купить по цене предзаказа.

Полезные ссылки

Prometheus 2.24.0
Модель безопасности Prometheus
Документация по конфигурации TLS-сервера (для Prometheus)
Документация по конфигурации TLS-клиента (для сервера Prometheus)

© Habrahabr.ru