Security — Versola Docs
/docs
До 1.00.7.5versola.ioGitHub

Security

Справочник по странице Security консоли администратора — методы входа, одноразовые коды, passkey, регистрация, step-up, брендинг, сессии, токены и ключи, выход и лимиты попыток для тенанта

Страница Security с заголовком Sign-in and security хранит настройки тенанта, которые auth читает при входе пользователя и выпуске токенов. Сначала выберите тенант в боковой панели: все настройки на странице относятся к нему. Тексты одноразовых кодов лежат на странице OTP templates, типы authorization_details — на странице Authorization details, а политика паролей, которая действует на все развертывание, — в System settings.

Перед началом

Что нужноРазрешение
Открыть страницуsecurity:read
Менять карточкиsecurity:manage

Без security:manage страница доступна только для чтения: кнопок Edit нет.

Центральный сервис хранит настройки, а auth загружает их через синхронизацию конфигурации, поэтому сохраненное изменение доходит до auth после очередного обновления, а не мгновенно. Все, что описано на этой странице, действует в auth; edge эти настройки не читает. Тенант, созданный в консоли, получает значения по умолчанию из таблиц ниже.

Как устроена страница

Страница — колонка карточек. Каждая карточка показывает одну группу настроек и имеет свою кнопку Edit. Рейка слева с заголовком On this page переходит к нужной карточке; при ширине меньше 1200 px она превращается в выпадающий список. В заголовке два бейджа: ID тенанта и его профиль безопасности (FAPI 2.0 или Standard).

Заголовок рейкиКарточки
Sign-inSign-in methods, One-time codes, Passkeys (WebAuthn), Registration, Step-up (ACR vocabulary), Branding
Sessions & tokensSessions, Tokens & keys, Logout
ProtectionSubmission limits и карточка Security profile только для чтения
Security, режим чтения с рейкой разделов
Страница Sign-in and security тенанта: слева рейка разделов, справа по карточке на группу, от Sign-in methods до Submission limits, у каждой кнопка Edit; последняя — фиксированная карточка Security profile.

Edit открывает группу на отдельной странице с заголовком вроде Edit sessions и кнопками Cancel и Save sessions внизу. Сохранение отправляет только настройки этой группы, поэтому оно не перезаписывает то, что другой администратор тем временем изменил в другой группе. Двое администраторов, правящих одну и ту же группу, по-прежнему перезаписывают друг друга: побеждает последнее сохранение. Первое сохранение для тенанта, у которого еще нет настроек, создает всю запись со значениями по умолчанию. Если выйти со страницы редактирования с несохраненными правками, консоль попросит подтверждение.

У тенанта без настроек страница показывает No security settings yet и кнопку Set up settings, которая открывает Passkeys (WebAuthn). Настройки passkey нужны, чтобы сохранить любую другую карточку, поэтому сначала задайте их.

Sign-in methods

Карточка перечисляет идентификаторы, по которым пользователь может войти, и заголовок с IP клиента.

Edit sign-in methods
Страница Edit sign-in methods: строки регионов телефонов с полями Region, Dial code, Length, Regex и Sign-up, кнопки Add region и Add from presets и выбор Client IP header.

Phone numbers

Каждая строка — одна страна:

КолонкаЧто значитПравило
RegionКод страны по ISO 3166-1 alpha-2, например KZ.Две заглавные буквы, уникален в списке.
Dial codeТелефонный код страны, например +7.+ и от одной до четырех цифр.
LengthСколько цифр идет после кода.От 4 до 14; код и номер вместе — не больше 15 цифр.
RegexРегулярное выражение Java, которому цифры после кода должны соответствовать целиком.Должно компилироваться. Пример: 7\d{9}.
Sign-upМожет ли номер этой страны сам создать аккаунт.Флажок. У региона, добавленного вручную, выключен; у региона из пресета включен.

По умолчанию список пуст: на вход принимается любой номер E.164, а по телефону никто не регистрируется. Регионы могут делить один код: у KZ и RU оба +7, а regex — 7\d{9} и 9\d{9}. Номер принимается, если его длина и regex подходят хотя бы одному региону. Тенант с обоими регионами принимает номера +77… и +79…, только с RU — +79…, только с KZ — +77…. Кнопки ↑ и ↓ двигают строку; порядок строк — порядок, в котором форма входа показывает коды. В режиме чтения каждый регион показан тегом вроде KZ +7 · 10 digits, а регионы, разрешающие регистрацию, перечислены в одном теге sign-up:.

