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

Аутентификация в эпоху SaaS и облачных сервисов


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

Аутентификация подразумевает подтверждение достоверности того, что вы являетесь тем, кем представились. В прошлом для этого использовались ID и пароли. Сегодня же более популярным способом стало применение магических ссылок, мульти-факторной аутентификации и прочих методов, хотя, по сути, процесс не изменился.

Раньше за аутентификацию отвечала операционная система, авторизующая пользователя после предоставления пароля. Однако в течение последних 15 лет по мере перехода в эпоху SaaS и облачных структур, это изменилось. В первом поколении облачных и SaaS-приложений этот процесс пришлось изобретать заново, поскольку здесь у нас уже не было операционной системы, которая бы проверяла подлинность пользователя.

За эти 15 лет представители индустрии совместными усилиями разработали стандарты аутентификации вроде OAuth2, OpenID connect и SAML. Мы также начали использовать JWT и прочие инструменты. Сегодня никому уже не нужно создавать систему авторизации, если он сам того не захочет, поскольку на то существует множество сервисов.

В целом можно сказать, что мы успешно перенесли проверку подлинности пользователей из локальных сред в сферу облачных SaaS-решений.

А вот авторизация в облако не переехала. По своей сути, авторизация, иначе называемая контроль доступа, подразумевает определение, что вам дозволено видеть и делать после входа в учётную запись. В отличие от аутентификации эта задача ещё далеко не решена.

Проблема в том, что для авторизации не существует единых стандартов индустрии. Вы можете применять некие модели вроде контроля доступа на основе ролей (RBAC) или атрибутов (ABAC), но стандартов здесь нет, поскольку авторизация – это задача, решаемая в различных предметных областях. В этой сфере также не существует каких-либо специализированных разработчиков или сервисов. Вот вы можете представить себе использование для авторизации Twilio или Stripe? А поскольку не существует ни стандартов, ни заточенных под это сервисов, компании теряют гибкость из-за необходимости тратить время на создание собственных систем авторизации, преодолевая все сопряжённые с этим трудности.

Здесь также необходимо учитывать затраты. Во сколько вам обойдётся время, которое вы будете вынуждены вложить не в наращивание предлагаемой вашим бизнесом ценности, а в разработку и обслуживание собственной системы контроля доступа? А когда компании берутся реализовывать это самостоятельно, то зачастую получается у них это не особо удачно. Именно поэтому слабые места в системах контроля доступа лидируют в списке 10 наиболее распространённых уязвимостей, составленном открытым проектом по обеспечению безопасности веб-приложений (OWASP).

Похоже, что мы сами забрались в очень глубокую кроличью нору, откуда теперь нам предстоит усердно выбираться.

Облачная авторизация


Давайте разберём, как мы вообще к этому пришли. Всего произошло три перехода, которые повлияли на мир ПО в целом и на технологии авторизации в частности:

  1. Переход к SaaS: этот переход успешно прошла аутентификация, но не контроль доступа. Если попытаться понять, почему, то мы увидим, что в прошлом, когда приложения взаимодействовали лишь с ОС, у нас был каталог вроде LDAP. В этом каталоге находились группы, по которым распределялись пользователи. Эти группы обычно сопоставлялись с ролями в приложении, и всё было довольно просто. Сегодня же у нас нет операционной системы или глобального каталога, к которому можно было бы обратиться, поэтому процесс авторизации приходится встраивать в каждое приложение.
  2. Появление микросервисов: мы пережили архитектурный переход от монолитных приложений к микросервисам. Во времена монолитов авторизация осуществлялась в одно время и в одном месте кода. Сегодня же мы имеем множество микросервисов, каждому из которых необходимо выполнять собственную авторизацию. Нам также приходится продумывать взаимодействие этих процессов между микросервисами, чтобы допускались лишь правильные модели таких взаимодействий.
  3. Принцип нулевого доверия: изначальный подход безопасности, основанный на защите периметра, был заменён системой защиты с нулевым доверием. Этот переход привёл к перекладыванию большого объёма ответственности со среды на приложение.

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

Пять лучших практик облачного контроля доступа


▍ 1. Специализированный сервис авторизации


