Info
Content

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
Back to top