За время работы архитектором в проектах внедрения IdM я проанализировал десятки реализаций механизмов авторизации как во внутренних решениях компаний, так и в коммерческих продуктах, и могу утверждать, что практически везде при наличии относительно сложных требований они сделаны не правильно или, как минимум, не оптимально. Причиной, на мой взгляд, является низкое внимание и заказчика и разработчиков к данному аспекту на начальных этапах и недостаточная оценка влияния требований. Это косвенно подтверждает повсеместное неправильное использование термина: когда я вижу словосочетание «двухфакторная авторизация», у меня начинаются боли чуть ниже спины. Ради интереса мы проанализировали первые 100 статей на Хабре в выдаче по запросу «авторизация», результат получился неутешительный, боли было много:


В более чем 80% случаев термин употребляется неверно, вместо него следовало бы использовать слово «аутентификация». Далее я попытаюсь объяснить что это такое, и почему крайне важно уделить особое внимание этой теме.

Что же это такое?


Процитируем Википедию:

Авториза?ция (англ. authorization «разрешение; уполномочивание») — предоставление определенному лицу или группе лиц прав на выполнение определённых действий; а также процесс проверки (подтверждения) данных прав при попытке выполнения этих действий.

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

Реализация авторизации при разработке корпоративной информационной системы или продукта, ориентированного на корпоративный сектор — очень сложная и ответственная задача, которой часто уделяется недостаточное внимание на этапе проектирования и первичном этапе разработки, что в будущем ведет к «костыльной» реализации.

Проблематика


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

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

  1. Пользователь, не имеющий отношения к конкретному договору, не должен его видеть в системе
  2. Автор договора должен видеть его на всех этапах.
  3. Создавать договор имеет право пользователь с грейдом не ниже 10.
  4. Визирующий должен видеть договор, начиная с поступления к нему на этап и далее.
  5. Руководители подразделений должны видеть договоры своих подразделений вверх по иерархии.
  6. Автор договора и руководитель подразделения имеют право отозвать договор на любом этапе согласования.
  7. Руководство и секретариат головного офиса должны видеть документы всех филиалов.
  8. Пользователь, создавший договор, не должен иметь права его завизировать.

От безопасности мы могли бы получить следующие требования:

  1. Знать, кто имеет доступ к конкретному договору.
  2. Знать, кто имел доступ к конкретному договору в заданный момент времени.
  3. Лишать пользователя доступа к ранее доступным документам при изменении его должностных обязанностей.

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

Итак, обозначим, почему эти требования проблемные:

  • Они не стабильны. Вероятность их изменения, даже в краткосрочной перспективе, стремится к 1.
  • Они сквозные. Их реализация влияет на все слои, от дизайна БД до UI.
  • Они лежат в плоскости предметной области. Это ведет к сильной связности механизма авторизации со слоем бизнес-логики. 
  • Они влияют на производительность. 

Пути решения


Решить данную задачу нам помогают разработанные модели управления доступом:

MAC — мандатная модель управления доступом. Доступ субъекта к объекту определяется его уровнем доступа: уровень доступа субъекта должен быть не ниже уровня секретности объекта.

DAC — прямое управление доступом. Доступ субъекта к объекту определяется наличием субъекта в списке доступа (ACL) объекта.

RBAC — ролевая модель управления доступом. Доступ субъекта к объекту определяется наличием у субъекта роли, содержащей полномочия, соответствующие запрашиваемому доступу.

АВАС — атрибутивная модель управления доступом. Доступ субъекта к объекту определяется динамически на основании анализа политик учитывающих значения атрибутов субъекта, объекта и окружения. Сюда же относятся PBAC, RAdAC, CBAC, с некоторыми нюансами (шикарный обзор от CUSTIS).

Их крайне рекомендуется использовать в первозданном виде, не изобретая велосипед. Достаточно часто в сложных информационных системах используется комбинация моделей. Например, популярна комбинация ACL + RBAC, когда роль включается в список доступа. Однако, правильное применение готовых моделей — тоже не простая задача. Не всем удается правильно выбрать модель, отделить ее от бизнес-логики и достичь приемлемой производительности механизма авторизации.