Сегодня каждый сервис выполняет свою собственную авторизацию. И если этот процесс должен реализовываться всеми микросервисами, то в каждом случае он будет несколько отличаться. Поэтому, когда вы хотите изменить поведение авторизации во всей системе, вам нужно подумать о том, как следует обновить каждый микросервис, а также учесть логику его работы. Однако по мере добавления в систему всё большего их числа этот процесс становится весьма хлопотным.

В качестве лучшей практики здесь мы рассматриваем извлечение логики авторизации из микросервиса и создание специализированного микросервиса, который будет отвечать конкретно за неё.

В последние пару лет крупные организации начали публиковать работы, описывающие принцип действия их специализированных систем авторизации. Всё началось с публикации Google Zanzibar, в которой рассказано о создании такой системы для Google Drive и других сервисов. За Google последовали и другие компании, которые описали разработку своих специализированных сервисов авторизации и окружающих их распределённых систем. Речь идёт о таких инструментах, как AuthZ компании Intuit, Himeji ресурса Airbnb, AuthZ платформы Carta и PAS компании Netflix. Теперь мы начинаем анализировать их опыт и применять его в собственном ПО.

▍ 2. Детальный контроль доступа


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

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

▍ 3. Управление доступом на основе политик


Третий антипаттерн – это реализация контроля доступа в виде спагетти-кода, то есть, когда разработчики беспорядочно раскидывают инструкции switch и if по всему коду, управляющему логикой авторизации. Это плохой подход, который создаёт массу трудностей, когда нам нужно изменить способ осуществления авторизации по всей системе.

Лучшей практикой здесь будет поддержание отчётливого разделения обязанностей и хранение логики авторизации в соответствующей политике. Отделяя эту политику от кода приложения, мы гарантируем, что команда разработки будет отвечать конкретно за разработку приложения, а команда безопасности конкретно за его безопасность.

▍ 4. Проверки доступа в реальном времени


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

Рассмотрим в качестве примера сценарий с авторизацией пользователя, которому доступна область «администратор». Эта область встраивается в токен доступа. Теперь, когда пользователь взаимодействует с системой, используя действующий токен с областью «администратор», он получает привилегии администратора. Почему это плохо? Дело в том, что если мы захотим лишить пользователя этой области доступа и сделать её недействительной, то столкнёмся со сложностями. До тех пор, пока пользователь обладает неистёкшим токеном доступа, он сможет использовать все ресурсы, к каким этот токен его предоставляет.

При использовании токенов доступа невозможно реализовать детальную модель управления. Даже если издатель токена видит, к каким ресурсам пользователь имеет доступ, будет непрактичным встраивать эти права в токен. Предположим, у нас есть коллекция документов, и мы хотим дать пользователю разрешение на доступ к одному из них. О каком документе идёт речь? Может, обо всех? Или о нескольких? Очевидно, что такой подход не масштабируется.

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

▍ 5. Централизованные логи решений


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

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

Паттерны детального контроля доступа




Давайте подробнее поговорим о детальном контроле доступа и его появлении.

▍ Списки контроля доступа (ACL)


В далёких 80-х годах операционные системы определяли для файлов и каталогов разрешения вроде «чтение», «запись» и «выполнение». Эти паттерны назывались списками контроля доступа (ACL).

С помощью ACL можно было ответить на такие вопросы, как «Есть ли у Алисы доступ к ‘чтению’ этого файла?»

▍ Контроль доступа на основе ролей (RBAC)


RBAC, или контроль доступа на основе ролей, вошёл в обиход в период между 90-ми и началом 2000-х вместе с появлением каталогов вроде LDAP и Active Directory. Такие каталоги дают возможность создавать группы и добавлять в них пользователей. При этом каждая группа обычно соответствует конкретной роли в приложении. Администратор приписывал пользователя группе, чтобы дать ему нужные разрешения, производя все необходимые манипуляции в одной консоли.

С помощью RBAC можно отвечать на вопросы вроде: «Состоит ли Боб в роли ‘администратор продаж’?»

▍ Контроль доступа на основе атрибутов (ABAC)


