Привет всем =)

Решил написать несколько заметок на тему реализации построения мониторинга на Promstack компонентах. И начать настройку хотелось бы с не логичной стороны, это настройки экспортеров. Так как текущая обстановка на работе благоволит начать действовать.

Думаю вы уже знакомы с экспортерами. Это такое приложение, которое собирает различные метрики с компонентов и других приложений нашей системы. Говоря же про node_exporter, этот экспортер вытягивает метрики с оборудования и операционки, предоставляемые ядром системы.

Скачать и запустить экспортер дело 5 минут, у вас поднимится порт 9100 готовый принимать http-запросы. Но реальность такова, что чаще всего приходиться извращаться и ставить дополнительный софт что бы как то закрыть доступ к метрикам.

Но время шло, и наконец-то начиная с версии 1.0 в node_exporter добавили поддержку TLS и Basic Auth, необходимость установки дополнительно по отпадает. Но в рамках этой главы я покажу оба метода, с прокси и без использования прокси.

Установка node_exporter (Нативно)

Для начала качаем последний релиз экспортера:

root@node01:~# cd /tmp
root@node01:~# wget https://github.com/prometheus/node_exporter/releases/download/v1.5.0/node_exporter-1.5.0.linux-amd64.tar.gz

Далее в /tmp распаковываем архив:

root@node01:/tmp# tar -zxvf node_exporter-1.5.0.linux-amd64.tar.gz -C ./

В архиве будет содержаться бинарь, поэтому его перемешаем в область ко всем запускаемым программам:

root@node01:/tmp# mv node_exporter-1.5.0.linux-amd64/node_exporter /usr/local/bin/

Теперь проработаем вопрос безопасности нашего экспортера. Для TLS-инкрипции будем юзать пока что самоподписные сертификаты. Но если есть доступ к интнернет, или это у вас какой нибудь веб-сервак, то можно прикрутить сертификат от LE. В будущем есть идеи, как упразднить менеджмент сертификатов через freeipa и certmonger.

Создаем самоподписной сертификат:

root@node01:~# mkdir -p /etc/node_exporter/ssl
root@node01:~# cd /etc/node_exporter/ssl/
root@node01:~# openssl req -new -newkey rsa:2048 -days 365 -nodes -x509 -keyout node_exporter.key -out node_exporter.crt -subj "/C=RU/ST=MOSCOW/L=MOSCOW/O=PROM/CN=localhost" -addext "subjectAltName = DNS:localhost"

В дальнейшем сертификат скопируем на сервер с прометеем.

Как я говорил ранее, начиная с версии 1.0, в поддержку node экспортер была включена поддержка basic_auth для доступа к метрикам через пароль. Поэтому используя утилиту htpasswd, или что-то другое генерим пароль.

root@node01:/etc/node_exporter/ssl# htpasswd -nBC 10 "" | tr -d ':\n'; echo

Результат этой команды выкенет захешированный пароль, этот пароль далее вставляем в конфигурацию экспортера.

Создаем конфигурационный файл, и описываем в нем настройки безопасности.

---
root@node01:~# vim /etc/node_exporter/config.yml
---
tls_server_config:
  cert_file: /etc/node_exporter/ssl/node_exporter.crt
  key_file: /etc/node_exporter/ssl/node_exporter.key
basic_auth_users:
  prometheus: "PASSWORDHASH"

На сервере создаем пользователя, из под которого будем запускать exporter.

root@node01:~# useradd -c "Exporter system user" -U --system -s /bin/false node_exporter

Ну и для запуска экспортера как сервис, напишем systemd-unit:

root@node01:~# vim /etc/systemd/system/node-exporter.service
---
[Unit]
Description=Node Exporter
Wants=network-online.target
After=network-online.target

[Service]
User=node_exporter
Restart=on-failure
RestartSec=5s
ExecStart=/usr/local/bin/node_exporter --web.config.file=/etc/node_exporter/config.yml

[Install]
WantedBy=multi-user.target

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

root@node01:~# systemctl daemon-reload

Перед запуском сервиса нужно изменить владельца/группу на бинаре экспортера и файлах конфигурации:

root@node01:~# chown -R node_exporter:node_exporter /etc/node_exporter/
root@node01:~# chown -R node_exporter:node_exporter /usr/local/bin/node_exporter

Ну и запускаем сервис:

root@node01:~# systemctl enable --now node-exporter

Не забываем открыть порт на фаерволе.

Можем кинуть с локалхоста запрос к экспортеру, что бы проверить как отдаются метрики:

