Knowledge Base
Prometheus / Grafana открыты публично (порты 9090, 3000, 9100)
Prometheus и Grafana открыты публично
Категория: Server Hardening · Риск: high
Prometheus и Grafana открыты публично
Что утекает
Prometheus (порт 9090)
# Полный список метрик без аутентификации
curl http://<IP>:9090/api/v1/targets
# Все метаданные инфраструктуры:
# - Имена всех сервисов, хостов, контейнеров
# - Количество запросов, ошибок, размер БД
# - Версии всего ПО через build_info
# - Внутренние IP-адреса всех узлов
# - Память, CPU, диск каждого сервера
# Ещё опаснее — если включён write API:
curl -X POST http://<IP>:9090/api/v1/admin/tsdb/delete_series \
-d 'match[]={__name__=~".+"}'
# Удаляет все метрики
Node Exporter (порт 9100)
# Полная информация о железе и ОС
curl http://<IP>:9100/metrics | grep -E "node_uname|node_os|cpu|memory"
# Раскрывает: версию ОС, ядра, hostname, CPU model, RAM
Grafana (порт 3000)
Открытая Grafana с дефолтным паролем `admin:admin`:
- Полный доступ к дашбордам с бизнес-метриками
- Datasource credentials (Prometheus, InfluxDB, PostgreSQL)
- Возможность добавить data source с произвольным подключением
Исправление
Привязать к localhost / VPN-интерфейсу
# docker-compose.yml
services:
prometheus:
ports:
- "127.0.0.1:9090:9090" # только localhost
grafana:
ports:
- "127.0.0.1:3000:3000" # только localhost
node-exporter:
ports:
- "127.0.0.1:9100:9100" # только localhost
Nginx reverse proxy с базовой аутентификацией
location /prometheus/ {
auth_basic "Prometheus";
auth_basic_user_file /etc/nginx/.htpasswd;
proxy_pass http://127.0.0.1:9090/;
proxy_set_header Host $host;
# Разрешить только из VPN/офиса
allow 10.0.0.0/8;
deny all;
}
# Создать .htpasswd
htpasswd -c /etc/nginx/.htpasswd admin
Prometheus с аутентификацией (v2.24+)
# web.yml
basic_auth_users:
admin: $2y$10$... # bcrypt hash
# Запуск с конфигом
prometheus --web.config.file=web.yml
Grafana — обязательная смена пароля
# /etc/grafana/grafana.ini
[security]
admin_password = <strong-password> # сменить с admin!
disable_gravatar = true
cookie_secure = true
cookie_samesite = strict
[auth.anonymous]
enabled = false # запретить анонимный доступ
Связанные проверки
- [Admin panels exposure](/kb/web_app_security/open-admin-panels)
- [Container public ports](/kb/server_hardening/container-public-ports-inventory)