Очередным витком развития стал контроль на основе атрибутов (ABAC), и именно здесь мы начали уходить от многокомпонентных ролей в сторону детального контроля доступа. В начале 2000-х и 2010-х мы увидели, как стандарты вроде XACML определяют построение политик детальной авторизации.

Вы могли определять разрешения на основе атрибутов, включая пользовательские атрибуты (например, к какому отделу принадлежит пользователь), атрибуты ресурсов (например, к какому каталогу пользователь пытается получить доступ?) и даже атрибуты среды (например, где географически находится пользователь? Который сейчас день и час?).

С помощью ABAC можно ответить на вопросы вроде: «Состоит ли Мэллори в отделе ‘Продаж’? Находится ли документ в каталоге ‘Продажи’? или «Рабочее ли сейчас время в США?».

▍ Контроль доступа на основе связей (ReBAC)


Последней, но не менее важной является новая модель авторизации, описанная в работе Zanzibar под названием контроль доступа на основе отношений (ReBAC). Согласно этой модели, вы определяете набор субъектов (обычно ваших пользователей или групп) и объектов (например, организаций, каталогов или клиентов). Следом вы также определяете, имеет ли конкретный субъект связь с неким объектом. Например, между пользователем и объектом каталога такими связями будут выступать «наблюдатель», «администратор» или «редактор».

С помощью ReBAC можно отвечать на очень сложные вопросы, перебирая граф отношений, сформированный объектами, субъектами и их связями.

Два подхода к детальному контролю доступа


Вокруг концепции детального контроля доступа сформировалось две экосистемы:

▍ 1. Политика как код


В этой парадигме мы выражаем политики как набор правил, написанных на языке Rego. Она представляет собой продолжение ABAC, и наиболее популярным проектом здесь является Open Policy Agent (OPA).

OPA – это механизм принятия решений общего назначения, который создавался для управления доступом на основе политик и ABAC. Однако у него есть свои недостатки: используемый для написания политик язык – Rego – является производным от языка Datalog, который очень труден для освоения. При этом он также не сгодится для моделирования авторизации в приложении. А поскольку OPA поистине является механизмом общего назначения, вам придётся собирать всё из рудиментарных кирпичиков.

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

Если же оценивать в общем, то OPA является хорошей отправной точкой, но без сложностей здесь не обойдётся.

▍ 2. Политика как данные


В этом случае политика хранится не как набор правил, а является встроенной в структуру данных. Граф связей сам по себе является самодостаточной системой, поэтому заниматься разработкой модели вам не придётся. Здесь у нас есть «субъекты», «объекты» и «связи», что обеспечивает широкую гибкость.

Если ваша модель области выглядит, как Google Drive и несёт в себе каталоги, файлы и пользователей, то именно с этого подхода следует начать. С другой стороны, эта экосистема всё ещё находится на этапе становления и представлена множеством конкурирующих опенсорсных реализаций, в связи с чем будет сложно совместить её с другими моделями авторизации вроде RBAC и ABAC.

Управление доступом на основе политик


Управление доступом на основе политик, как и предполагает название, выносит логику авторизации из кода приложения в политику, действующую автономно.

Вот пример политики, написанной на Rego:



Здесь поистине задействуется принцип наименьших привилегий. Тут мы видим, что, например, в условии allowed, доступ не разрешается, пока у нас не будет достаточно доказательств для его получения. Политика будет возвращать allowed = false, пока мы не предоставим причину для изменения этого равенства на allowed = true. Обратите внимание, что на строке 9 выполняется проверка, относится ли пользователь к отделу "Operations". Если это так, данное условие allowed будет оценено как true.

Далее мы вкратце посмотрим, как выглядит код приложения после извлечения логики
авторизации в политику:



Фрагмент выше – это конечная точка express.js, отвечающая за передачу идентификационных данных пользователя, верифицируемых промежуточной программой с использованием JWT. Если условие allowed политики вернёт true, эта программа передаст запрос следующей функции, если нет – вернёт ошибку 403.

Существует множество причин для выноса логики авторизации из кода приложения. Это позволяет создать отдельный компонент, который можно сохранить и версионировать аналогично коду приложения. Каждая корректировка политики будет становиться частью лога изменений в Git, что позволит нам все эти корректировки отслеживать.

