Авторизация в сервисах VictoriaMetrics#

Важно

Начиная с версии 5.1.0, в поставку DropApp в инструмент VictoriaMetrics включен компонент vmauth, который заменяет устаревший компонент vmgateway. Компонент vmgateway больше не поддерживается и исключен из поставки. Функциональность vmgateway полностью перенесена в vmauth. Используйте vmauth вместо vmgateway.

Компонент vmauth#

vmauth — это прокси-сервер и компонент аутентификации для экосистемы VictoriaMetrics. Он предоставляет функции управления доступом, маршрутизации запросов и балансировки нагрузки между бэкендами VictoriaMetrics.

vmauth поддерживает следующие функции:

  • аутентификацию пользователей по статическим учетным данным (логин/пароль), токену или Basic Auth;

  • авторизацию по JWT-токену от внешнего OIDC-провайдера (например, Keycloak) с контролем доступа на уровне метрик через claim vm_access — функциональность, ранее выполнявшаяся vmgateway;

  • маршрутизацию запросов к различным бэкендам VictoriaMetrics по правилам конфигурации (url_map);

  • разделение доступа на чтение и запись для каждого пользователя;

  • доступ по TenantId в кластерной версии VictoriaMetrics;

  • контроль доступа на уровне метрик для одиночной и кластерной версий VictoriaMetrics;

  • автоматическое обнаружение IP-адресов бэкенд-сервисов в кластере;

  • кеширование ответов бэкендов и балансировку нагрузки между репликами.

Базовая конфигурация (статическая аутентификация)#

vmauth конфигурируется через YAML-файл (по умолчанию vmauth.yml). Пример базовой конфигурации:

users:
  # Пользователь с доступом на чтение и запись
  - username: "<ИМЯ_ПОЛЬЗОВАТЕЛЯ>"
    password: "<ПАРОЛЬ_ПОЛЬЗОВАТЕЛЯ>"
    url_map:
      # запись метрик направляем в vminsert
      - src_paths: ["/insert/.*"]
        url_prefix: ["http://vminsert:8480"]
      # чтение метрик направляем в vmselect
      - src_paths: ["/select/.*", "/api/v1/query.*"]
        url_prefix: ["http://vmselect:8481"]

  # Пользователь только на чтение
  - username: "<ИМЯ_ПОЛЬЗОВАТЕЛЯ>"
    password: "<ПАРОЛЬ_ПОЛЬЗОВАТЕЛЯ>"
    url_map:
      - src_paths: ["/select/.*", "/api/v1/query.*"]
        url_prefix: ["http://vmselect:8481"]

# Правила маршрутизации для неавторизованных запросов (необязательно)
unauthorized_user:
  url_map:
    - src_paths: ["/api/v1/query.*"]
      url_prefix: ["http://vmselect:8481"]

Где:

  • username — имя пользователя для аутентификации;

  • password — пароль пользователя;

  • url_map — список правил маршрутизации: src_paths (регулярные выражения путей запроса), url_prefix (адреса бэкендов, куда проксируется запрос);

  • url_prefix для чтения указывает на vmselect (порт 8481), для записи — на vminsert (порт 8480);

  • unauthorized_user — настройки маршрутизации запросов от неавторизованных пользователей (если раздел не задан, такие запросы отклоняются).

Примечание

Вместо username/password (Basic Auth) для пользователя можно задать bearer_token: "<ТОКЕН>". В этом случае аутентификация выполняется по заголовку Authorization: Bearer <токен>.

vmauth прослушивает входящие запросы на порту 8427 (по умолчанию), проверяет учетные данные пользователя, сопоставляет запрошенный путь с правилами маршрутизации и перенаправляет запрос к соответствующему бэкенду.

Авторизация по JWT (замена vmgateway)#

vmauth умеет проверять JWT-токены, выданные внешним OIDC-провайдером (Keycloak), и применять контроль доступа на уровне метрик — эта функциональность ранее обеспечивалась компонентом vmgateway. Токен должен содержать claim vm_access; поле metrics_extra_filters внутри него задает, какие метрики разрешены пользователю.

users:
  - jwt:
      oidc:
        # адрес OIDC-провайдера (Keycloak), по нему vmauth получает ключи для проверки токена (jwks)
        issuer: "http://keycloak.keycloak.svc.cluster.local:8080/realms/dev"
      # значения по умолчанию, если в токене claim не заполнен
      default_vm_access_claim:
        metrics_account_id: 0
        metrics_project_id: 0
    url_map:
      - src_paths: ["/select/.*", "/api/.*", "/prometheus/.*"]
        url_prefix:
          # extra_filters подставляется из claim vm_access.metrics_extra_filters токена
          - "http://vmselect:8481/select/0/prometheus/?extra_filters={{.MetricsExtraFilters}}"
    access_log: {}

Где:

  • jwt.oidc.issuer — адрес OIDC-провайдера; vmauth строго сверяет значение iss в токене с этим issuer, поэтому адрес должен совпадать с тем, что провайдер прописывает в токен;

  • поле токена vm_access.metrics_extra_filters подставляется в url_prefix через шаблон {{.MetricsExtraFilters}} — пользователь видит только разрешенные ему метрики;

  • access_log: {} — включение журналирования обращений (поле уровня пользователя).

Сценарий проверки настройки аутентификации vmauth#

  1. Разверните компоненты VictoriaMetrics (vmselect и vminsert для кластерной версии или victoria-metrics для одиночной версии).

  2. Создайте файл конфигурации с учетными данными и правилами маршрутизации (по аналогии с примером выше). При запуске через оператор VictoriaMetrics конфигурация передается в Secret, на который ссылается CR VMAuth (spec.configSecret); ключ в секрете — config.yaml.

  3. Запустите vmauth с указанием пути к файлу конфигурации (флаг -auth.config):

    ./vmauth -auth.config=config.yaml
    
  4. Выполните запрос к API VictoriaMetrics через vmauth с корректными учетными данными:

    curl -u <ИМЯ_ПОЛЬЗОВАТЕЛЯ>:<ПАРОЛЬ_ПОЛЬЗОВАТЕЛЯ> 'http://localhost:8427/api/v1/query?query=up'
    

    vmauth аутентифицирует пользователя, проверяет права доступа и перенаправляет запрос к указанному бэкенду.

    Для авторизации по JWT-токену используется заголовок Authorization:

    curl -H "Authorization: Bearer <token>" 'http://localhost:8427/api/v1/query?query=up'
    
  5. Запрос без учетных данных или с неверными учетными данными будет отклонен:

    curl 'http://localhost:8427/api/v1/query?query=up'
    

    В ответе будет код 401 Unauthorized.