Если вам понравилась эта статья, вы можете стать спонсором на Boosty.
В предыдущих статьях мы с вами поговорили о том, как создавать и восстанавливать пароли по заданной нами политике, организовать автоматизированную регистрацию пользователей. В настоящей статье поговорим о настройке двухфакторной аутентификации, причем настроим ее таким образом, чтобы все пользователи были вынуждены настраивать в обязательном порядке двухфакторную аутентификацию. Я расскажу, как настроить аутентификацию с помощью TOTP кодов и WebAuthn приложений, а также настроим passwordless login.
Самая безопасная аутентификация - это аппаратные ключи вроде YubiKey, но это дорогое удовольствие, всегда надо иметь запасной ключ на случай утери первого, и у меня, к сожалению, нет такого оборудования для демонстрации. А сервис компании Cisco Duo на дату написания статьи на территории РФ временно не работает.
На сайте уже опубликована статья, посвященная различиям TOTP, WebAuthn и Passwordless Login. Ознакомиться с ней можно по ссылке. Поэтому я предполагаю, что вы знаете, что такое TOTP, WebAuthn и Passwordless Login.
Прежде всего необходимо отметить, что в этой статье я описываю автоматизацию процесса, с моей точки зрения это наиболее оптимальный вариант. Но в то же время все можно сделать вручную. Для этого каждый юзер переходит в личные настройки, нажав значок шестеренки в верхнем правом углу, выбирает раздел MFA Devices > Enroll

В ниспадающем меню выбираем TOTP или WebAuthn устройство и дальше следуем инструкциям.

Мы сделаем то же самое, но на глобальном уровне, таким образом, что любой пользователь Authentik обязан будет настроить двухфакторную аутентификацию. Для правильной работы TOTP кодов у вас должно быть установлено любое удобное вам приложение аутентификатор: Google Authenticator, Vaultwarden, Bitwarden, Яндекс.Ключ или даже Kaspersky Password Manager. Выбирайте наиболее удобное и комфортное решение для вас. Для WebAuthn и Passwordless Login подойдет любое устройство со входом по отпечатку пальца или Windows Hello (уверен, что аналог на Маке тоже работает). Сам я пользуюсь связкой Vaultwarden + Google Authenticator + Windows Hello. Все действия я выполняю из-под аккаунта администратора.
Настройка TOTP кодов#
В принципе, как и в предыдущих статьях, мы можем с вами создать все необходимые потоки с нуля. Но для упрощения давайте воспользуемся дефолтным потоком.
Переходим в Flows and Stages > Flows > default-authentication-flow. В default-authentication-flow переходим в Stage Bindings.
В настоящий момент наши этапы выглядят следующим образом

Теперь нам надо внести изменения в дефолтный этап default-authentication-mfa-validation. Дело в том, что он есть в списке этапов потока default-authentication-flow, но не настроен и не работает. Не беспокойтесь, мои юные зрители, сейчас мы это исправим.
В появившемся списке в разделе not configured action выбираем force the user to configure an authenticator. Тем самым мы принудительно заставим пользователя использовать двухфакторную аутентификацию. В появившемся меню configure stages выбираем TOTP Authenticator Setup Stage и жмем Update.

Мое личное мнение, что у админа должно быть несколько вариантов двухфакторной аутентификации на случай отказа одного из вариантов.
Теперь выходим из нашего аккаунта (крайне желательно все делать в браузере в режиме инкогнито во избежание последующего удивления, почему ничего не работает). Заходим заново под нашей учетной записью, и после того как мы введем наш логин и пароль, нас поприветствует окно регистрации устройства с TOTP. Сканируем QR-код смартфоном в приложении для TOTP-кодов, вводим полученный шестизначный код. Все, устройство зарегистрировано. Теперь при каждом логине, после введения логина и пароля нам надо будет ввести 6-значный код из нашего приложения аутентификатора.

