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 для защиты обычно ставили обратный прокси:
С такой конфигурацией можно не только управлять доступом и шифрованием, но и автоматизировать создание сертификатов, использовать троттлинг, дополнительные средства контроля, изменения имен (mangling) и так далее. За задачи балансировщиков нагрузки и обратных прокси Prometheus не отвечает, так что продолжайте использовать обратный прокси, если вам нужны эти расширенные функции.
Если ваш сценарий попроще или нужно защитить трафик между обратным прокси и Prometheus, теперь у вас есть встроенные средства для защиты входящего HTTP-трафика.
Как настроить 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.
Конфигурация 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.
Promtool
У Prometheus есть свой инструмент командной строки — promtool, которым теперь можно проверять и файлы веб-конфигурации:
$ ./promtool check web-config web.yml
web.yml SUCCESS
Используйте любой инструмент автоматизации для удобного обновления файлов web.yml.
Grafana
Grafana поддерживает все необходимые функции для подключения к серверу Prometheus. Можно указать CA (наш prometheus.crt) или пропустить проверку сертификатов.
Заключение
Это только общий обзор. В продакшене нужно будет использовать подходящий CA и продумать еще много деталей. Можно настроить клиентские сертификаты, но из соображений безопасности эта функция считается экспериментальной. Со временем поддерживаемая версия TLS может меняться, а с ней и поведение функций.
В следующие несколько месяцев мы планируем развернуть эту поддержку HTTPS по всем официальным экспортерам Prometheus и другим проектам, например, Alertmanager, Pushgateway.
Мы за безопасный мониторинг.
От редакции: Подробнее о работе с Prometheus можно узнать на курсе Слёрма «Мониторинг и логирование инфраструктуры в Kubernetes». Сейчас курс находится в разработке и его можно купить по цене предзаказа.
Полезные ссылки
Prometheus 2.24.0
Модель безопасности Prometheus
Документация по конфигурации TLS-сервера (для Prometheus)
Документация по конфигурации TLS-клиента (для сервера Prometheus)