Конфигурация edge — Versola Docs
VersolaVersola/docs
До 1.00.7.1versola.kzGitHub

Конфигурация edge

Все ключи HOCON-файла edge с значениями по умолчанию, секреты за каждым из них, проверки при старте, минимальный пример с комментариями и формат списка закреплённых сертификатов.

edge при старте читает один HOCON-файл. На странице перечислены его ключи, указано, какой секрет стоит за каждым и откуда он берётся, и описано, из-за чего edge отказывается запускаться. О правилах загрузки, переменных окружения и блоках, общих с auth и central, см. Справочник по конфигурации.

versola configure и Helm-чарт генерируют этот файл для разворачиваемого релиза, поэтому вручную его пишут редко. В цели vps ручная правка пропадает при следующем configure.

Загрузка и переменные окружения

Путь к файлу берётся из CONFIG_PATH (в образе по умолчанию /app/config/env.conf). Вместо файла весь HOCON можно передать в ENV_CONFIG. Ключи пишутся в kebab-case, длительности — в формате HOCON ("60 seconds", 5 minutes), подстановка ${VAR} работает.

ПеременнаяПо умолчаниюЗначение
PORT8080Порт приложения
DPORT8081Порт диагностики: /metrics, /liveness, /readiness
BIND_HOST0.0.0.0Адрес привязки
CONFIG_PATH/app/config/env.confПуть к HOCON-файлу
RUN_MIGRATIONSfalsetrue применяет миграции при старте. Иначе edge только проверяет схему и останавливается, если она устарела
WARMUP_ENABLED, WARMUP_BUDGET_SECONDStrue, 20Прогрев до готовности
POSTGRES_POOL_METRICS_INTERVALнетПереопределяет postgres.pool-metrics-interval

edge не читает APORT и MPORT.

Ключи

«Обязательный» означает, что у ключа нет значения по умолчанию и без него edge не запустится.

Верхний уровень

КлючОбязательныйПо умолчаниюЗначение
envдаИмя окружения. prod включает проверки для продакшена, и тогда /service/configuration/sync отвечает 404
idдаID этого edge. Должен совпадать с edge, зарегистрированным в central (Edges в консоли). Генерируется edge-default
key-idдаkid ключа ниже. Попадает в заголовок токена, который edge подписывает для central
private-keyдаЗакрытый ключ RSA, PKCS#8, base64. Им edge подписывает синхронизирующие вызовы в central (RS256). Открытая часть хранится в central
configuration-cache-refresh-intervalдаКак часто edge перечитывает из central ресурсы, эндпоинты, разрешения, роли, клиентов, пресеты, JWKS и политику DPoP. Генерируется 5 minutes для vps и Kubernetes, 1 minute локально
versola-urlдаПубличный URL auth. Сюда перенаправляется браузер, с ним сравнивается iss токена
versola-internal-urlнетversola-urlURL, по которому сам edge обращается к auth. Отличается от versola-url, если edge и браузер ходят к auth по разным сетям
versola-internal-trusted-certificatesнетпустоЗакрепления для сертификата HTTPS-эндпоинта, к которому edge обращается, когда клиент аутентифицируется сертификатом, а versola-internal-url — https (TLS-терминатор перед auth). Если не задано, такие вызовы отклоняются. Если versola-internal-url — обычный HTTP и есть блок native, такие вызовы идут на native.auth-mutual-tls-url и проверяются по native.trusted-certificates. См. Закреплённые сертификаты
edge-urlдаПубличный origin, по которому клиенты обращаются к edge. htu proof DPoP строится из него, а не из заголовка Host
central.urlдаБазовый URL Central API
otel-exporterнетнетКонечная точка OTLP gRPC для трассировки. Если не задан, трассировка выключена

security

КлючОбязательныйЗначение
token-encryption.keyда32 байта, base64url. Ключ AES для refresh-токенов в таблице сессий edge. Если его потерять или сменить, все сохранённые сессии перестанут обновляться
edge-sessions.secretда32 байта, base64url. Должен быть задан, но в этом релизе не читается
edge-sessions.ttlдаДлительность. Должна быть задана, но в этом релизе не читается. Срок cookie определяется refresh-токеном. Генерируется 30 days
internal-secretнетBase64url. Пароль для POST /service/configuration/sync вне продакшена, пользователь edge. Если не задан, эндпоинт недоступен