6-значный код, который генерирует приложение на смартфоне, действует, как правило, 30 секунд. Поэтому крайне важно, чтобы время было точным и на смартфоне, и на сервере с Authentik - лучше всего с автоматической синхронизацией по NTP. Причем дело именно во времени, а не в часовом поясе: TOTP считается от универсального времени (UTC), так что разные часовые пояса на устройствах ему не мешают, а вот часы, убежавшие на минуту, - мешают. В противном случае при рассинхронизации устройств есть риск, что ваш код устареет до того, как вы попробуете ввести его в Authentik.
Настройка WebAuthn#
WebAuthn (Web Authentication API) - это стандарт от W3C и FIDO Alliance, который позволяет входить в систему с помощью криптографических ключей, встроенных в устройство. Это отпечаток пальца, Windows Hello, Face ID и т.д.
На самом деле весь порядок действий абсолютно идентичен тому, что мы с вами делали с TOTP, кроме одного момента.
Переходим в Flows and Stages > Flows > default-authentication-flow. В default-authentication-flow переходим в Stage Bindings, вносим изменения в дефолтный этап default-authentication-mfa-validation. К существующему TOTP добавляем WebAuthn Authenticator Setup Stage.

В разделе not configured action оставляем force the user to configure an authenticator.
Выходим из-под аккаунта, и теперь, когда мы с вами попробуем зайти с нашего мобильного устройства или компа с помощью отпечатка пальца или лица, то у нас будет выбор: TOTP или WebAuthn. Обратите внимание, что если на вашем аккаунте уже зарегистрирован какой-то из вариантов “двухфакторки”, то у вас не будет списка, из которого нужно выбрать метод аутентификации, так как вы уже сделали выбор в пользу какого-то одного метода раньше. Поэтому если хотите добавить еще один вариант к уже существующему, то тут уже придется руками добавлять в настройках пользователя. Теперь, в следующий раз у вас уже будут варианты “двухфакторки” на выбор.
Passwordless Login#
Как я указывал выше, на сайте есть статья, рассказывающая об особенностях passwordless login и почему не надо противопоставлять webauthn и passwordless login. Конкретно в нашем случае Passwordless login позволит нам не вводить логин и пароль, а потом сканировать отпечаток пальца или лицо, а сразу сканировать. Скан выступает как подтверждение и логина, и пароля.
Для настройки passwordless login обязательно предварительно настроить WebAuthn метод входа.
Переходим в Flows and Stages > Flows > Create.
Создаем новый поток. Задаете имя потока, которое вы считаете подходящим. В качестве Designation выбираем Authentication и Create

В разделе Flows кликаем на наш новый flow > Stage Bindings > Create and bind stage > Authenticator Validation Stage

Next. Опять задаем имя нашему этапу. В разделе Device Classes выбираем WebAuthn. Это нужно, потому что пока есть поддержка только ключей безопасности, типа Yubikey, или биометрии.
В разделе not configured action оставляем force the user to configure an authenticator.

Опускаемся немного вниз и в поле WebAuthn User verification выбираем тот вариант, который нужен именно вам. Я выбираю User verification must occur. В разделе Configuration Stages выбираем WebAuthn Authenticator Setup Stage.

Жмем Next и в следующем меню выбираем порядок исполнения этапа и evaluate when stage is run.

Это еще не все. Теперь нам надо привязать существующий этап входа в систему.
Bind existing stage, выбираем default-authentication-login и порядок выполнения этого этапа, который в обязательном порядке должен исполняться после созданного в этом разделе нового этапа. Обязательно выбираем evaluate when stage is run, затем Create

Переходим во Flows > default-authentication-flow > Stage Bindings > default-authentication-identification > Edit Stage. Идем в самый низ и в качестве Passwordless flow выбираем созданный поток, в моем случае passwordless-web-authn > Update.

Выходим из приложения, теперь все зависит от того, за каким устройством вы сидите. Если за ноутбуком, то вам предложат вставить USB-ключ, спокойно жмете cancel и дальше выбираете тот метод, который вы предпочитаете. То же самое с мобильными устройствами. В любом случае у вас в окне входа в приложении появилась новая кнопка по использованию ключа.

Начиная с Authentik 2025.12 есть и более простой вариант - passkey autofill. Браузер сам предлагает войти по ключу прямо в поле логина, без отдельной кнопки и без отдельного потока. Для этого в default-authentication-identification в поле WebAuthn Authenticator Validation Stage указывается этап проверки с разрешенным классом устройств WebAuthn. Условия: Authentik должен открываться по HTTPS (что за Traefik и так выполняется), браузер должен поддерживать эту функцию, а ключ - быть зарегистрирован как passkey (discoverable credential) на том же домене. Подробности - в документации Authentik.





