Перейти к основному содержимому
Версия: 2.0 (WIP)

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:

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:

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:

docker-compose.additional.yml
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 поверх встроенного:

data/procfiles/blackbox-exporter.Procfile
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
docker-compose.additional.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

postgres-exporter

docker-compose.additional.yml
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-exporterTLS не реализован в данной версии
elasticsearch-exporterTLS настраивается только для целевого OpenSearch, не для HTTP-листенера

OpenSearch

Для работы securityadmin.sh при первичной инициализации кластера OpenSearch необходимо предоставить admin-сертификат, подписанный доверенным CA. Сертификат монтируется в директорию конфигурации OpenSearch под именами, которые проверяет entrypoint:

docker-compose.additional.yml
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
Требуется настройка admin_dn

Чтобы 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.