+ Add region добавляет пустую строку. Add from presets открывает Add countries — список готовых стран (код, телефонный код, длина и шаблон номера). Отметьте нужные, найдите их по названию, коду или телефонному коду и подтвердите Add selected: они добавятся в конец списка с включенным Sign-up, а уже перечисленная страна пропускается. Чтобы закрыть регистрацию для страны, снимите Sign-up в ее строке. Шаблоны пресетов намеренно свободные, кроме KZ и RU; чтобы сузить шаблон, отредактируйте строку. auth проверяет, что номер настоящий для своей страны.

Номера телефонов хранятся и сравниваются в каноническом виде E.164, и список проверяется именно по нему: +787011234567 (с национальным префиксом «8» после кода страны) до проверки превращается в +77011234567. Тот же список действует на login_hint с номером телефона. Central отвечает 400 на сохранение, в котором список нарушает правило выше.

На форме входа список определяет, что видит пользователь:

  • Регионов нет: обычное поле телефона, номер вводится с +.
  • Один код (один регион или несколько с общим кодом): код показан перед полем номера и не меняется.
  • Несколько кодов: выбор из уникальных кодов в порядке списка. Начиная с шести кодов в выборе есть поиск по названию страны, коду ISO и телефонному коду. Если вставить номер, начинающийся с +, код выбирается сам.

Форма проверяет номер до отправки, и auth проверяет его еще раз, поэтому запрос в обход формы тоже отклоняется.

Email

Адреса email принимаются на вход у любого тенанта; карточка лишь показывает режим регистрации, который задается в Registration.

Client IP header

Header — имя HTTP-заголовка, в котором ваш reverse proxy передает настоящий IP клиента. auth использует его для ограничения по IP и берет первое значение, если в заголовке список через запятую. По умолчанию X-Real-IP. В списке есть X-Real-IP (nginx), X-Forwarded-For (other proxies) и Custom…. Свое значение не может быть пустым. Если заголовка в запросе нет, у auth нет IP, по которому можно считать лимит.

One-time codes

Карточка показывает длину генерируемого кода и сколько пользователь ждет, прежде чем запросить новый. Текст сообщения лежит на странице OTP templates.

Edit one-time codes
Страница Edit one-time codes с полем Code length и полем длительности Resend after.
ПолеЗа что отвечаетПо умолчаниюДиапазон
Code lengthЧисло цифр в одноразовом коде.6От 4 до 10.
Resend afterСколько пользователь ждет, прежде чем запросить новый код.1 min (60 s)Не меньше одной секунды.

Длительности на этой странице вводятся числом и единицей: seconds, minutes, hours или days. В режиме чтения карточка показывает их кратко, например 15m или 1d; полное значение в секундах видно во всплывающей подсказке.

Passkeys (WebAuthn)

Edit passkeys
Страница Edit passkeys: Relying party ID, Relying party name, User verification и список Allowed origins.
ПолеЗа что отвечаетПо умолчанию
Relying party IDДомен, к которому привязаны passkey, например example.com. Обязательное.Домен идентификации, заданный при bootstrap; пусто, если не задан.
Relying party nameИмя, которое пользователь видит в запросе passkey. Обязательное.Versola
User verificationДолжен ли аутентификатор проверять пользователя (PIN, биометрия): Required, Preferred или Discouraged.Preferred
Allowed originsПолные origin, которым разрешено использовать эти passkey, например https://example.com. Нужен хотя бы один, каждый — абсолютный URL http или https.Origin, заданные при bootstrap; пусто, если не заданы.

Пока relying party ID, имя или список origin пусты, консоль не дает сохранить группу. Passkey, зарегистрированный для одного relying party ID, не работает под другим, поэтому на работающей системе Relying party ID меняйте осторожно.

Registration

Карточка хранит правило для email и роли нового аккаунта. Новый тенант начинает с Closed для email и с ролью user. Регистрация решается для всего тенанта; у клиента для нее нет переключателя. Номер телефона регистрируется, когда у его региона включен Sign-up, а email — по режиму ниже, через какой бы клиент ни пришел пользователь. Тенант без регионов пускает любой номер на вход, но не регистрирует ни один номер телефона.

