vmauth
vmauth это простой auth-proxy, router, и load balancer для VictoriaMetrics
Он читает креды из http-заголовка Authorization
(поддерживаются Basic Auth, Bearer token
и InfluxDB auth), матчит их с данными из конфига из флага -auth.config
и проксирует входящие запросы на указанные в конфиге per-user url_prefix
-auth.config
может указывать на локальный файл или на http url
Quick start
Минимально достаточно запустить
/path/to/vmauth -auth.config=/path/to/auth/config.yml
vmauth повиснет на 8427 порту и будет роутить приходящие запросы на основе auth.conf
Порт может быть изменен флагом -httpListenAddr
Релоадить конфиг можно отправив процессу SIGHUP
сигнал - kill -SIGHUP $MAINPID
или сделав запрос на эндпоинт /-/reload
Docker имаджи доступны тут - https://hub.docker.com/r/victoriametrics/vmauth/tags
Load balancing
Каждый url_prefix
в auth.config может содержать один урл или список урлов
Ниже видно, что можно сразу урл, а можно список урлов
users:
- bearer_token: "YYY"
url_prefix: "http://localhost:8428"
- username: "cluster-select-account-123"
password: "***"
url_prefix:
- "http://vmselect1:8481/select/123/prometheus"
- "http://vmselect2:8481/select/123/prometheus"
В случае если указан список, vmauth будет балансить запросы между указанными урлами в режиме round-robin
Это полезно для балансинга нагрузки между несколькими vmselect/vminsert
Auth config
-auth.config
описывается следующим образом:
# Может быть указано произвольное количество username'ов
# Допустимо указывать несколько одинаковых имен пользователей, но пароли у них должны быть разные
# Такие username'ы могут различаться опцией 'name'
users:
# Запросы с заголовками 'Authorization: Bearer XXXX' и 'Authorization: Token XXXX' будут проксироваться на http://localhost:8428
# Например, http://vmauth:8427/api/v1/query отправится на http://localhost:8428/api/v1/query
- bearer_token: "XXXX"
url_prefix: "http://localhost:8428"
# Запросы с заголовком 'Authorization: Bearer YYY' будут проксироваться на http://localhost:8428
# И к каждому проксируемому запросу будет добавляться заголовок `X-Scope-OrgID: foobar`
- bearer_token: "YYY"
url_prefix: "http://localhost:8428"
headers:
- "X-Scope-OrgID: foobar"
# Пример использования пользователя
# Все запросы к http://vmauth:8427 с Basic Auth (username:password) будут проксироваться на http://localhost:8428
- username: "local-single-node"
password: "***"
url_prefix: "http://localhost:8428"
# Пример использования пользователя с extra_label team=dev.
# Все запросы к http://vmauth:8427 с Basic Auth (username:password) будут проксировать на http://localhost:8428 с аргументом запроса extra_label=team=dev
# Например, запрос к http://vmauth:8427/api/v1/query отправится на http://localhost:8428/api/v1/query?extra_label=team=dev
- username: "local-single-node"
password: "***"
url_prefix: "http://localhost:8428?extra_label=team=dev"
# Пример конфига с пользователем под неймспейс в VictoriaMetrics cluster
# Все запросы к http://vmauth:8427 с Basic Auth (username:password) будут балансироваться между указанными vmselect с указанием конкретного неймспейса
- username: "cluster-select-account-123"
password: "***"
url_prefix:
- "http://vmselect1:8481/select/123/prometheus"
- "http://vmselect2:8481/select/123/prometheus"
# Аналогичное тому что выше но с vminsert'ами
- username: "cluster-insert-account-42"
password: "***"
url_prefix:
- "http://vminsert1:8480/insert/42/prometheus"
- "http://vminsert2:8480/insert/42/prometheus"
# Единый пользователь для селектов и инсертов:
# - Запросы к http://vmauth:8427/api/v1/query, http://vmauth:8427/api/v1/query_range и http://vmauth:8427/api/v1/label/<label_name>/values
# будут проксироваться на следующие урлы в режиме round-robin:
# - http://vmselect1:8481/select/42/prometheus
# - http://vmselect2:8481/select/42/prometheus
# - Запросы к http://vmauth:8427/api/v1/write будут проксироваться на http://vminsert:8480/insert/42/prometheus/api/v1/write с заголовком "X-Scope-OrgID: abc"
- username: "foobar"
url_map:
- src_paths:
- "/api/v1/query"
- "/api/v1/query_range"
- "/api/v1/label/[^/]+/values"
url_prefix:
- "http://vmselect1:8481/select/42/prometheus"
- "http://vmselect2:8481/select/42/prometheus"
- src_paths: ["/api/v1/write"]
url_prefix: "http://vminsert:8480/insert/42/prometheus"
headers:
- "X-Scope-OrgID: abc"
Пример:
root@mon-vm-01:~# cat /etc/victoriametrics/vmauth.yaml
users:
- username: "test-user"
password: "test-password"
url_prefix: "http://localhost:8481"
Запускаем:
./vmauth-prod -eula -auth.config=/etc/victoriametrics/vmauth.yaml
Запрос без указания user/pass:
(ifree-test-k8s:default) vandud@macbook: ~ [0] ? curl 'http://mon-vm-01.g01.i-free.ru:8427/select/0/prometheus/api/v1/query_range?query=1&start=2022-08-31T02:20:00Z&end=2022-08-31T02:22:00Z&step=1m'
missing `Authorization` request header
Запрос с указанием user/pass:
(ifree-test-k8s:default) vandud@macbook: ~ [0] ? curl -s -u test-user:test-password 'http://mon-vm-01.g01.i-free.ru:8427/select/0/prometheus/api/v1/query_range?query=1&start=2022-08-31T02:20:00Z&end=2022-08-31T02:22:00Z&step=1m' | jq
{
"status": "success",
"isPartial": false,
"data": {
"resultType": "matrix",
"result": [
{
"metric": {},
"values": [
[
1661912400,
"1"
],
[
1661912460,
"1"
],
[
1661912520,
"1"
]
]
}
]
}
}
Этот конфиг может содержать плейсхолдеры вида %{ENV_VAR}
в которые будут подставлены соответствующие переменные окружения. Это может быть полезно для подстановки секретов в конфиг
Security
Подразумевается что все сервисы расположены в приватной сети и доступны снаружи только сквозь vmauth
Нужно обязательно включать https, потому что иначе пропадает смысл аутентификации через Basic Auth
Флаги -tls*
позволяют это сделать
-
-tls
- включать ли TLS (aka HTTPS). Флаги-tlsCertFile
и-tlsKeyFile
должны быть проставлены если проставлен флаг-tls
-
-tlsCertFile string
- путь до файла с сертификатом. Рекомендуются ECDSA сертификаты вместо RSA, потому что RSA медленные -
-tlsKeyFile string
- путь до файла с ключом
Как альтернатива можно поставить tls termination proxy перед vmauth
Рекомендуется защитить следующие эндпоинты через authKeys:
-
/-/reload
защищается паролем через флаг-reloadAuthKey
и внешние пользователи не смогут триггерить релоад конфига -
/flags
защищается паролем через флаг-flagsAuthkey
и внешние пользователи не смогут получить список флагов -
/metrics
защищается паролем через флагmetricsAuthkey
и внешние пользователи не смогут получить доступ к метрикам -
/debug/pprof
защищается паролем через флагpprofAuthKey
и внешние пользователи не смогут получить профилировачную информацию
Задаем пароль
/usr/local/bin/vmauth -reloadAuthKey reloadpassword -auth.config=/etc/vmauth/auth.yml
И дергаем эндпоинт с этим паролем
curl http://mon-vm-02.g01.i-free.ru:8427/-/reload?authKey=reloadpassword
Monitoring
vmauth предоставляет множество метрик в Prometheus exposition формате на эндпоинте /metrics
Среди них есть метрика vmauth_user_requests_total
с лейблом username
значение которого равно значению поля username
из конфига
Пример:
? curl -s http://mon-vm-01.g01.i-free.ru:8427/metrics | grep vmauth_user_requests_total
vmauth_user_requests_total{username="test-user"} 2
Можно перекрыть username в лейбле с помощью опции name
для username:
root@mon-vm-01:~# cat /etc/victoriametrics/vmauth.yaml
users:
- username: "test-user"
name: "not-test-user"
password: "test-password"
url_prefix: "http://localhost:8481"
root@mon-vm-01:~# curl -s http://mon-vm-01.g01.i-free.ru:8427/metrics | grep vmauth_user_requests_total
vmauth_user_requests_total{username="not-test-user"} 0
Эта метрика обнуляется после рестарта
Prifiling
vmauth предоставляет хэндлеры для сбора Go профилей:
- Memory profile - curl http://vmauth:8427/debug/pprof/heap > mem.pprof
- CPU profile - curl http://vmauth:8427/debug/pprof/profile > cpu.pprof
Команда для сбора CPU профиля сперва ждет 30 секунд и только потом возращает результат Собранные профили можно проанализировать утилитой https://github.com/google/pprof Файлы профилей не содержат сенсетивной информации поэтому их можно без страха шарить кому-то
Advanced usage
vmauth имеет еще массу различных флагов, актуальную справку по которым можно увидеть запустив vmauth -help
No Comments