SSL между компонентами системы
В данном разделе описана настройка SSL/TLS для сервисов сбора и хранения метрик:
- Victoria Metrics (
metrics-storage,metrics-agent,metrics-ruler) - экспортеров (
pamir-agent,blackbox-exporter,snmp-exporter,json-exporter,postgres-exporter), - Opensearch.
Вся конфигурация выполняется через docker-compose.additional.yml. Сертификаты размещаются в директории data/tls/certs/
и монтируются в контейнеры как bind-mount только для чтения.
Структура файлов
data/
├── tls/
│ └── certs/
│ ├── root-ca.crt # Корневой CA (PEM)
│ ├── metrics.crt # Сертификат для Victoria Metrics
│ ├── metrics.key # Приватный ключ Victoria Metrics
│ ├── exporters.crt # Сертификат для экспортеров
│ ├── exporters.key # Приватный ключ экспортеров
│ ├── opensearch-admin.crt # Admin-сертификат для OpenSearch securityadmin
│ ├── opensearch-admin.key # Приватный ключ admin-сертификата OpenSearch
│ ├── opensearch-node.crt # Сертификат узла OpenSearch
│ ├── opensearch-node.key # Приватный ключ узла OpenSearch
│ └── web-config.yml # Конфиг exporter-toolkit (TLS для экспортеров)
├── procfiles/
│ ├── blackbox-exporter.Procfile
│ ├── snmp-exporter.Procfile
│ └── json-exporter.Procfile
└── ...
Файлы приватных ключей должны иметь права 644, иначе контейнеры, работающие от пользователя nobody, не смогут
их прочитать:
chmod 644 data/tls/certs/*.key
Это ограничение bind-mount: Docker не транслирует UID/GID хоста в контейнер.
Сертификат для Victoria Metrics должен содержать SAN для всех трёх сервисов:
DNS:metrics-storage, DNS:metrics-agent, DNS:metrics-ruler, DNS:localhost, IP:127.0.0.1
Сертификат для экспортеров должен содержать SAN с именами Docker-сервисов:
DNS:pamir-agent, DNS:blackbox-exporter, DNS:snmp-exporter,
DNS:json-exporter, DNS:postgres-exporter, DNS:localhost, IP:127.0.0.1
Victoria Metrics
Сервисы metrics-storage, metrics-agent и metrics-ruler используют встроенную поддержку TLS через флаги
-tls, -tlsCertFile, -tlsKeyFile. При подключении к TLS-эндпоинтам (remoteWrite, datasource)
указывается путь к CA-сертификату.
В docker-compose.additional.yml:
services:
metrics-storage:
command:
- "victoria-metrics"
- "-storageDataPath=/metrics"
- "-retentionPeriod=1y"
- "-maxLabelsPerTimeseries=80"
- "-tls"
- "-tlsCertFile=/tls/metrics.crt"
- "-tlsKeyFile=/tls/metrics.key"
healthcheck:
test: ["CMD-SHELL", "curl -f --cacert /tls/root-ca.crt https://localhost:8428/ || exit 1"]
interval: 30s
timeout: 15s
volumes:
- type: bind
source: ./data/tls/certs
target: /tls
read_only: true
metrics-agent:
command:
- "vmagent"
- "-httpListenAddr=:8429"
- "-promscrape.config=http://monitoring:8004/v4/vmagent/vmagent/config"
- "-promscrape.configCheckInterval=10s"
- "-promscrape.config.strictParse=false"
- "-promscrape.maxScrapeSize=64MiB"
- "-remoteWrite.url=https://metrics-storage:8428/api/v1/write"
- "-remoteWrite.tlsCAFile=/tls/root-ca.crt"
- "-tls"
- "-tlsCertFile=/tls/metrics.crt"
- "-tlsKeyFile=/tls/metrics.key"
healthcheck:
test: ["CMD-SHELL", "curl -f --cacert /tls/root-ca.crt https://localhost:8429/ || exit 1"]
interval: 30s
timeout: 15s
volumes:
- type: bind
source: ./data/tls/certs
target: /tls
read_only: true
metrics-ruler:
command:
- "vmalert"
- "-configCheckInterval=10s"
- "-datasource.url=https://metrics-storage:8428"
- "-datasource.tlsCAFile=/tls/root-ca.crt"
- "-notifier.url=http://monitoring:8004/v4"
- "-remoteWrite.url=https://metrics-storage:8428"
- "-remoteWrite.tlsCAFile=/tls/root-ca.crt"
- "-rule=http://monitoring:8004/v4/vmalert/vmalert/config"
- "-tls"
- "-tlsCertFile=/tls/metrics.crt"
- "-tlsKeyFile=/tls/metrics.key"
healthcheck:
test: ["CMD-SHELL", "curl -f --cacert /tls/root-ca.crt https://localhost:8880/ || exit 1"]
interval: 30s
timeout: 15s
volumes:
- type: bind
source: ./data/tls/certs
target: /tls
read_only: true
После включения TLS на metrics-storage необходимо обновить scrape-конфигурацию metrics-agent, генерируемую
сервисом monitoring. Для каждого job экспортеров нужно добавить:
scheme: https
tls_config:
ca_file: /tls/root-ca.crt
Экспортеры
Все поддерживаемые экспортеры используют формат Prometheus exporter-toolkit
для настройки TLS через общий файл data/tls/certs/web-config.yml:
tls_server_config:
cert_file: /tls/exporters.crt
key_file: /tls/exporters.key
Путь /tls/web-config.yml доступен внутри контейнера через bind-mount директории data/tls/certs в /tls.
pamir-agent
pamir-agent поддерживает TLS через флаг --web.config:
services:
pamir-agent:
command:
- "pamir_agent"
- "--path.rootfs=/host"
- "--web.config=/tls/web-config.yml"
healthcheck:
test: ["CMD-SHELL", "curl -f --cacert /tls/root-ca.crt https://localhost:9100/ || exit 1"]
interval: 30s
timeout: 15s
volumes:
- type: bind
source: ./data/tls/certs
target: /tls
read_only: true
blackbox-exporter, snmp-exporter, json-exporter
Эти экспортеры запускаются через goreman по /Procfile. Для добавления флага --web.config.file
монтируется кастомный Procfile поверх встроенного:
- blackbox-exporter
- snmp-exporter
- json-exporter
confd: confd -backend redis -interval 10 -node $REDIS_HOST:$REDIS_PORT
blackbox_exporter: blackbox_exporter --config.file /etc/blackbox_exporter/blackbox.yml --web.config.file=/tls/web-config.yml
services:
blackbox-exporter:
healthcheck:
test: ["CMD-SHELL", "curl -f --cacert /tls/root-ca.crt https://localhost:9115/ || exit 1"]
interval: 30s
timeout: 15s
volumes:
- type: bind
source: ./data/tls/certs
target: /tls
read_only: true
- type: bind
source: ./data/procfiles/blackbox-exporter.Procfile
target: /Procfile
read_only: true
confd: confd -backend redis -interval 10 -node $REDIS_HOST:$REDIS_PORT
snmp_exporter: snmp_exporter --config.file /etc/snmp_exporter/snmp.yml --web.config.file=/tls/web-config.yml
services:
snmp-exporter:
healthcheck:
test: ["CMD-SHELL", "curl -f --cacert /tls/root-ca.crt https://localhost:9116/ || exit 1"]
interval: 30s
timeout: 15s
volumes:
- type: bind
source: ./data/tls/certs
target: /tls
read_only: true
- type: bind
source: ./data/procfiles/snmp-exporter.Procfile
target: /Procfile
read_only: true
confd: confd -backend redis -interval 10 -node $REDIS_HOST:$REDIS_PORT
json_exporter: json_exporter --config.file /etc/json_exporter/config.yml --web.config.file=/tls/web-config.yml
services:
json-exporter:
healthcheck:
test: ["CMD-SHELL", "curl -f --cacert /tls/root-ca.crt https://localhost:7979/metrics || exit 1"]
interval: 30s
timeout: 15s
volumes:
- type: bind
source: ./data/tls/certs
target: /tls
read_only: true
- type: bind
source: ./data/procfiles/json-exporter.Procfile
target: /Procfile
read_only: true
postgres-exporter
services:
postgres-exporter:
command:
- "--config.file=/etc/postgres_exporter/postgres_exporter.yml"
- "--web.config.file=/tls/web-config.yml"
volumes:
- type: bind
source: ./data/tls/certs
target: /tls
read_only: true
Экспортеры без поддержки TLS
Следующие экспортеры не поддерживают TLS на собственном HTTP-листенере и настроить его невозможно:
| Сервис | Причина |
|---|---|
sql-exporter | Используемая версия не интегрирует exporter-toolkit |
cadvisor | Сторонний upstream-образ без поддержки web-config |
docker-state-exporter | Сторонний upstream-образ |
jmx-exporter | Другой механизм конфигурации (Java) |
nginxlog-exporter | TLS не реализован в данной версии |
elasticsearch-exporter | TLS настраивается только для целевого OpenSearch, не для HTTP-листенера |
OpenSearch
Для работы securityadmin.sh при первичной инициализации кластера OpenSearch необходимо предоставить
admin-сертификат, подписанный доверенным CA. Сертификат монтируется в директорию конфигурации OpenSearch
под именами, которые проверяет entrypoint:
services:
opensearch:
volumes:
# Все стандартные тома из docker-compose.deps.yml необходимо перечислить явно
- type: volume
source: opensearch-data
target: /usr/share/opensearch/data
- type: volume
source: opensearch-tmp
target: /tmp
- type: volume
source: opensearch-logs
target: /usr/share/opensearch/logs
- type: volume
source: opensearch-config
target: /usr/share/opensearch/config
# Кастомные сертификаты
- type: bind
source: ./data/tls/certs/root-ca.crt
target: /usr/share/opensearch/config/pamir-root-ca.pem
read_only: true
- type: bind
source: ./data/tls/certs/opensearch-admin.crt
target: /usr/share/opensearch/config/pamir-admin.pem
read_only: true
- type: bind
source: ./data/tls/certs/opensearch-admin.key
target: /usr/share/opensearch/config/pamir-admin-key.pem
read_only: true
Чтобы securityadmin.sh принял кастомный admin-сертификат, его DN должен быть зарегистрирован в
opensearch.yml:
plugins.security.authcz.admin_dn:
- "CN=PAMIR OpenSearch Admin,O=PAMIR,C=RU"
По умолчанию install_demo_configuration.sh прописывает DN от demo-сертификата kirk.pem. Для полной
интеграции кастомных сертификатов этот параметр необходимо добавить через pamirPatchOpensearchYml в entrypoint.