Edit registration
Страница Edit registration: режим Email registration, список доменов, флажок для субадресов и выбор ролей по умолчанию.
ПолеЧто задаетПо умолчаниюПравило
Email registrationКто может создать аккаунт с email. Closed: никто, существующие аккаунты входят как раньше. Open: любой адрес, кроме перечисленных доменов. Allowlist: только перечисленные домены.ClosedОдин из трех вариантов.
Blocked domains (Open) или Allowed domains (Allowlist)Список доменов, по одному в строке. example.com совпадает только с этим доменом; *.example.com — с его поддоменами, но не с example.com. Юникодные имена хранятся в punycode.пустоДо 500 записей, без повторов. В Allowlist с пустым списком не регистрируется никто. В Closed список игнорируется.
Block addresses with + = # (sub-addresses)Отклонять локальную часть вроде user+tag@ — дешевый способ получить много адресов для одного ящика. При выключенном флажке a+tag@example.com — тот же аккаунт, что a@example.com.выключено
Default rolesРоли, которые получает каждый самостоятельно зарегистрированный аккаунт, каким бы credential он ни регистрировался.userМинимум одна, отмечаются из ролей тенанта. Пока открыта хоть какая-то регистрация, Central отклонит роль, которой нет в тенанте.

Какие клиенты предлагают регистрацию, определяет их вход. Клиент, у которого первый экран просит email или телефон и не просит рядом логин или пароль, предлагает регистрацию, когда тенант разрешает этот credential. Новый пользователь подтверждает адрес одноразовым кодом и, если вход клиента требует пароль, задает его. Адрес, который тенант не разрешает регистрировать, или уже зарегистрированный идет по обычному пути входа и ничего не узнает об аккаунте.

Роль из Default roles удалить нельзя. Central отвечает 409, а консоль делает действие удаления этой роли неактивным, пока вы не уберете ее из списка. В режиме чтения роли по умолчанию показаны ссылками на роль.

Warning: Регионы заменили прежний список префиксов телефонов (allowedPrefixes), а сохраненные префиксы не переносятся: префикс не задает ни длину, ни шаблон. Тенант, у которого были префиксы, принимает любой номер на вход и не регистрирует ни один номер телефона, пока вы не добавите регионы с включенным Sign-up. Переключатель саморегистрации у клиента тоже убран, а его содержимое при миграции настроек переехало сюда: тенант, у которого был клиент с регистрацией по email, начинает с Open (ничего не блокируется), остальные тенанты — с Closed, а Default roles — это роли, которые выдавали эти клиенты. Регистрация теперь задается для тенанта, поэтому каждый клиент такого тенанта, который входит по email, теперь дает любому зарегистрироваться. Проверьте режим до обновления.

Step-up (ACR vocabulary)

Карточка сопоставляет имена ACR факторам аутентификации, которые они требуют. Клиент запрашивает ACR параметром acr_values. В каждой строке — имя ACR (например, company_mfa) и флажки факторов otp, password и passkey. Нужны имя, которое не повторяется, и хотя бы один фактор, иначе консоль не даст сохранить. По умолчанию записей нет. Те же имена доступны как варианты Step-up ACR у ресурсов, см. Ресурс.

Edit step-up (ACR)
Страница Edit step-up: по строке на значение ACR и флажки факторов otp, password и passkey.

Branding

Branding хранит логотип, который показывается без подложки над карточкой входа клиентов этого тенанта, и favicon его страниц входа: вход, одноразовый код, пароль, согласие и экраны ошибок. Это пара файлов, по одному на каждую цветовую схему:

ПолеРисунокКогда показывается
Logo for the light scheme (dark artwork)Темный рисунокСтраница в светлой цветовой схеме.
Logo for the dark scheme (light artwork)Светлый рисунокСтраница в темной цветовой схеме.

Карточка показывает каждый файл на светлой и на темной подложке. Страница следует выбору посетителя Auto, Light или Dark, поэтому логотип переключается вместе с ней. Если пары нет, экраны показывают словесный знак Versola; так же — если не загрузился любой из двух файлов. Favicon следует схеме самого браузера: светлый файл в светлом браузере, темный — в темном.

Branding, режим чтения
Карточка Branding: адреса светлого и темного файлов логотипа Acme и оба файла на светлой и темной подложке.
Логотип тенанта над карточкой
Экран входа по номеру телефона с логотипом Acme над карточкой вместо словесного знака Versola
ПравилоПодробности
Оба или ни одногоТолько один файл не принимается: один файл на обе схемы пропал бы на странице другой. Консоль пишет The logo needs both a light and a dark file, or neither.; Central отвечает 400 с текстом logoLight and logoDark must be set or cleared together.
URLАбсолютный URL http или https с хостом. Консоль обрезает пробелы по краям; Central отклоняет все остальное с текстом logoLight and logoDark must be absolute HTTP(S) URLs.
ФорматРекомендуется SVG; PNG и WebP тоже подходят. Файл показывается как картинка, поэтому скрипты внутри SVG не выполняются.
Текст в SVGПереведите текст в контуры. Шрифты внутри картинки не загружаются, поэтому живой текст заменится шрифтом по умолчанию.
Без логотипаОчистите оба поля. Страницы, не принадлежащие известному клиенту (страница выхода, открытая без client_id), тенанта не имеют и показывают словесный знак Versola.