Для реализации озвученных выше в разделе «Проблематика» требований, на первый взгляд, я бы выбрал комбинацию PBAC + ACL. Требования могли бы быть реализованы следующим образом:
Требование от бизнеса
Решение
1
Пользователь, не имеющий отношения к конкретному договору, не должен его видеть в системе
Тут напрашивается ACL, поскольку определить отношение пользователя к бизнес-процессу достаточно сложно, не записывая его в какой-то список в момент вовлечения. Это будет оптимальным решением с точки зрения производительности чтения относительно реализации с помощью политик.
2
Автор договора должен видеть его на всех этапах
Требование может быть реализовано обоими механизмами, но оптимальным я считаю ACL, поскольку в этом случае будет проще реализовать требование №3 от ИБ.
3
Создавать договор имеет право пользователь с грейдом не ниже 10
Это политика (PBAC), без вариантов
4
Визирующий должен видеть договор начиная с поступления к нему на этап и далее
ACL будет оптимален
5
Руководители подразделений должны видеть договоры своих подразделений вниз по иерархии
Замечательная задача для PBAC, но его применение может снизить производительность чтения, а требования 1 и 2 от ИБ потребуют дополнительных усилий, поэтому стоит подумать над реализацией.
6
Автор договора и руководитель подразделения имеют право отозвать договор на любом этапе согласования
PBAC справится отлично
7
Руководство и секретариат головного офиса должны видеть документы всех филиалов
PBAC, с теми же ограничениями что и в п. 5
8
Пользователь, создавший договор, не должен иметь права его завизировать
Это требование можно было бы закрыть с помощью PBAC, однако так делать не стоит. Это то самое место, где авторизация вступает в конфликт с бизнес-логикой, и если происходит такая ситуация, ответственность стоит отдать бизнес-логике.

Перечисленные требования ИБ без всяких проблем реализуются с использованием ACL, однако бизнес-требования 5 и 7 мы реализуем с помощью PBAC. Так что для реализации требований ИБ 1 и 2 придется добавить к ним журнал или аналогичный механизм, поскольку при всей своей красоте динамические правила плохо аудируются:
Требование от ИБ
Решение
1
Знать, кто имеет доступ к конкретному договору
Общий журнал для ACL и PBAC
2
Знать, кто имел доступ к конкретному договору в заданный момент времени
Общий журнал для ACL и PBAC
3
Лишать пользователя доступа к ранее доступным документам при изменении его должностных обязанностей
ACL

Итого