root@node01:~# curl --user prometheus --insecure https://localhost:9100/metrics

Добавление хоста в prometheus

На сервер с прометеусом копируем сертификат. Далее правим конфиг prometheus.yml, добавляем новый джоб:

[root@prometheus01 ~]# vim /etc/prometheus/prometheus.yml
---
  - job_name: "node_exporter"
    scheme: https
    basic_auth:
      username: prometheus
      password: "Mypassword"
    tls_config:
      ca_file: /etc/prometheus/exporter_ssl/node_exporter.crt
      insecure_skip_verify: true
    static_configs:
    - targets: ['node-exporter.local:9100']
      labels:
        instance: node-services

Создаем каталог под хранение сертификатов, и кладем туда серт:

[root@prometheus01 ~]# mkdir /etc/prometheus/exporter_ssl/
[root@prometheus01 ~]# mv /home/tony/node_exporter.crt /etc/prometheus/exporter_ssl/
[root@prometheus01 ~]# chown -R prometheus:prometheus /etc/prometheus/exporter_ssl/

Ну и перезапускаем prometheus:

[root@prometheus01 ~]# systemctl restart prometheus

Для подключения других серверов, аналогично настраиваем экспортера. Сертификат и пароль будет использоватся такой же, просто серт копируем на новую тачку. Ну и в секцию джобы с node_exporter добавляем новый таргет.

Настройка node_exporter + nginx

В процессе можете столкнуться с такой ситуацией, когда на целевом сервере нужно поставить несколько экспортеров, например node_exporter, nginx_exporter и экспортер для mysql.

И под каждый тип будет открываться сетевой сокет, ну и в добавок не все экспортеры могут работать с Basic Auth. Решение проблемы, это спрятать наших экспортеров за прокси Nginx, и через nginx размутить TLS-терминацию и авторизацию.

Пропустим этап скачивания и настройки экспортера, условно говоря мы это уже выполнили и в качестве входных данных имеем запущенный node_exporter на localhost:9100 и установленный nginx.

Напишем новый конфиг для nginx,

server {
    listen 443 ssl;
    server_name node-exporter.local;
    access_log off;
    error_log off;

    allow 10.8.10.14/32;
    allow 10.8.10.15/32;
    deny all;

    ssl_certificate /etc/ssl/node_exporter/node_exporter.crt;
    ssl_certificate_key /etc/ssl/node_exporter/node_exporter.key;

    auth_basic	"Exporters area";
    auth_basic_user_file	/etc/nginx/.htpasswd;

    location /node-exporter {
        proxy_pass http://localhost:9100/metrics;
    }

}

В этом конфиге я разрешаю доступ только с серверов прометея, остальным доступ будет закрыт.

allow 10.8.10.14/32;
allow 10.8.10.15/32;
deny all;

Далее идут директивы с указанием сертификатов и ключа сертификата.

ssl_certificate /etc/ssl/node_exporter/node_exporter.crt;
ssl_certificate_key /etc/ssl/node_exporter/node_exporter.key;

Опции auth_basic включают вход по паролю.

auth_basic	"Exporters area";
auth_basic_user_file	/etc/nginx/.htpasswd;

А в контексте location говориться, все запросы поступающие на uri /node-exporter проксировать на сетевой сокет экспортера.

location /node-exporter {
    proxy_pass http://localhost:9100/metrics;
}

Теперь в конфигурацию этого сервера мы можем добавлять и другие локейшены для других экспортеров.

Сгенерим файл .htpasswd c паролем доступа к метрикам:

root@node01:~# htpasswd -c /etc/nginx/.htpasswd prometheus

Ну и перезапускаем nginx:

root@node01:~# systemctl restart nginx

Теперь с сервера можем проверить, отдаются ли метрики:

root@prometheus01:~# curl -v --insecure --user prometheus https://node-exporter.local/node-exporter

Добавление хоста в prometheus

Идем в настройки конфигурации прометея, и добавляем новую джобу.

  - job_name: node-exporter-tls
    scheme: https
    basic_auth:
      username: prometheus
      password: "Mypassword"
    tls_config:
      ca_file: /etc/prometheus/exporter_ssl/node_exporter.crt
      insecure_skip_verify: true
    metrics_path: /node-exporter
    static_configs:
      - targets:
          - node-exporter.local:443

Из отличий с прошлым примером, тут добавился путь к метрикам metrics_path.

Также не забываем закинуть сертификат в /etc/prometheus/exporter_ssl/ и перезапускаем прометей. После идем в графанку посмотреть что там начало сыпаться.