По умолчанию пусто. Развертывание, обновленное с релиза с одним общим логотипом, начинает с этого файла в обоих полях каждого тенанта; замените его настоящей парой.

Sessions

Edit sessions
Страница Edit sessions: длительности Sign-in conversation и SSO session, флажок Idle timeout и длительность Remembered device.
ПолеЗа что отвечаетПо умолчаниюДиапазон
Sign-in conversationСколько живет незавершенный вход (цепочка challenge для одного запроса авторизации).15 min (900 s)Не меньше 1 s.
SSO sessionСколько действует cookie SSO-сессии после аутентификации, даже если пользователь активен.1 dayНе меньше 1 s.
Idle timeoutOnline-сессии (без offline_access) истекают после такого простоя. Таймер сдвигается при каждой тихой повторной аутентификации. Включается флажком End the session when it is not used for a while.выключеноЕсли включено — не меньше 1 s и меньше срока SSO-сессии.
Remembered deviceСколько запоминается знакомое устройство (user agent), прежде чем его нужно проверить заново. Показывается в записи пользователя как Devices.180 daysНе меньше 1 s.

У тенанта с профилем FAPI 2.0 на странице есть еще заблокированная заметка Rule set by the profile: access-токены привязаны к отправителю (DPoP или mTLS).

Tokens & keys

Edit tokens & keys
Страница Edit tokens & keys: выбор ключа подписи и срок client assertion, флажок DPoP nonce и флажок взаимного TLS с заголовком сертификата и кодировкой.

Signing key

Signing key выбирает ключ JWKS, которым подписываются access-токены, ID-токены и logout-токены этого тенанта. В списке только ключи, для которых Central хранит закрытую часть, в виде kid · algorithm. Ключи, опубликованные только для проверки, в списке не появляются. Ключи генерируются на странице Keys & metadata; карточка в режиме чтения ссылается на выбранный ключ там.

ВариантРезультат
Ключ из спискаauth подписывает этим ключом. Central проверяет ключ при сохранении.
Auth service’s configured keyНастройка пуста. auth подписывает закрытым ключом из собственной конфигурации jwt.private-key, с тем алгоритмом, который у этого ключа есть (RSA или EC; свежесгенерированное развертывание хранит ключ EC P-256, то есть ES256).

Новый тенант получает предпочтительный из доступных для подписи ключей: сначала PS256, потом ES256, при равенстве — с наибольшим kid. Если такого ключа нет, тенант работает на настроенном ключе. Ключи RS256 в списке только у тенанта с профилем безопасности Standard. На тенанте FAPI 2.0 Central их отклоняет (Key '<kid>' signs RS256 ... Select a PS256 or ES256 key instead). Профиль фиксируется при создании тенанта, см. Профили безопасности. Еще отказы бывают для неизвестного kid и для ключа «только для проверки».

Чтобы перевести развертывание, подписывающее RSA-ключом, на ES256, сгенерируйте ключ ES256 и выберите его здесь; шаги — на странице Keys & metadata.

Когда вы переводите тенант на только что созданный ключ, auth начинает подписывать им лишь после синхронизации. До этого он продолжает подписывать прежним ключом, так что выпуск токенов не прерывается.

Client assertion lifetime

Client assertion lifetime ограничивает, насколько далеко в будущем client assertion для private_key_jwt может поставить exp (RFC 7523). auth помнит jti каждого assertion до его истечения, поэтому больший срок стоит места в хранилище, а меньший отклоняет клиентов, которые выпускают долгоживущие assertion.

По умолчаниюДиапазон
5 min (300 s)От 30 s до 15 min. Консоль и Central отклоняют значение вне диапазона.

DPoP

Require a DPoP nonce on every proof требует, чтобы каждое DPoP-доказательство от клиентов этого тенанта к /token и /userinfo содержало nonce, выданный сервером (RFC 9449, раздел 8). На запрос без nonce сервер отвечает use_dpop_nonce и свежим nonce в заголовке DPoP-Nonce, и клиент должен повторить запрос. Карточка в режиме чтения пишет Required on every proof или Not required. По умолчанию выключено.

