Что вы реализуете сами
- Составьте список сетей. Диапазоны офиса и пул адресов VPN, IPv4 и IPv6. Включайте только сети, доступ к которым вы контролируете: управляемое устройство, подключение к VPN, пропуск в здание.
-
Ограничьте
/connect/authorizeна прокси. Вход начинает только этот маршрут. Пример для NGINX с условными диапазонами. Добавьте этот блок рядом с конфигурацией со страницы «За reverse-proxy»:Veriqa принимает этот маршрут в любом регистре и с косой чертой в конце, и блок совпадает с теми же вариантами пути:~*не различает регистр, а/?допускает косую черту. Точныйlocation =пропустил бы/CONNECT/AUTHORIZEчерез общийlocation /. Строка запроса на совпадение не влияет. Если Veriqa стоит под префиксом пути, включите префикс в выражение и разрешите ему повторяться:^(/auth/veriqa)+/connect/authorize/?$. Когда общий блок обрезает префикс, запрос/auth/veriqa/auth/veriqa/connect/authorizeдоходит до Veriqa как/auth/veriqa/connect/authorize, и Veriqa принимает его за этот маршрут. Регулярные выражения NGINX проверяет по порядку, поэтому поставьте этот блок перед остальными блокамиlocation ~. Проверьте, что этот путь не покрывает блокlocation ^~илиlocation =: тогда NGINX регулярные выражения не проверяет. В этом блокеproxy_passпередаёт путь без изменений, потому что внутриlocationс регулярным выражением NGINX не принимает URI вproxy_pass. Veriqa принимает и путь с префиксом, даже если ваш общий блок префикс обрезает. Адрес укажите тот же, что в общем блоке, например тот жеupstream, чтобы запросы доходили до экземпляров так же, как остальные. -
Остальные маршруты оставьте открытыми. Телефон открывает страницы под
/auth/и/r/через мобильный интернет, мессенджеры вызывают вебхуки под/api/channels/, а ваш бэкенд обращается к/connect/tokenоттуда, где он работает. Страницу входа и её WebSocket открывает браузер, который уже прошёл проверку. Маршрутами под/connect/authorize/callbackпользуется и телефон: например, через них он отправляет форму, которая запрашивает недостающее поле профиля. Поэтому их не ограничивайте; блок выше с ними не совпадает. -
Проверяйте адрес клиента. NGINX сверяет адрес того, кто к нему подключился. Если перед NGINX
стоит балансировщик или CDN, сначала восстановите адрес клиента из заголовка, который они передают, директивами
set_real_ip_fromиreal_ip_headerмодуля realip. Иначе NGINX увидит у всех запросов адрес балансировщика и пропустит или отклонит их все разом. На стороне Veriqa доверие к самому прокси задаёт разделForwardedHeaders— см. шаг 6 самостоятельной установки. -
Объясните человеку отказ. За пределами ваших сетей браузер получает ответ 403. Покажите вместо этого
ответа свою страницу (
error_page 403в том жеlocation), где сказано, что вход работает только из сети офиса или через VPN.
Почему это работает
Пересылка QR-кода начинается с того, что браузер атакующего открывает страницу входа. За пределами ваших сетей этот браузер вместо страницы получает 403, и пересылать нечего. Чтобы начать вход, атакующему нужно устройство внутри сети — в RFC это сказано так: «the attacker needs to have access to a device on the network». В терминах BCP 247 это мера Trusted Networks (RFC 10027 §6.1.8). Список хранится в вашем прокси, а не в Veriqa, поэтому на странице «Veriqa, BCP 247 и модель угроз» эта мера отмечена как не покрытая в ядре, а за тем, что можно сделать уже сейчас, страница ведёт сюда. По тому же списку сетей можно выбирать поверхность в сценарии «Место и личность».На что обратить внимание
- Правило действует на все приложения этого экземпляра Veriqa. Маршрут
/connect/authorizeу них общий. Какое приложение начинает вход, прокси узнаёт только из параметра запросаclient_id. Записать этот параметр можно по-разному, поэтому правило прокси по нему легко обойти. Если один экземпляр Veriqa обслуживает и внутреннее, и публичное приложение, выделите внутреннему свой экземпляр, со своим именем хоста и issuer. - Для приложений, которыми пользуются ваши клиенты, это не подходит. Ваши клиенты входят из сетей, которые вы не контролируете; RFC сам называет это ограничением.
- Сеть надёжна ровно настолько, насколько защищён доступ к ней. Гостевой Wi-Fi в том же диапазоне, личное устройство в VPN или вредоносная программа на офисном компьютере уже внутри. RFC советует сочетать эту меру с другими (§6.1.8, SHOULD), например со сценарием «Passkey вместе с Veriqa».
- Удалённая работа — через VPN. Сотрудник вне офиса входит только с включённым VPN, и сбой VPN останавливает и его вход.