Авторизация — незаслуженно обойденная вниманием тема, как в публикациях, так и непосредственно в процессе разработки. Двухфакторную аутентификацию по СМС к сайту прикрутит и ребенок. Правильно реализовать авторизацию в корпоративной системе, не наделав костылей — сложнейшая задача, о которую ломают копья сеньоры и архитекторы, а множество популярных коммерческих продуктов (к примеру, Atlassian Jira) стоят на костылях благодаря сложности требований. 

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

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


  1. lair
    18.12.2019 18:05
    +4

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

    … а что делать с ситуацией, когда доступ предоставляется на основании знаний, которые не являются идентифицирующими? Проще говоря, все bearer token и иже с ними?


    1. mayorovp
      18.12.2019 21:08

      Э-э-э, а в чем проблема с bearer token?


      1. lair
        18.12.2019 21:09

        Он никак не идентифицирует и не аутентифицирует субъекта.


        1. mayorovp
          18.12.2019 21:13

          Почему? Я могу согласиться с тем, что он не дает гарантий отсутствия перехвата и нахождения субъекта онлайн, но разве это означает что он никак не идентифицирует и не аутентифицирует субъекта?


          1. lair
            18.12.2019 21:21

            Да нет, перехват тут ни при чем.


            Вот у вас есть (подписанный доверенным сервисом) токен, в котором все, что есть — это claim books:read:all. Он никак не идентифицирует владельца этого токена. Посколько субъект не идентифицирован, подтвердить его идентичность — нельзя, следовательно, и аутентификация субъекта невозможна. При этом ничто не мешает вам авторизовать этого субъекта на чтение всех книг, если у вас есть соответствующая договоренность с доверенным сервисом, выдавшим токен.


            Проще говоря, сертификат "предъявителю сего дозволено блаблабла" не является удостоверением личности.


            1. mayorovp
              18.12.2019 21:24

              А если там есть клайм name или person:fio? Этот токен больше не считается bearer token или как?


              1. lair
                18.12.2019 21:25
                +3

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


                1. amphasis
                  17.12.2019 22:49
                  +1

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


                  1. lair
                    17.12.2019 23:05

                    Во-первых, не очевидно. Это личное дело доверенного сервиса, как он раздает токены.


                    А во-вторых, что важнее, в абзаце явно сказано "мы должны знать, кто он" — то есть, речь идет о точке зрения конкретной информационной системы, которая осуществляет авторизацию… что, как показано выше, неверно.


                    Очень важно проводить границы между участниками процесса.


                    1. kolkoni
                      18.12.2019 12:05

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


                      1. lair
                        18.12.2019 12:12

                        Токены не выдаются в никуда, токены вяжутся с конкретными сущностями, у которых есть или нет доступа.

                        Не обязательно.


                        И когда кто то приходит с токеном, он автоматически идетифицируется и далее проверяются права доступа.

                        Почему?


                        Если же нет, значит сама система криво построена

                        На основании чего вы делаете это утверждение? Скажем, RFC 6749 с вами не согласен.


                        Если в системе есть права доступа, то токен обязан Вас идентифицировать.

                        Что значит "обязан"? Кто создал это обязательство? Почему вы думаете, что это обязательство распространяется на мои системы?


                        И выдаваться он может только на то, на что у сущности которая его выдала, есть права.

                        … знаете, я вот могу запустить сервис в AWS, у которого будет больше прав, чем у меня.


                        1. kolkoni
                          18.12.2019 12:26
                          -1

                          Не обязательно.

                          Что значит не обязательно? Обязательно. Если нет, значит система неправильная, небезопасная. Вы путаете конкретные реализации с тем как должно быть.


                          Почему?

                          Потому что либо эта информация зашита в токене, либо сам токен где-то на беке связан с каким то пользователем.


                          На основании чего вы делаете это утверждение? Скажем, RFC 6749 с вами не согласен.

                          Вы сами читали данный стандарт? Мне кажется нет.


                          Что значит "обязан"? Кто создал это обязательство? Почему вы думаете, что это обязательство распространяется на мои системы?

                          Потому что это требование безопасности! То что Вы там у себя велосипед придумали, не значит что так оно должно быть. В своей системе конечно можно что угодно сделать.


                          … знаете, я вот могу запустить сервис в AWS, у которого будет больше прав, чем у меня.

                          И? Значит Вам кто то дал токен с правами запуска сервиса. Но тот кто дал, имел эти права. Или Вы хотите сказать Я могу создать себе токен с большими правами, чем у меня имеются?
                          Вы себя слышите?


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


                          1. lair
                            18.12.2019 12:31

                            Что значит не обязательно?

                            То и значит. Нет такого всемирного закона.


                            Потому что либо эта информация зашита в токене, либо сам токен где-то на беке связан с каким то пользователем.

                            Вам показать токен, который не содержит такой информации?


                            Вы сами читали данный стандарт?

                            Да, неоднократно.


                            Потому что это требование безопасности!

                            Кто его выдвинул? Почему оно универсально применимо?


                            Или Вы хотите сказать Я могу создать себе токен с большими правами, чем у меня имеются?

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


                            1. kolkoni
                              18.12.2019 15:44
                              -1

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


                            1. darthslider
                              18.12.2019 17:30

                              Если токен не содержит информации о владельце токена, то проблема ли это? Выглядит как фича, а не баг.
                              А если если это проблема — то нужно просто добавить эту информацию в токен.


                              1. lair
                                18.12.2019 17:38

                                Если токен не содержит информации о владельце токена, то проблема ли это?

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


                                Однако мой оппонент утверждает, что это плохой, неправильный токен.


                          1. MIKEk8
                            18.12.2019 15:22
                            +1

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


                            1. kolkoni
                              18.12.2019 15:31

                              Это описание системы, в которой специально не хранят связь токена и юзера, для обеспечения полной анонимности.
                              Токен имеет право сделать только одно действие — проголосовать 1 раз.
                              Тут максимальная безопасность обеспечивается при выдаче токена.
                              И то, где гарантия, что они не хранят связь токен-юзер? В реальном коде то может быть совсем по другому.


                              1. lair
                                18.12.2019 15:52

                                Это описание системы, в которой специально не хранят связь токена и юзера, для обеспечения полной анонимности.

                                Что показывает, что утверждение "либо эта информация зашита в токене, либо сам токен где-то на беке связан с каким то пользователем" верно не всегда.


                                1. kolkoni
                                  18.12.2019 16:00

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


                                  1. lair
                                    18.12.2019 16:03

                                    Верно всегда для безопасных и надёжных систем.

                                    Как доказать (или опровергнуть) это утверждение?


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

                                    Простой признак "токен выдан" для конкретного человека решает эту проблему.


                                    1. kolkoni
                                      18.12.2019 16:13

                                      Как доказать (или опровергнуть) это утверждение?

                                      Никак, это рекомендация, а конкретные реализации зависят от разрабов


                                      Простой признак "токен выдан" для конкретного человека решает эту проблему.

                                      Это нарушение требования об анонимности. То есть отметка в моем профиле что токен выдан уже говорит о том что Я приходил голосовать.


                                      1. lair
                                        18.12.2019 16:16

                                        Никак, это рекомендация, а конкретные реализации зависят от разрабов

                                        Если это рекомендация, значит, как утверждение это верно не всегда. Потому что рекомендациям следовать не обязательно.


                                        Следующий вопрос: а чья конкретно это рекомендация? Можно ссылку на авторитетный документ?


                                        То есть отметка в моем профиле что токен выдан уже говорит о том что Я приходил голосовать.

                                        Нет, если требование об анонимности сформулировано как "не должно быть известно, кто за кого проголосовал" (случай единогласного голосования не рассматриваем, он вырожденный). Собственно, сейчас система голосования в России так и работает, насколько мне известно.


                                        1. kolkoni
                                          18.12.2019 16:29
                                          -1

                                          случай единогласного голосования не рассматриваем, он вырожденный

                                          Так и случай одноразового анонимного токена для одного действия тоже вырожденный.


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


                                          1. lair
                                            18.12.2019 16:39

                                            Так и случай одноразового анонимного токена для одного действия тоже вырожденный.

                                            То-то мы эти "токены" на каждом голосовании видим (равно как и при походах в кино, театр, музей и так далее, далее, далее).


                                            1. kolkoni
                                              18.12.2019 16:42
                                              -1

                                              Ну о чем Я и говорил, Вы сравниваете теплое с мягким.
                                              1 раз в несколько лет ни в какое сравнение с тысячами сервисов которые каждый день используются.


                                              1. lair
                                                18.12.2019 16:45

                                                Театр, музей, кино, концерты, некоторые виды транспорта — это все 1 раз в несколько лет?


                                                1. kolkoni
                                                  18.12.2019 16:48

                                                  Обоснуйте. Где Вы этот токен видите при походе в театр?


                                                  1. lair
                                                    18.12.2019 16:50

                                                    Билет. Самый простой входной билет, купленный в кассе. Он на одно действие (войти), одноразовый (оторвут корешок и больше не пустят) и полностью анонимный.


                                                    (больше того, если я его покупал за наличку, аутентификации меня как субъекта не было никогда)


                                                    1. kolkoni
                                                      18.12.2019 16:51
                                                      -1

                                                      Где в билете Вы увидели токен?


                                                      1. lair
                                                        18.12.2019 16:56

                                                        В словаре:


                                                        A piece of stamped metal or plastic, etc., used as a substitute for money; a voucher that can be exchanged for goods or services


                                                        1. kolkoni
                                                          18.12.2019 16:58
                                                          -2

                                                          Где в этом определи Вы увидели токен, в том понимании, которое мы обсуждаем?
                                                          Или Вам не в домек что одно и тоже слово может иметь совершенно разные значения?


                                                          1. lair
                                                            18.12.2019 17:02

                                                            Это словарная статья для слова token.


                                                            1. kolkoni
                                                              18.12.2019 17:05
                                                              -1

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


                                                              1. lair
                                                                18.12.2019 17:07

                                                                Это никак не отменяет того факта, что поход в театр по билету, купленному в кассе — это типичный пример одноразового анонимного токена.


                                                                1. kolkoni
                                                                  18.12.2019 17:08
                                                                  -1

                                                                  Ни разу не пример, Вы сравниваете совершенно разные вещи


                                                                  1. lair
                                                                    18.12.2019 17:11

                                                                    Докажите это утверждение.


                                                                    1. kolkoni
                                                                      18.12.2019 17:16
                                                                      -2

                                                                      Да легко, Я в статье про значения слова "дурак" оставлю ссылку на Ваш профиль, как одно из значений.
                                                                      И по Вашей логике, любое упоминание дурака, букет касаться Вас. А это не так.


                                                                      1. lair
                                                                        18.12.2019 17:39

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


                                                                        1. kolkoni
                                                                          19.12.2019 07:34
                                                                          -1

                                                                          Я доказал своё утверждение...


                                                                          1. lair
                                                                            19.12.2019 09:39

                                                                            Нет. Чтобы доказать ваше утверждение ("Ни разу не пример"), вам нужно привести (общепринятое) определение примера, и показать, что мое высказывание ему не соответствует.


                                                                            1. kolkoni
                                                                              19.12.2019 09:59

                                                                              Кто сказал, что Я что то должен?


                                                                              1. lair
                                                                                19.12.2019 10:07

                                                                                Мне кажется, что из комментария, на который вы отвечаете, вполне очевидно, что это был я.


                                                                                1. kolkoni
                                                                                  19.12.2019 10:09
                                                                                  -1

                                                                                  Дак Я Вам ничего не должен уважаемый.


                                                                                  1. lair
                                                                                    19.12.2019 10:10

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


                                                                                    1. kolkoni
                                                                                      19.12.2019 10:15
                                                                                      -1

                                                                                      Как Я уже говорил


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


                                                                                      1. lair
                                                                                        19.12.2019 10:20

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


                                                                                        Но, впрочем, не суть. Не собираетесь доказывать — не доказывайте. Это полностью согласуется с моим мнением, что ваши высказывания выше — не доказаны (и, if I might say so, безосновательны).


                                                          1. mayorovp
                                                            18.12.2019 17:23
                                                            +1

                                                            А какие различия вы видите в значениях этого слова?


                          1. pulsatrix
                            18.12.2019 15:37

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


                            1. kolkoni
                              18.12.2019 15:42
                              -1

                              При чем тут токен даваемый непонятно кому и токен доступа? Мне кажется Вам нужно внимательно прочитать саму статью и комментарии по порядку.


                              1. pulsatrix
                                18.12.2019 15:45

                                Возможно.


            1. gecube
              18.12.2019 00:18

              А что делать, если мы хотим в экстренном порядке этого субъекта заблокировать? Токен-то мы уже отозвать не сможем оперативно! Или нам нужно проверять уже не просто наличие claim с криптоподписью issuer, а каждый запрос отправлять в некий сервис, который будет нам говорить — валидный токен еще валиден или уже нет?


              1. lair
                18.12.2019 00:32
                +1

                А что делать, если мы хотим в экстренном порядке этого субъекта заблокировать?

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


                а каждый запрос отправлять в некий сервис, который будет нам говорить — валидный токен еще валиден или уже нет?

                … и так тоже делают. Собственно, в OAuth 2 явно написано: "The token may denote an identifier used to retrieve the authorization information".


    1. AvanpostID Автор
      17.12.2019 23:27
      +1

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


      1. lair
        17.12.2019 23:46
        +1

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

        Ну то есть весь OAuth 2 — это вырожденный случай, да? И в прикладных информационных системах он не используется?


        Или, скажем, отправка уведомлений (в простонародье — вебхуки) — это вырожденный случай, который в прикладных информационных системах не используется?


        Особенно занятно, что ряд требований в вашем примере можно прекрасно реализовать на этот самом "вырожденном случае", просто включив в токен соответствующие утверждения (и, собственно, это будет работать для того подмножества ABAC, где не нужны идентифицирующие атрибуты субъекта, а так же для всего RBAC, потому что роль является таким признаком).


        Bearer token, как правило, выдан IdP

        Совершенно не обязательно. Bearer token в OAuth 2 выдается authorization server.


        Формулировку уточнил.

        Знаете, достаточно странно слышать это от автора поста c утверждением "В более чем 80% случаев термин употребляется неверно".


        1. amphasis
          18.12.2019 07:34
          +1

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


          1. lair
            18.12.2019 09:58
            +1

            авторизация без аутентификации это действительно вырожденный случай

            … и именно с этим постулатом я и спорю.


            Когда я даю доступ к альбому в Google Photos "всем, у кого есть ссылка" — работает именно этот "вырожденный случай". И если он такой вырожденный, то почему аналогично работают OneDrive и просто сервисы шаринга файлов?


            И когда я даю доступ к микросервису на основании api key — тоже работает этот "вырожденный случай".


            И когда я создаю временные токены на выполнение внешними сервисами каких-то однократных операций — тоже работает этот "вырожденный случай".


            1. DriverEntry
              18.12.2019 10:58

              Авторизация без аутентификации вообще не имеет смысла. В примере с доступом по ссылке вы аутентифицируете того, кому передали ссылку. Аналогично с api key.


              1. lair
                18.12.2019 11:03

                Авторизация без аутентификации вообще не имеет смысла.

                Без аутентификации кого или чего? А то это весьма общее понятие.


                В примере с доступом по ссылке вы аутентифицируете того, кому передали ссылку.

                Кто "вы"? Я-человек-передающий-ссылку? Может быть (может быть и нет). Но сервису, предоставляющему доступ к файлу, на это все равно, он осуществляет авторизацию без аутентификации субъекта.


                1. DriverEntry
                  18.12.2019 11:15

                  Без аутентификации кого или чего? А то это весьма общее понятие.

                  Того, кому вы хотиту дать доступ. Хоть человеку, хоть машине.
                  Кто «вы»?

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

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


                  1. lair
                    18.12.2019 11:19

                    Того, кому вы хотиту дать доступ. Хоть человеку, хоть машине.

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


                    (и это мы еще на примеры из материального мира не перешли)


                    Тот, кто знает ссылку в этом случае.

                    Это не сервис, осуществляющий авторизацию. А сам сервис никого не аутентифицирует.


                    Но в предположении, что то тот, кто дал ссылку (токен доступа) не раздаёт её кому угодно,

                    Неа. Нет никаких предположений. Есть ссылка, есть доступ.


                    Иначе, опять же, в авторизации смысла нет.

                    Есть. Смысл авторизации — разрешить операцию тому, у кого есть на нее права.


                    1. DriverEntry
                      18.12.2019 11:31

                      когда подключаюсь к домашнему WiFi

                      Тогда либо ваш роутер без пароля, либо вы всё-таки аутентифицируетесь, вводя пароль.

                      Это не сервис, осуществляющий авторизацию

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


                      1. lair
                        18.12.2019 11:38

                        Тогда либо ваш роутер без пароля, либо вы всё-таки аутентифицируетесь, вводя пароль.

                        Я не аутентифицируюсь. Моя сеть не знает, кто к ней подключился — я, мой партнер, родители, доверенный робот — к ней подключилось нечто, знающее пароль. Это авторизация в чистом виде, но не аутентификация субъекта.


                        Никто не говорит, что аутентификацию и авторизацию должен делать один и тот же сервис, человек и т.п.

                        Но все, что за границами разрабатываемого и контролируемого ПО, нас мало волнует.


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

                        Если мы говорим об аутентификации субъекта — легко может.


                        1. DriverEntry
                          18.12.2019 13:27

                          нечто, знающее пароль

                          Это называется аутентифицированное нечто. В отношении подключения к сети все пользователи одинаковы, поэтому логин и не требуется, но это не значит, что нет аутентификации.
                          Но все, что за границами разрабатываемого и контролируемого ПО, нас мало волнует. Разделение ответственностей

                          Вы можете вынести вопрос аутентификации за рамки своего ПО и переложить на кого-то ещё. Но совсем исключить из процесса разграничения доступа — нет.


                          1. lair
                            18.12.2019 13:29

                            Это называется аутентифицированное нечто

                            Почему? Аутентификация — это подтверждение чего-то. Что вы подтверждаете?


                            Или даже на шаг раньше: что именно вы понимаете под аутентификацией, каким конкретно определением вы пользуетесь?


                            Но совсем исключить из процесса разграничения доступа — нет.

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


                            Впрочем, могу и вообще, но придется начать с примера из материального мира. Вы в театры или музеи ходите?


                            1. DriverEntry
                              18.12.2019 13:37

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


                              1. lair
                                18.12.2019 13:40

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

                                С точки зрения моей домашней сети это утверждение неверно: в ней 12 пользователей (вот ровно по отчету ее контроллера).


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


                                1. DriverEntry
                                  18.12.2019 14:11

                                  Я просто показываю, где в вашем примере аутентификация, и куда делся логин. Смотреть на 12 пользователей, о которых вы говорите, как на разных, никто не запрещает, но так не делают, и пользы от этого нет. Например, вы ни пароль не можете изменить для одного независимо от других, ни как-то ограничить доступ. Наконец, 1 пользователь или 12 — им всё равно нужно как-то подтверждать свою личность, а это аутентификация, независимо от того, один у них пароль или нет.


                                  1. lair
                                    18.12.2019 14:13

                                    Я просто показываю, где в вашем примере аутентификация, и куда делся логин.

                                    Нет там аутентификации субъекта. Потому что субъектов — 12, а пароль, внезапно, один.


                                    Смотреть на 12 пользователей, о которых вы говорите, как на разных, никто не запрещает, но так не делают, и пользы от этого нет.

                                    Что значит "не делают", если мой контроллер ровно так и делает?


                                    Наконец, 1 пользователь или 12 — им всё равно нужно как-то подтверждать свою личность,

                                    Нет, не нужно (даже без учета того, что эти 12 пользователей — это устройства, у них нет личности).


                                    1. mayorovp
                                      18.12.2019 14:33

                                      Нет там аутентификации субъекта.

                                      Там и авторизации субъекта нету, если разобраться...


                                      1. lair
                                        18.12.2019 14:34

                                        Почему? Субъект (устройство) пришло в сеть. Его пустили. Это разве не авторизация?


                                    1. DriverEntry
                                      18.12.2019 16:59

                                      Я не очень понимаю, что имеете в виду под субъектом. С точки зрения контроля доступа субъект это хоть устройство, хоть человек. К тому же, я вообще определения субъекта не касался, это не так важно. Важно, что аутентификация обязательно есть.


                                      1. lair
                                        18.12.2019 17:01

                                        Я не очень понимаю, что имеете в виду под субъектом.

                                        То, чему предоставляется доступ.


                                        Важно, что аутентификация обязательно есть.

                                        Аутентификация субъекта? Или вообще какая-то аутентификация?


                                        1. DriverEntry
                                          18.12.2019 17:08

                                          Я согласен с этим определением, и в этом случае аутентификация просто и аутентификация субъекта это одно и тоже.


                                          1. lair
                                            18.12.2019 17:11

                                            в этом случае аутентификация просто и аутентификация субъекта это одно и тоже.

                                            Но нет же:


                                            the act of proving an assertion

                                            Аутентификация субъекта — это аутентификация (подтверждение) того факта, что субъект — это тот, кем мы его идентифицировали.


                                            Аутентификация "просто" — это проверка какого-то факта (например, что у субъекта есть сумка).


                                            1. DriverEntry
                                              18.12.2019 17:22

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


                                              1. lair
                                                18.12.2019 17:37

                                                Я придерживаюсь контекста примера.

                                                Вот как раз в контексте примера аутентификации субъекта не происходит. Потому что моя домашняя сеть идентифицировала 12 субъектов, но не аутентифицировала ни одного.


                                                Но ладно, в том, что аутентификация требуется, нет противоречий, и хорошо.

                                                А я, вроде, и не спорил с этим. Я специально сразу спросил, аутентификация чего, и когда вы сказали, что субъекта — с этим я спорю.


        1. AvanpostID Автор
          18.12.2019 09:55

          Ну то есть весь OAuth 2 — это вырожденный случай, да? И в прикладных информационных системах он не используется?
          Достаточно часто используется, особенно спецификация OpenID Connect, в последнее время.
          Bearer token в OAuth 2 выдается authorization server.
          Ключевое слово authorization. Выше вы говорите:
          Очень важно проводить границы между участниками процесса.
          Согласитесь, нельзя авторизовать на доступ к объектам или операциям о которых не знаешь? А если сервер авторизации знает о сущностях системы, то он входит в границы этой системы. Правильно?
          Или, скажем, отправка уведомлений (в простонародье — вебхуки) — это вырожденный случай, который в прикладных информационных системах не используется?

          Тут, как правило, два варианта, либо без авторизации совсем (на прикладном уровне), либо с идентификацией, хотя бы по api-ключу.


          1. lair
            18.12.2019 10:11
            +1

            Достаточно часто используется

            Странно называть его тогда вырожденным случаем.


            Согласитесь, нельзя авторизовать на доступ к объектам или операциям о которых не знаешь?

            "The interaction between the authorization server and resource server is beyond the scope of this specification."


            Сервер авторизации может не знать о сущностях системы, которая будет пользоваться токеном. Им достаточно контракта о scope — или и вовсе факта "я считаю, что владельцу этого токена можно".


            А если сервер авторизации знает о сущностях системы, то он входит в границы этой системы. Правильно?

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


            Тут, как правило, два варианта, либо без авторизации совсем (на прикладном уровне), либо с идентификацией, хотя бы по api-ключу.

            Вот только api-ключи совершенно не обязательно являются идентификационными. Вполне в ходу вебхуки, которые имеют общее назначение ("любая авторизованная система может слать сюда уведомления в заданном формате"), и доступ к которым ограничивается одним (на всех; ну или двумя, если мы хотим ротацию) ключом.


            1. mayorovp
              18.12.2019 10:41

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


              1. lair
                18.12.2019 10:42

                А любой пользователь имеет доступ к любым бэкапам или как?

                Не польователь, а сервис. Любой сервис (из белого списка) может залить новый бэкап.


                1. mayorovp
                  18.12.2019 10:56

                  Залить в общую кучу? Или всё-таки есть разделение какой бэкап от какого сервиса?


                  1. lair
                    18.12.2019 10:57

                    В общую кучу. Каждый сервис получает глобальный идентификатор залитого бэкапа.


                    1. mayorovp
                      18.12.2019 11:03

                      А как потом искать бэкап если сервис накроется?


                      1. lair
                        18.12.2019 11:04

                        А вот это уже вопрос за рамками проблемы разделения доступа.


                        1. mayorovp
                          18.12.2019 11:06

                          Формально — да, другой. Но реально я не вижу применения подобной сферической системе бэкапов в вакууме.


                          1. lair
                            18.12.2019 11:09

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


                            (я бы привел другой, более подходящий пример для write-only-задач, но у меня на него NDA)


            1. AvanpostID Автор
              18.12.2019 13:52
              +1

              Странно называть его тогда вырожденным случаем.
              OAuth 2 я вырожденным случаем не называл. Относительно него я говорю, что вы не верно определяете границы системы и подменяете понятия.

              Если у меня где-то есть сервис хранения бэкапов, а где-то в другом месте есть авторизационный сервис, который дает третьим системам токены на заливку бэкапов, этот сервис не обязан быть частью сервиса хранения. Вся их связь выражена в контракте на авторизационный токен — и это, заметим, гигантское достоинство, сильно упрощающее и поддержку и развитие обоих сервисов (а так же еще десятка других сервисов, которым тоже нужна авторизация, но не нужна идентификация).
              Микросервисы принадлежат одной системе. Если ваш пример переложить на монолит, то можно сказать что репозиторию (я имею ввиду паттерн) не нужно знать какой пользователь внес те изменения, которые он записывает в БД. Естественно не нужно, он предполагает что работает в доверенной среде.


              1. lair
                18.12.2019 13:54

                вы не верно определяете границы системы

                А как верно?


                Микросервисы принадлежат одной системе

                Я говорил о сервисах, а не о микросервисах.


    1. dth_apostle
      18.12.2019 10:36

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


      1. lair
        18.12.2019 10:41

        все этапы процесса должны выполняться одной системой, хотя это не так

        Ну так этапы процесса, которые я не контролирую, меня не интересуют. Меня интересуют те этапы, которые напрямую явно затрагивают систему, которую я разрабатываю и поддерживаю.


        Хотя даже идентификация персоны, как анонима, вполне себе является идентификацией.

        Гм. Я боюсь, что у нас с вами разное понимание идентификации. Для меня "это — аноним" — это не идентификация, а утверждение (assertion или claim).


        1. dth_apostle
          18.12.2019 10:45

          Для меня «это — аноним» — это не идентификация, а утверждение (assertion или claim).

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

          ну так ваша система либо сама идентифицирует/аутентифицирует (и тут ваша озабоченность понятна), либо делегирует это другим системам — и тогда это не ваша головная боль.


          1. lair
            18.12.2019 10:48

            Для меня «данный пользователь — anonymous» — вполне себе идентификация в рамках систем, где такой пользователь предусмотрен.

            Это и показывает разницу в наших подходах. У вас есть пользователь, как сущность, и есть некий конкретный пользователь anonymous, к которому вы привязываете подобные операции. У меня нет такой сущности, вообще. У меня есть привязанное к операции утверждение "пользователь не определен", на основании которого я принимаю решения.


            ну так ваша система либо сама идентифицирует/аутентифицирует (и тут ваша озабоченность понятна), либо делегирует это другим системам — и тогда это не ваша головная боль.

            Именно. И очень часто я нахожусь в ситуации "моя система только авторизует".


    1. flancer
      18.12.2019 18:04

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

      Идентификацию и аутентификацию провёл доверенный сервис.


      1. lair
        18.12.2019 18:25

        Во-первых, я про это ничего не знаю.
        Во-вторых, меня это не волнует.


        Разделение ответственностей.


        1. flancer
          18.12.2019 18:53

          И как разделение ответственностей отменяет этапы идентификации и аутентификации? То, что это делаете не вы, не отменяет того факта, что


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

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


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


          1. lair
            18.12.2019 19:07

            И как разделение ответственностей отменяет этапы идентификации и аутентификации?

            Очень просто: в моей системе этих этапов нет. Что характерно, и в другой системе их может не быть.


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

            Да, может. Я же понятия не имею, как доверенный сервис выдает токены.


            (и я приводил примеры, когда токены можно выдавать без аутентификации и идентификации)


            Вот только ваша система (авторизация) теперь не может корректно работать без доверенного сервиса (аутентификация и идентификация).

            … без доверенного сервиса (токены). А еще точнее — без способа проверить токен (можно и без сервиса обойтись иногда).


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


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


            1. flancer
              18.12.2019 19:54
              +1

              Ссылка на доступ к Google Photo более убедительный пример, чем билет. Вынужден с вами согласиться (хотя я обычно спорю не для того, чтобы потом с кем-либо соглашаться).


  1. questor
    18.12.2019 18:46
    +1

    Ну, так уж никто… Вот я себе положил в закладки ещё в 2015 году набор статей https://habr.com/en/company/custis/blog/248649/ https://habr.com/en/company/custis/blog/258861/


    1. AvanpostID Автор
      17.12.2019 23:38
      +1

      Да, статьи классные. С первой мы еще хотим поспорить, а вторая ссылка в тексте у меня изначально была. Но прошло 4,5 года, а ничего столь же стоящего не появилось. Нужно исправлять!


    1. gecube
      18.12.2019 07:41

      О, спасибо за ссылочки. Положил к себе в закладки.


  1. GraiT
    18.12.2019 19:37

    По моему личному мнению, так происходит из-за принципа «нужно еще вчера». Все начинается с MVP (минимально работающего прототипа) и никто этим просто не занимается, а потом все и обрастает «костылями», а как доберутся до авторизации, костылями начинает обрастать и другая часть проекта. Информации по этой теме мало не только здесь и зарубежные источники слабы. Спасибо за начало, надеюсь получится хорошая серия статей!


  1. Bladimir
    18.12.2019 12:01

    Есть еще одно частое требование — пользователь должен видеть в какой-нибудь папке только те договора, к которым он имеет доступ. Какие есть варианты реализовать быструю фильтрацию?


    1. AvanpostID Автор
      18.12.2019 14:16

      Тут вопрос в правилах, по которым доступ предоставляется. Если эти правила определены заранее, и на каком-то этапе процесса становится понятно, что пользователь получает доступ, то его (лично, его группу, или роль) можно внести в список доступа документа и тогда при чтении папки нужно будет просто добавить фильтр на уровне запроса в хранилище (БД).