postgres

Тот же блок, что в auth и central: см. Справочник по конфигурации. Для edge нужна своя база или своя схема в общей базе (цели CLI используют общую базу с ...?currentSchema=edge). edge слушает отзывы на отдельном соединении, поэтому за пулером в transaction-режиме задайте notifications-url. Генерируемые значения для edge: maximum-pool-size = 10, minimum-idle = 10.

cleanup

Удаляет просроченные строки. Для edge генерируется, max-threads = 2:

ТаблицаРазмер пакетаИнтервалКлючевой столбец
pending_logins10005 minutesstate
edge_sessions5001 hourctid
revocations10001 hourrevoked_key

revocation

Необязательный блок. Значения ниже заданы в коде.

КлючПо умолчаниюЗначение
reload-interval600 secondsКак часто список отзывов в памяти сверяется с базой, с разбросом. Обычно отзывы приходят уведомлением, так что это страховка
purge-interval60 secondsКак часто удаляются записи об истёкших токенах
overlap30 secondsНа сколько сверка отступает назад от последней прочитанной позиции, чтобы подхватить строки, закоммиченные с опозданием
batch-size50000Строк за одно чтение

dpop

Необязательный блок. Без него edge отклоняет запросы со схемой DPoP, но токен, привязанный к ключу, через Bearer всё равно отклоняется. Блоку native он обязателен. Допустимые алгоритмы берутся из метаданных сервера в central, а требование nonce задаётся настройкой Require DPoP nonce у этого edge в разделе Edges. Здесь ни то ни другое не настраивается.

КлючОбязателен в блокеЗначение
nonce-saltда32 байта, base64url. Ключ собственного пространства DPoP-Nonce у edge. Не общий с auth: nonce от auth в edge недействителен
iat-leewayдаМаксимальное расстояние iat proof от текущего времени в обе стороны. Задаёт и размер защиты от повторов. Генерируется 60 seconds
nonce-ttlдаСколько выданный nonce остаётся действительным. Генерируется 600 seconds

native