Кроме того, отделяя логику авторизации от кода приложения, мы следуем принципу разделения обязанностей. Команда безопасности сможет заниматься политикой авторизации, а команда разработки – сосредоточиться на приложении. И когда у нас есть отдельный компонент политики, мы можем встроить его в немутабельный образ и снабдить подписью для поддержания безопасной цепочки доставки. Вот ссылка на открытый проект, реализующий как раз эту задачу: https://github.com/opcr-io/policy.

Контроль в реальном времени – это задача распределённых систем


В современных системах авторизации очень важны проверки в реальном времени. Авторизация – это действительно сложная задача, поскольку при верной реализации она становится задачей распределённых систем.

Первая сложность заключается в том, что наш сервис авторизации должен выполнять контроль доступа локально, поскольку он находится на критическом пути каждого запроса приложения. Авторизация выполняется для каждого запроса, который пытается получить доступ к защищённому ресурсу. При этом она требует 100% доступности и должна осуществляться в течение миллисекунд, в связи с чем эту операцию следует выполнять именно локально.

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

Заключение


Облачная авторизация – это сложная задача, которая пока ещё полностью не решена, в связи с чем каждое облачное приложение, по сути, заново изобретает колесо. В статье мы разобрали пять антипаттернов и соответствующие лучшие практики реализации контроля доступа в приложениях в эпоху облачных вычислений:

Во-первых, вам необходимо создавать детальные модели авторизации, используя любой паттерн контроля доступа, будь то RBAC, ABAC, ReBAC или их комбинацию – смотря, что лучше подойдёт вашему приложению или организации.

Во-вторых, нужно разделить ответственности и вынести логику авторизации из кода в политику, которой будет заниматься команда безопасности.

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

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

Наконец, с целью внутреннего контроля следует собирать и хранить логи принятых решений об авторизации.

Telegram-канал с розыгрышами призов, новостями IT и постами о ретроиграх

