From f04048e3c0653b9425098f50615da75a4c6751ee Mon Sep 17 00:00:00 2001 From: ilyamak04 Date: Mon, 24 Mar 2025 22:23:59 +0300 Subject: [PATCH] ADD tls prometheus --- docs/monitoring/Prometheus.md | 155 +++++++++++++++++++++++++++++++++- 1 file changed, 152 insertions(+), 3 deletions(-) diff --git a/docs/monitoring/Prometheus.md b/docs/monitoring/Prometheus.md index 45944ba..61972c9 100644 --- a/docs/monitoring/Prometheus.md +++ b/docs/monitoring/Prometheus.md @@ -61,6 +61,103 @@ WantedBy=multi-user.target - `sudo systemctl start prometheus` - `sudo systemctl enable prometheus` +#### Настройка TLS + +- `touch web-config.yml` - создать конфигурационный файл для настойки TLS + +- Добавить в Unit-файл пусть к конфигу TLS в директиве `ExecStart` +```bash +ExecStart=/usr/local/bin/prometheus \ + --config.file /etc/prometheus/prometheus.yml \ + --storage.tsdb.path /etc/prometheus/data \ + --web.config.file /etc/prometheus/web-config.yml +``` + +- `certbot certonly --nginx -d prometheus.mcarov.pro` - сгенирировать сертификаты, команду не хочу пояснять + +!!! tip "Если на сервере нет Nginx" + `certbot certonly --standalone -d prometheus.mcarov.pro` + +- Добавить Серт и Ключ в `web-config.yml` +``` +tls_server_config: + cert_file: /home/prometheus/certs/example.com/example.com.crt + key_file: /home/prometheus/certs/example.com/example.com.key +``` + +- Добавить строку в `/etc/crontab` для обновления серта +``` +0 0,12 * * * root /opt/certbot/bin/python -c 'import random; import time; time.sleep(random.random() * 3600)' && sudo certbot renew -q +``` + +- Создать скрипт `/etc/letsencrypt/renewal-hooks/deploy/set-permissions-and-restart-prometheus.sh` +```bash +#!/bin/bash +# Выдать права пользователю prometheus +setfacl -R -m u:prometheus:rX /etc/letsencrypt/ + +# Перезагрузить Prometheus +systemctl restart prometheus +``` +- `chmod +x /etc/letsencrypt/renewal-hooks/deploy/set-permissions-and-restart-prometheus.sh` + +- `certbot renew --dry-run` - для отладки процесса обновления сертификатов + +- Создать конфиг nginx в `/etc/nginx/sites-available` +``` +server { + server_name prometheus.mcarov.pro; + + location / { + client_max_body_size 512M; + proxy_pass https://127.0.0.1:9090; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } + + access_log /var/log/nginx/prometheus.mcarov.pro.access.log; + error_log /var/log/nginx/prometheus.mcarov.pro.error.log; + + listen 443 ssl; + ssl_certificate /etc/letsencrypt/live/prometheus.mcarov.pro/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/prometheus.mcarov.pro/privkey.pem; + include /etc/letsencrypt/options-ssl-nginx.conf; + ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; + +} + +server { + if ($host = prometheus.mcarov.pro) { + return 301 https://$host$request_uri; + } + + + listen 80; + server_name prometheus.mcarov.pro; + return 404; + +} +``` +- `ln -s /etc/nginx/sites-available/prometheus.mcarov.pro /etc/nginx/sites-enabled/` +- `nginx -t` +- `systemctl reload nginx` + +#### Аутентификация для Prometheus Server + +- `htpasswd -nBC 10 "" | tr -d ':\n'` - выполнить + +- Добавить в `web-config.yml` +```yml +basic_auth_users: + # user: password (hash) + admin: $2y$10$QzpQ2fO9TpU1Hm4VbB6AMO8ZsdoplfesfAmI8MFB402BVIu5gf.TK +``` +- `systemctl restart prometheus` + +- В UI Grafana настроить Basic auth в Data Source + #### Node exporter install - `wget https://github.com/prometheus/node_exporter/releases/download/v1.8.2/node_exporter-1.8.2.linux-arm64.tar.gz` - скачиваем node exporter на удалённый хост @@ -89,10 +186,62 @@ ExecStart=/usr/local/bin/node_exporter WantedBy=multi-user.target ``` -- `systemctl daemon-reload` +- `sudo systemctl daemon-reload` - `sudo systemctl start node_exporter` - `sudo systemctl enable node_exporter` +#### Настройка TLS + +- `touch web.yml` +- Создать `openssl.cnf` и наполнить содержимым: +``` +[req] +default_bits = 2048 +prompt = no +default_md = sha256 +distinguished_name = dn + +[dn] +CN = 150.241.66.94 + +[v3_ext] +authorityKeyIdentifier=keyid,issuer:always +basicConstraints=CA:FALSE +keyUsage=digitalSignature,keyEncipherment +extendedKeyUsage=serverAuth +subjectAltName=@alt_names + +[alt_names] +IP.1 = 150.241.66.94 +``` + +- `sudo openssl req -x509 -newkey rsa:2048 -keyout node_exporter.key -out node_exporter.pem -days 36500 -nodes -config openssl.cnf -extensions v3_ext` - генирируем серты + +- Не забываем выдать права на сертификаты + +- Добавить в `web.yml` +``` +tls_server_config: + cert_file: /etc/prometheus/node_exporter/certs/node_exporter.pem + key_file: /etc/prometheus/node_exporter/certs/node_exporter.key +``` + +- Добавить в Unit Node Exporter в директиву ExecStart +```bash +--web.config.file=/etc/prometheus/node_exporter/web.yml +``` + +- `systemctl daemon-reload` +- `systemctl restart node_exporter.service` + +- На машине с Prometheus Server добавить в `prometheus.yml` в нужную джобу экспортера +``` + scheme: https + tls_config: + ca_file: /etc/prometheus/node_exporter/srv-infra/certs/node_exporter.pem +``` + +- `systemctl restart prometheus` ### Про PromQL - `increase()` возвращает общий прирост за указанный интервал времени. @@ -105,6 +254,6 @@ increase(<метрика>[<интервал>]) ### Полезности -- `promtool check config prometheus.yml` -- `promtool check rules rules.yml` +- `promtool check config prometheus.yml`- проверка синтаксиса +- `promtool check rules rules.yml` - проверка синтаксиса - `promtool test rules rules_test.yml` \ No newline at end of file