Необязательный блок. Если его нет, любой вызов /native/* отвечает 404. Описание потока — в разделе Нативные приложения.

КлючОбязательныйПо умолчаниюЗначение
auth-mutual-tls-urlдаАдрес, по которому edge обращается к mutual-TLS-слушателю auth (MPORT)
auth-mutual-tls-external-urlнетauth-mutual-tls-urlКак auth называет этот слушатель (его mutual-tls.external-url). Из него строится htu proof устройства для /token и /revoke
trusted-certificatesдаСписок путей к PEM: конечные сертификаты, которые может предъявить слушатель. Минимум один
blob-keyда32 байта, base64url. Ключ AES-256-GCM, которым запечатывается blob из /native/start. Отдельный ключ, не token-encryption.key
blob-ttlнет600 secondsСколько blob можно предъявить. Дополнительно ограничен временем жизни pushed-запроса в auth
auth-issuerнетversola-urliss в ответах авторизации auth (его jwt.issuer). Задайте, если он отличается от versola-url, иначе /native/complete отклонит ответ

Секреты и откуда они берутся

В цели vps и в локальной цели versola configure генерирует каждый секрет, сохраняет его в OpenBao по пути secret/versola/<target>/edge и передаёт в окружение контейнера как ${VAR}, на которую ссылается HOCON-файл. В Kubernetes те же ключи приходят из Secret (Kubernetes). См. Секреты.

ПеременнаяКлюч конфигурацииФорматПримечания
EDGE_PRIVATE_KEYprivate-keyRSA PKCS#8Хранится вместе с EDGE_KEY_ID. Открытая часть, EDGE_PUBLIC_JWK, уходит в central. Новая пара в работающей системе приводит к 401 на всех вызовах edge в central
EDGE_KEY_IDkey-idтекстДолжен совпадать с kid ключа, зарегистрированного в central
EDGE_TOKEN_ENC_KEYsecurity.token-encryption.key32 байтаГенерируется только при первой установке. Отсутствие значения при обновлении — ошибка, а не тихая перегенерация
EDGE_SESSIONS_SECRETsecurity.edge-sessions.secret32 байта
EDGE_INTERNAL_SECRETsecurity.internal-secretлюбая длина
EDGE_DPOP_NONCE_SALTdpop.nonce-salt32 байта
EDGE_NATIVE_BLOB_KEYnative.blob-key32 байта
POSTGRES_PASSWORDpostgres.passwordтекст

Секрет в 32 байта — это URL-safe base64 ровно от 32 байт. Другая длина останавливает запуск.

Проверки при старте

edge отказывается запускаться и называет ключ, если:

  • не задан обязательный ключ, у секрета неверная длина или private-key не является ключом RSA в формате PKCS#8;
  • путь в versola-internal-trusted-certificates или native.trusted-certificates не содержит сертификата либо содержит удостоверяющий центр. Проверяется каждый сертификат в каждом файле, проходят только конечные сертификаты;
  • native.trusted-certificates пуст;
  • блок native есть, а блока dpop нет;
  • значение trusted-certificates — просто строка. Нужен список;
  • схема базы устарела, а RUN_MIGRATIONS не равен true;
  • env = "prod", а URL Postgres не на loopback не проверяет TLS;
  • он не может прочитать список отзывов из базы. Реплика без списка принимала бы отозванные токены, поэтому она остаётся вне обслуживания.

Минимальный пример с комментариями

Это файл в стиле vps; необязательные блоки опущены, кроме dpop. Секреты — подстановки, которые берутся из окружения.

env = prod
id = "edge-default"                     # тот же ID, что у edge в central
key-id = ${EDGE_KEY_ID}
private-key = ${EDGE_PRIVATE_KEY}       # PKCS#8 RSA, base64

configuration-cache-refresh-interval = "5 minutes"

versola-url = "https://id.example.com"  # что видят браузеры и что сверяется с iss токена
edge-url    = "https://id.example.com"  # из этого строится htu для DPoP

central { url = "http://127.0.0.1:8090" }

security {
  token-encryption { key = ${EDGE_TOKEN_ENC_KEY} }
  edge-sessions {
    secret = ${EDGE_SESSIONS_SECRET}
    ttl = 30 days
  }
}

postgres {
  url = "jdbc:postgresql://db.example.com:5432/versola?currentSchema=edge"
  user = "versola"
  password = ${POSTGRES_PASSWORD}
  maximum-pool-size = 10
  minimum-idle = 10
  connection-timeout = "30 seconds"
  max-lifetime = "30 minutes"
  leak-detection-threshold = "60 seconds"
}

cleanup {
  max-threads = 2
  tables = [
    { table-name = "pending_logins", batch-size = 1000, interval = "5 minutes", key-column = "state" }
    { table-name = "edge_sessions",  batch-size = 500,  interval = "1 hour",    key-column = "ctid" }
    { table-name = "revocations",    batch-size = 1000, interval = "1 hour",    key-column = "revoked_key" }
  ]
}

dpop {
  nonce-salt = ${EDGE_DPOP_NONCE_SALT}
  iat-leeway = "60 seconds"
  nonce-ttl  = "600 seconds"
}

Блок native добавляйте, только если обслуживаете нативные приложения:

native {
  auth-mutual-tls-url  = "https://id.example.com:8083"
  trusted-certificates = ["/certs/auth-mtls.crt"]
  blob-key             = ${EDGE_NATIVE_BLOB_KEY}
}

Закреплённые сертификаты

versola-internal-trusted-certificates и native.trusted-certificates — списки путей к PEM-файлам. Каждый элемент закрепляет конкретный конечный сертификат, это не якорь доверия. HTTP-клиент edge не проверяет имя хоста, поэтому доверие к УЦ принимало бы любой сертификат, который этот УЦ когда-либо выпустил, для любого хоста. Поэтому УЦ отклоняется при старте.

native {
  trusted-certificates = ["/certs/auth-mtls-old.crt", "/certs/auth-mtls-new.crt"]
}
versola-internal-trusted-certificates = ["/certs/auth-internal.crt"]

Принимается серверный сертификат, совпавший с любым элементом списка. Чтобы сменить сертификат слушателя auth без простоя:

  1. Положите старый и новый конечные сертификаты в список на каждом edge и перезапустите их.
  2. Переключите auth на новый сертификат и перезапустите его.
  3. Когда у каждого edge новый список, удалите старый элемент.

edge читает файлы при старте, поэтому после замены файла нужен перезапуск. Старая форма trusted-certificates = "/path" больше не разбирается: оберните значение в [...].

Что дальше