Комментарии (29)


  1. Exchan-ge
    00.00.0000 00:00

    Для начала разберём различие между аутентификацией и авторизацией.


    А чем они (оба этих понятия) отличаются от идентификации?


    1. Didimus
      00.00.0000 00:00

      Не знаю, правильно ли я понимаю, но примерно так:

      1. На машине висит номер, это идентификация

      2. ГАИ проверяет по своей базе, что этот номер висит на машине с определённым VIN. Это аутентификация

      3. ГАИ проверяет наличие действующих прав и страховки у водителя машины, это авторизация


      1. Exchan-ge
        00.00.0000 00:00

        ГАИ проверяет по своей базе


        Не очень понятна разница между 1 и 2 пунктами.


        1. Didimus
          00.00.0000 00:00

          Вы можете повесить себе чужой номер. Вас идентифицируют как другого

          А вот аутентификацию уже не пройдёте


          1. Exchan-ge
            00.00.0000 00:00

            Вы можете повесить себе чужой номер. Вас идентифицируют как другого
            А вот аутентификацию уже не пройдёте


            См. фильм «ТАСС уполномочен сообщить...» (для справки, конечно :)
            Существует вполне реальная практика использования одинаковых автономеров на разных машинах (и вполне законная) — для проведения ОРМ.


    1. powerman
      00.00.0000 00:00

      Идентификация - способ указать о какой сущности речь. ID-шка, присвоенная юзеру, идентифицирует этого юзера.

      Аутентификация - способ проверки/определения идентификации некоей сущности. Логин плюс пароль юзера позволяют определить его ID. Или ID плюс пароль позволяют проверить что юзер действительно имеет данный ID. Аутентификация без Идентификации бесполезна: если мы как-то проверили что логин и пароль верные, но при этом всё ещё не знаем чьи они, то толку с этой проверки мало.

      Авторизация - как и описано в статье, проверка прав доступа некоей сущности. Авторизация без Аутентификации бесполезна: мы можем проверить, что юзеру А можно делать Б, но если у нас нет уверенности что Б сейчас пытается сделать именно А, то толку с этой проверки мало.


      1. Tarakanator
        00.00.0000 00:00

        Ну почему.
        Если Дед пришёл домой, и орёт: Бабка, дед пришёл, налей мне самогону.
        То Бабка может отказать при авторизации не проводя аутентификацию.


        1. powerman
          00.00.0000 00:00

          Нет, так это не работает.

          Отказ выполнить операцию может быть по самым разным причинам (операция не реализована, сервис перегружен запросами, etc.), так что факт отказа не подразумевает обязательного выполнения авторизации. При авторизации речь идёт о проверке прав доступа, и проверять права только по идентификации без аутентификации нет никакого смысла.


          1. Tarakanator
            00.00.0000 00:00

            Есть. Ничто не запрещает вам проводить аутентификацию и авторизацию параллельно.
            И отказывать в доступе когда придёт только 1 отказ, а не ждать второго.


            1. powerman
              00.00.0000 00:00

              Я сказал, что нет смысла. И его - нет. Возможность так делать - есть, но смысла в ней - нет.

              Делать что-то параллельно имеет смысл для ускорения. Давайте опустим очевидный кейс, когда и аутентификацию и авторизацию выполняет один сервис и тут просто нечего распараллеливать (хотя это довольно частый кейс). Выполнение запросов параллельно подразумевает, что последовательно их делать неприемлемо долго - иначе нет смысла усложнять реализацию параллельными запросами. Но если запрос авторизации выполняется заметное время, значит он использует заметные ресурсы для своего выполнения (напр. лазит в SQL БД). И вот тут получается так, что если мы решим делать этот запрос не дождавшись ответа на проверку аутентификации, то мы открываем возможность DoS-атаки: не аутентифицированные анонимусы из интернетиков могут капитально нагрузить запросами не только наш сервис аутентификации (который обычно пишется с расчётом на это), но и сервис авторизации. В результате - практического смысла параллелить эти запросы всё-таки нет, вреда от этого получится больше, чем пользы.


              1. Tarakanator
                00.00.0000 00:00

                Выполнение запросов параллельно подразумевает, что последовательно их делать неприемлемо долго - иначе нет смысла усложнять реализацию параллельными запросами.

                Снижение времени отклика.

                если 200 рабочих дней на 5 авторизаций в день на 2000 человек. Если экономить каждый раз по 10мс, то сэкономим 5 часов рабочего времени за год.

                Или вот вам реальный кейс когда авторизация заканчивается до аутентификации.
                2х факторная аутентификация. Когда разрешение на VPN подключение проверяется ещё до запроса второго фактора.
                https://multifactor.ru/docs/radius-adapter/windows
                <!-- Разрешать доступ только пользователям из указанной группы (не проверяется, если удалить настройку) -->
                <add key="active-directory-group" value="VPN Users"/>


                1. powerman
                  00.00.0000 00:00

                  Если экономить каждый раз по 10мс, то сэкономим 5 часов рабочего времени за год.

                  Это чушь. На реальной продуктивности сотрудников это не скажется абсолютно никак. А вот создание дыры в виде DoS сервиса авторизации может обойтись довольно дорого.

                  2FA - да, открывает дополнительные возможности оптимизации. Проверять авторизацию после проверки аутентификации по одному фактору не дожидаясь второго - может считаться достаточно безопасным в плане вышеупомянутой DoS-атаки. Но смысла, реального, в этом всё-равно чаще нет. Аутентификация подразумевает наличие юзера, который что-то делает в UI. 2FA подразумевает дополнительные действия в UI. Скорость работы юзера в UI на несколько порядков меньше скорости ответа сервиса авторизации, так что распараллеливание запроса к нему ничего реально полезного не даст, а реализацию усложнит.

                  В перспективе использования хардварных ключей для 2FA, не требующих действий юзера в UI - такое распараллеливание поможет нарисовать красивые бенчмарки, но фактический эффект на реальный UX будет всё-равно не заметен. Точнее, скажу иначе. Эффект может быть заметен, если сервис авторизации заметно тормозит. Но в таком случае намного больший эффект даст его оптимизация, а не распараллеливание запросов на 2FA и авторизацию.


                  1. Tarakanator
                    00.00.0000 00:00

                    Это чушь. На реальной продуктивности сотрудников это не скажется абсолютно никак. 

                    Цифры не врут. курочка по зёрнышку клюёт.

                    Но смысла, реального, в этом всё-равно чаще нет.

                    Да, чаще нет. но мы рассматриваем все случаи.

                    Аутентификация подразумевает наличие юзера, который что-то делает в UI.

                    Ага, подключается к VPN.

                    И в зависимости от авторизации может быть 3 варианта(с точки зрения радиус сервера):
                    не пущать
                    пущать
                    пущать, но только с 2fa

                    Скорость работы юзера в UI на несколько порядков меньше скорости ответа сервиса авторизации

                    нет, сопоставима. аутентификация первого фактора+ авторизация+ отправка пуша через интернет занимает несколько секунд. В случае с SMS может быть ещё дольше... особенно если SMS за границу.

                    В перспективе использования хардварных ключей для 2FA, не требующих действий юзера в UI

                    Это уже не 2fa... и есть у меня trezor model t. Продвинутей некуда. С поддержкой тухло.


                    1. powerman
                      00.00.0000 00:00

                      отправка пуша через интернет занимает несколько секунд

                      Ну вот и я об этом же. Проверять авторизацию параллельно с первым фактором (паролем) опасно (открываем DoS), а параллельно со вторым (SMS etc.) нет смысла (второй занимает столько времени, что на этом фоне задержка на запрос авторизации просто теряется).

                      Это уже не 2fa

                      Почему это? Первый фактор - знание (пароля), второй - владение (USB-ключом/телефоном). Фактор владения может проверяться автоматически, не требуя действий юзера (ключ в USB юзер мог вставить заранее), но он не перестаёт от этого быть 2FA.

                      мы рассматриваем все случаи

                      Ну, если все-все, то можно придумать очень искусственный кейс, когда юзер находится в локалке где и все сервисы (типа, работает в офисе с сервисами своей компании), пароль ему браузер заполняет автоматом и так же автоматом отправляет форму логина, второй фактор это USB-ключ не требующий нажатия кнопок для подтверждения, и при этом сервис авторизации отвечает с задержкой, заметной юзеру невооружённым глазом (от 100ms). Вот в таких условиях распараллеливание запроса на второй фактор аутентификации и на авторизацию может дать заметный эффект в UX. Но, опять же, на мой взгляд и тут намного больше пользы будет от оптимизации скорости ответа сервиса авторизации, нежели от распараллеливания.


                      1. Tarakanator
                        00.00.0000 00:00

                        Ну вот и я об этом же. Проверять авторизацию параллельно с первым фактором (паролем) опасно (открываем DoS), а параллельно со вторым (SMS etc.) нет смысла (второй занимает столько времени, что на этом фоне задержка на запрос авторизации просто теряется).

                        Нам важна абсолютная, а не относительная задержка. Относительную просто заметить легче, а то что она не заметна на глаз ничего не значит.

                        Почему это? Первый фактор - знание (пароля), второй - владение (USB-ключом/телефоном).

                        В перспективе использования хардварных ключей для 2FA, не требующих действий юзера в UI

                        Как будет вводится пароль без действия пользователя в UI?

                        Ну, если все-все, то можно придумать очень искусственный кейс

                        Я вам привёл реальный пример. Буквально вчера этим занимался


                      1. powerman
                        00.00.0000 00:00

                        Нам важна абсолютная, а не относительная задержка. Относительную просто заметить легче, а то что она не заметна на глаз ничего не значит.

                        Если на глаз юзер задержку не замечает - зачем тратить время разработчиков и усложнять код для оптимизации? Просто чтобы разработчики развлеклись за счёт бизнеса?

                        Как будет вводится пароль без действия пользователя в UI?

                        Браузеры/плагины давно умеют автозаполнять пароли и даже автоматом отправлять форму.


                      1. Tarakanator
                        00.00.0000 00:00

                        Если на глаз юзер задержку не замечает - зачем тратить время разработчиков и усложнять код для оптимизации?

                        Если юзер не замечает задержку на глаз, это не значит что в масштабах компании эта задержка не преобразуется в значимую величину.

                        и даже автоматом отправлять форму.

                        Вот такого я пока не видел.


                      1. powerman
                        00.00.0000 00:00

                        в масштабах компании эта задержка не преобразуется в значимую величину

                        Эта величина же не в вакууме существует. Да, абсолютная цифра, особенно если посчитать за большой период времени (год), может быть впечатляющей. Но практического эффекта на бизнес она оказывать не будет никакого. А вот затраты времени на разработку и поддержку этой оптимизации - как правило оказываются в разы больше, чем казалось при планировании этой "фичи". Иными словами: бизнесу такие оптимизации чаще вредят, нежели помогают. И "чаще" тут практически эвфемизм, потому что я лично считаю что здесь "чаще==99.999%", но это моё личное мнение которое я не могу подкрепить статистикой, так что приходится формулировать осторожно. :)


                      1. Tarakanator
                        00.00.0000 00:00

                        А я могу сказать другое.
                        Часто что-то однопоточное тянется очень долго, как легаси, и от этого страдают. Да это не 10мс на аутентификации. Но это заставляется задуматься хотябы о том, чтобы система в принципе работала оптимально. (про оптимизацию конкретных функция я уже не говорю)


        1. Exchan-ge
          00.00.0000 00:00

          Если Дед пришёл домой, и орёт: Бабка, дед пришёл, налей мне самогону.


          Дед таки прошел у бабки аутентификацию по фейсу.
          Но в авторизации ему было отказано :)


          1. Tarakanator
            00.00.0000 00:00

            нет, бабка отказала даже не смотря на фейс. Она не знает точно кто крикнул.
            А вот авторизацию он прошёл (деду пить нельзя)


            1. Exchan-ge
              00.00.0000 00:00

              нет, бабка отказала даже не смотря на фейс.нет, бабка отказала даже не смотря на фейс.


              Так аутентификацию он точно прошел, иначе бы бабка вызвала полицию :)
              Собственно, и авторизацию он тоже прошел, просто его права доступа были изменены в связи со скорректированной бабкой политикой :)


              1. Tarakanator
                00.00.0000 00:00

                зачем бабке вызывать полицию, если оне не знает о факте подлога? или она должна полицию вызывать на любой шорох из-за сарая, когда не знает кто там шарится?


                1. Exchan-ge
                  00.00.0000 00:00

                  зачем бабке вызывать полицию


                  Ну так если дед не прошел аутентификацию — значит бабка его не узнала.
                  Пришел какой-то непонятный тип и требует самогон :)


                  1. Tarakanator
                    00.00.0000 00:00

                    Непонятный это если бы отказывался проходить аутентификацию или не мог её пройти.


                    1. Exchan-ge
                      00.00.0000 00:00

                      это если бы отказывался проходить аутентификацию


                      Т.е. пришел бы в маске?
                      Так это еще больший повод вызвать полицию :)

                      или не мог её пройти.


                      «в таком состоянии его бы родная мать не узнала» (с)

                      Выше, аналогично :)


      1. Exchan-ge
        00.00.0000 00:00

        Логин плюс пароль юзера позволяют определить его ID.


        Точнее, наверное, так: логин и пароль сущности переменные, поменять их можно только в путь. А ID — вещь постоянная.

        И определение по текущему логину и паролю конкретного ID — это уже аутентификация.
        А с определением что есть идентификация — есть проблемы.

        Возможно, как вариант — идентификация это процесс присвоения чему-то (например, учетной записи) конкретного ID.

        (с авторизацией вопросов нет)


        1. powerman
          00.00.0000 00:00

          ID тоже может меняться. И у одной сущности может быть больше одного ID. Примеры из жизни - обычный паспорт и загран, плюс возможность изменить имя/фамилию в паспорте по желанию. Но во всех этих случаях некий ID позволяет идентифицировать конкретную сущность, хоть и не обязательно этот ID вечен и не обязательно он единственный.


          1. Exchan-ge
            00.00.0000 00:00

            обычный паспорт и загран,


            Я не в курсе — у вас в стране есть такое понятие как «идентификационный код», который должен получить каждый гражданин страны и без которого никуда?
            (без паспорта — можно, без кода — нельзя :)

            А паспорта, как и имя с фамилией — это все тот же логин и пароль :)
            (можно потерять и получить новый)