Включайте, только когда все DPoP-клиенты тенанта умеют повторять запрос после use_dpop_nonce: клиент без этого перестанет получать и обновлять токены. Клиенты без DPoP не затрагиваются. Выключение действует сразу и ничего не ломает. Настройка относится только к собственным endpoint auth; вызовы через edge подчиняются собственной настройке DPoP Nonce этого edge на экране Edges. См. Токены с привязкой к отправителю.

Mutual TLS

Флажок Mutual TLS — This tenant’s reverse proxy terminates mutual TLS — сообщает auth, что прокси перед этим тенантом запрашивает клиентский сертификат и передает его в заголовке. Когда флажок включен, выберите, где приходит сертификат:

ПолеЗначение
Certificate headerЗаголовок, который ставит прокси. Пресеты: ssl-client-cert (nginx / ingress-nginx, PEM в URL-кодировании) и X-Forwarded-Tls-Client-Cert (Traefik, DER в Base64). Custom… показывает Header name и Encoding.
Encoding (только для своего заголовка)URL-encoded PEM (urlEncodedPem) или Base64-encoded DER (base64Der).

Для этого заголовка нет стандарта, поэтому оба значения должны точно совпадать с настройкой вашего прокси. Заголовок и кодировка сохраняются вместе; при выключенном флажке очищаются оба, а карточка в режиме чтения пишет Not terminated by the reverse proxy. По умолчанию выключено.

Warning: Central откажется регистрировать клиента с mTLS-субъектом, пока у тенанта не задан заголовок сертификата. Ошибка: mtlsAuth needs the client's tenant to set mtlsCertificateHeader - without it no certificate ever reaches auth for this client. Это относится к Web app, созданному в мастере (сертификат выдает edge, а Central записывает субъект), и к любому клиенту, которого переключили на credential mTLS. Mobile or desktop app за edge исключен: он обращается к auth на отдельном mTLS-слушателе, который читает сертификат из рукопожатия, и заголовок не нужен. Включите Mutual TLS и сохраните, прежде чем создавать такого клиента. См. Клиент и Токены с привязкой к отправителю.

Logout

Post-logout redirect URIs — список адресов, на которые /logout может отправить пользователя после выхода. Relying party должна передать один из них символ в символ как post_logout_redirect_uri (OpenID logout). Каждая запись проходит ту же проверку, что и redirect URI клиента; отклоненная запись блокирует сохранение, а в ошибке указано, какая именно. По умолчанию пусто, поэтому ни одна relying party не может его запросить.

Edit logout
Страница Edit logout со списком post-logout redirect URI и кнопкой добавления.

Submission limits

Submission limits ограничивают повторные попытки. В режиме чтения каждая категория показана плашками вроде 5 per 15m или No limit, плюс длительность блокировки.

Edit submission limits
Страница Edit submission limits: окна попыток для OTP request, OTP submit, Password submit и Passkey assertion и длительность блокировки.
ПолеЗначение
Ban durationСколько пользователь заблокирован после превышения самого длинного окна. 0 — не блокировать никого.
OTP request, OTP submit, Password submit, Passkey assertionВ каждой категории одно или несколько окон: максимум попыток за длину окна.

Блокировку запускает только самое длинное окно категории. Более короткие окна отвечают немедленным ограничением частоты. Оба числа окна не меньше 1. Значения по умолчанию для тенанта, созданного в консоли:

КатегорияОкнаДлительность блокировки
OTP request2 за 60 s, 5 за 3600 s1800 s для всех категорий
OTP submit3 за 120 s, 5 за 3600 s
Password submit5 за 900 s, 10 за 3600 s
Passkey assertion5 за 300 s, 10 за 3600 s

Категория без единого окна не ограничивается вообще. Если у тенанта в auth нет строки настроек, применяются значения из таблицы. Пользователя, попавшего под лимит, можно освободить кнопкой Reset Limits на его карточке, см. Пользователь.

Security profile

Последняя карточка, Security profile, только для чтения и помечена Fixed: профиль выбирается при создании тенанта. Она сообщает, что тенант FAPI 2.0 (для каждого клиента обязательны PAR, PKCE S256 и токены с привязкой к отправителю) или Standard (клиенты сами выбирают защиту). См. Тенант и Профили безопасности.

Что дальше