Основные понятия и аутентификационные протоколы
~ 60 минут
Пойду-ка домой. Если я — это я,Меня не укусит собака моя!Она меня встретит, визжа, у ворот,А если не я, на куски разорвёт!»В окно постучала старушка чуть свет.Залаяла громко собака в ответ.Старушка присела, сама не своя,И тихо сказала: «Ну, значит, не я!»
С. Маршак «Старушка»
Представьте: вы пишете веб-приложение, в котором пользователь должен проходить аутентификацию — вводить свой логин и пароль. Для этого вам понадобится решить многие вопросы и настроить многие процессы, например:
- разработать процедуры регистрации и проверки, что такой пользователь уже зарегистрирован;
- настроить требования к безопасности создаваемых паролей;
- организовать правильное хранение этих паролей — в зашифрованном виде, с устойчивым механизмом хеширования и безопасности в отношении радужных таблиц.
- разработать методы, защищающие пароли от утечки;
- разработать процедуру напоминания пароля и процедуру ротации пароля через какой-то промежуток времени.
Всё это достаточно важные и сложные аспекты. А если веб-сервисов много и в каждом из них нужно понимать, какой пользователь входит, — задача усложняется кратно. Кроме того, пользователю придётся регистрироваться в каждом из ваших сервисов, вводить пароли, которые вам нужно проверять. Вы можете синхронизировать базы, но нет гарантии, что способы хеширования паролей одинаковы во всех реализациях.
Ситуация становится ещё сложнее, если добавляются другие типы приложений — мобильные, десктопные. Для них тоже необходимо делать формы для логина.
На протяжении всей темы будут использоваться три важных термина. В прошлом спринте уже шла речь об идентификации, аутентификации и авторизации. Но даже в профессиональной среде их часто путают. Например, говорят «X — это протокол авторизации», хотя имеют в виду аутентификацию. Поэтому мы остановимся на этих терминах подробнее.
В этом уроке вы узнаете, как сделать процессы аутентификации и авторизации безопасными, удобными для пользователя и для разработчиков, а также масштабируемыми на разные, в том числе сторонние сервисы. В рамках этой темы вы напишете часть системы, которая будет отвечать за аутентификацию и авторизацию пользователей.
Как различить идентификацию, аутентификацию и авторизацию
✏️ Идентификация — это то, как пользователь себя идентифицирует. Как правило, сервисы не знают, кто к ним пришёл, и пользователь себя называет.
Например: «Я — Игнат»; «Я — example@yandex.ru»; «Я — asg;kjas54».
✏️ Аутентификация — это способ доказать, что пользователь тот, за кого себя выдаёт.
Когда вы вводите логин и пароль в сервисе или отсылаете API-запрос с токеном, по которому сервер может определить пользователя, вы проходите аутентификацию.
Различные способы аутентификации — парольные, MFA и другие — будут рассматриваться дальше. Сама часть «ауто» может служить напоминанием, что это про «себя», «применительно к себе».
В жизни способом аутентификации может быть паспорт, водительские права или свидетельство о рождении.
✏️ Авторизация — это механизм проверки, может ли пользователь совершать какое-то действие. Например, авторизован ли он заходить на страницу, удалять или изменять данные. Как правило, почти всегда это означает, что до этого пользователь должен быть аутентифицирован.
Примером авторизации в жизни может служить виза для въезда в страну, пропуск или карточка для прохода в организацию.
Аутентификационные протоколы и стандарты
Использование SSO
Когда у человека есть доступ ко многим сервисам, для аутентификации удобно использовать единую точку для проверки личности и выдачи прав доступа. Создавать такие системы с нуля непросто, и есть большой риск сделать ошибки, которые могут поставить под угрозу безопасность. Поэтому такие задачи решаются с помощью технологии под названием SSO (Single Sign-On). SSO позволяет один раз войти в систему и получить доступ ко всем нужным сервисам без повторной авторизации.
✏️ SSO (Single Sign-On, служба единого входа) — это система, обеспечивающая единый вход сразу в несколько систем. Пользователю нужно запомнить только один набор учётных данных (логин и пароль), чтобы получить доступ ко всем связанным сервисам.
Cлужбы SSO могут выполнять и функции авторизации и идентификации, быть частью Identity and Access management, то есть частью службы управления пользователями и доступами, но об этом речь пойдёт в следующих уроках.
Функцию аутентификации в SSO можно представить на аналогии с паспортным столом. Паспортный стол представляет собой поставщика удостоверений (Identity Provider, IdP), который выдаёт удостоверение, или токен, при подтверждении личности пользователя. Чтобы получить паспорт, человек предоставляет предыдущий паспорт или свидетельство о рождении — начальные данные, которые нужны для получения нового удостоверения. Паспорт в обычной жизни позволяет получать доступ ко многим предприятиям и компаниям, как токен — к разным сервисам.
Способы выдавать и затем проверять удостоверения называются протоколами аутентификации.
✏️ Протоколы аутентификации — это стандарты и наборы правил, которые определяют, как пользователи могут безопасно подтвердить свою личность для получения доступа к информационным системам, сервисам или приложениям.
Эти протоколы обеспечивают передачу учётных данных, защиту от несанкционированного доступа и подделок, гарантируя, что только авторизованные пользователи смогут получить доступ к данным.
Примеры таких протоколов включают OAuth, OpenID Connect, SAML и Kerberos, каждый из которых имеет свои особенности и области применения, от социальных сетей до корпоративных систем.
В этом уроке мы рассмотрим три наиболее распространённых протокола аутентификации: SAML, OpenID Connect и Kerberos.
Применение протокола SAML
Одним из популярных протоколов аутентификации является SAML (Security Assertion Markup Language, или язык разметки утверждений безопасности).
Принцип работы этого протокола основан на создании специального XML-документа, который создаётся Identity Provider для пользователя, подтвердившего свои данные.
Например, когда пользователь пытается войти в корпоративную почту, вводит логин и пароль, Identity Provider (например, общая система авторизации компании) проверяет, кто именно пытается войти. После успешной проверки пользовательских данных Identity Provider создаёт специальный SAML-документ на языке XML. Он включает информацию о том, кто пользователь и какие у него права. Затем Identity Provider отправляет этот SAML-документ почтовому сервису. А почтовый сервис в свою очередь получает документ, проверяет его на подлинность и даёт пользователю доступ к почте без повторного запроса логина и пароля.
SAML позволяет избежать многократных логинов в разные корпоративные системы, а также обеспечивает безопасную передачу информации о пользователе.
✏️ SAML (Security Assertion Markup Language, или язык разметки утверждений безопасности) — это XML-документ, который генерируется Identity Provider в отношении пользователя, предоставившего свои аутентификационные данные (креды).
Важные части в XML-документе SAML
В XML-документе SAML есть несколько ключевых частей, которые обеспечивают идентификацию и передачу прав пользователя:
- Описание типа протокола, типа утверждения, даты выпуска, данных о том, куда переслали пользователя, ID запроса:
XML
- Информация о том, что утверждение прошло успешно:
XML
- Тело утверждения — основная часть документа, содержащая данные о пользователе и их правах. Указывается ID (уникальный идентификатор) для этого утверждения, чтобы его можно было отследить или использовать для последующей проверки:
XML
- Подпись — здесь указывается алгоритм цифровой подписи, используемый для защиты документа от подделки:
XML
- Данные по субъекту указывают, для кого предназначен документ (например, имя пользователя или ID):
XML
- Подтверждение от аутентификационного сервера, на основании которого будет выдаваться токен:
XML
Идентификатор пользователя: testEmail: test@example.comРоли: users, examplerole1
Процесс аутентификации с использованием протокола SAML
Аутентификация по SAML в целом состоит из следующих шагов:
- Неизвестный клиент запрашивает доступ к провайдеру ресурса.
- Если такой запрос не может быть предоставлен клиенту без аутентификации, провайдер перенаправляет клиента на провайдера идентификаций — Identity Provider.
- Identity Provider идентифицирует и аутентифицирует пользователя.
- На основании аутентификационных данных, которые предоставил пользователь, он генерирует документ — XML-assertion (XML-утверждение) — и отдаёт его клиенту в формате SAML. В этом документе указываются те утверждения, которые получилось проверить в отношении тех параметров, которые ожидает ресурс. Например, ресурсу, чтобы аутентифицировать пользователя, надо получить от сервера аутентификации email и уникальный ID. В SAML указывается значение того, что удалось подтвердить.
- Клиент берёт XML и идёт с ним к ресурсу.
- Ресурс читает XML, проверяет, что ему можно доверять (каждый XML подписан), аутентифицирует клиента и выдаёт свой access_token.
- Клиент сохраняет access_token и использует его для работы с этим ресурсом.
Особенности использования SAML-аутентификации
Service Provider и Identity Provider должны быть настроены таким образом, чтобы последний знал, куда отослать пользователя, а сервис доверял тому, что написано в XML.
Разработчикам ресурсных серверов необходимо реализовывать то, как их сервис будет работать, когда получит SAML-assertion.
Библиотеки есть для разных языков:
- Java: OneLogin или, если используется Spring, — Spring Security SAML;
- Python: python3-saml для простых случаев, PySAML2 — для сложных;
- Node.js: passport-saml;
- Ruby: ruby-saml;
- Go: crewjam/saml.
Плюсы SAML-аутентификации
- SAML разработан только для аутентификации, что полезно для работы с legacy-системами.
- Протокол SAML широко распространён — больше, чем OpenID Connect.
- Имеет гибкое распространение атрибутов.
- Этот протокол может поддерживать user federation — с его помощью можно подключать разные IDp к аутентификационному серверу.
- Есть документация и отработанные практики безопасности.
Минусы SAML-аутентификации
- SAML сделан только для веб-приложений и не подходит для нативных (мобильных, десктопных).
- Документ XML имеет большую и сложную для чтения структуру — в качестве альтернативы можно использовать более короткие стандарты, например JWT, о котором расскажем далее.
Протокол SAML — это хорошее решение для ситуаций, когда необходимо центральное управление пользователями и при интеграции с legacy-системами в рамках корпоративного слияния, где требуется объединить разные системы аутентификации.
Он подходит для реализации сложных «отношений доверия» между системами, потому что позволяет настраивать разные уровни доверия для различных сервисов и распространять атрибуты о пользователе. Этот протокол используется в крупных организациях, которые обеспечивают доступ ко множеству сервисов и нуждаются в высокой безопасности при передаче данных, особенно в корпоративных или B2B-сценариях.
Однако для более простых случаев авторизации пользователей в небольших веб-приложениях SAML может быть избыточным, а для аутентификации мобильных приложений или API лучше подходят протоколы OAuth 2.0 или OpenID Connect.
OpenID Connect
✏️ OpenID Connect, или OIDC, — это совместимый протокол аутентификации, основанный на структуре спецификаций OAuth 2.0 (IETF RFC 6749 и 6750). Он позволяет пользователям безопасно входить в веб-приложения и мобильные приложения через социальные или другие известные сервисы.
В отличие от SAML, который больше используется для корпоративной аутентификации в веб-приложениях, OIDC ориентирован на мобильные и современные веб-приложения с упрощённой интеграцией. Данные передаются совместимым и REST-подобным способом, что означает использование стандартных и простых для современных веб-приложений методов передачи данных через API.
Когда пользователь пытается войти в систему, проверка его личности передаётся на сторонний сервер авторизации. Этот сервер выполняет аутентификацию, а затем отправляет информацию о пользователе обратно приложению, которое запрашивало вход.
Яркий пример реализации OpenID Connect — вход в сторонние сервисы с использованием платформы «Госуслуги». Платформа предоставляет возможность пользователям авторизоваться на других сайтах и сервисах через их учётную запись на портале Госуслуг. OpenID Connect позволяет приложению или сайту делегировать процесс аутентификации серверу авторизации — в данном случае Госуслугам.
Когда говорят про OpenID Connect, часто подразумевают его использование в связке с OAuth, так как OpenID Connect был разработан как аутентификационный слой для протокола авторизации OAuth 2.0, но это разные протоколы и решают разные задачи. Также OpenID Connect упоминается в связке с JWT, так как стандарт использует их для передачи аутентификационной информации.
Процесс аутентификации по OpenID Connect в целом похож на флоу SAML.
Процесс аутентификации с использованием протокола OpenID Connect
Процесс аутентификации по OpenID Connect состоит из следующих шагов:
- Клиент обращается к ресурсу.
- Ресурс понимает, что клиент не прошёл аутентификацию, и пересылает его на IdP. Пользователь через клиент предоставляет свои креды.
- Клиенту возвращают id_token, в котором зашифрована информация о пользователе, — примерно как в SAML — список утверждений. Это часть аутентификации. Ещё часто возвращают access_token, но это уже часть авторизации — о ней речь пойдёт дальше в курсе.
- Ресурс может сделать REST-запрос в аутентификационный сервис за дополнительной информацией о пользователе с использованием выданного токена либо временного кода.
- Клиент использует токен для аутентифицированных запросов.
Особенности использования аутентификации по OpenID Connect
Плюсы протокола OpenID Connect
- OpenID Connect использует удобный и гибкий формат представления данных — JWT. Он позволяет делать дополнительные запросы на REST и получать больше информации. SAML, например, ограничен данными, которые передаются в XML, и для получения дополнительной информации требуется дополнительная настройка.
- Протокол OpenID Connect предоставляет большую гибкость — не только аутентификационную информацию, но и авторизационную.
- Может использоваться в разных типах приложений — не только веб, но и нативных.
- Проще в реализации, чем SAML.
- Встроенная поддержка сессий — можно использовать для них токен.
- Развитая экосистема — множество готовых реализаций, высокая поддержка в облачных сервисах.
Минусы протокола OpenID Connect
- Cвязан с протоколом авторизации OAuth2.0 — если применяется OpenID Connect, то должен применяться OAuth 2.0.
- Риски при неправильном хранении токенов.
Применение протокола Kerberos
✏️ Kerberos — это сетевой протокол аутентификации, разработанный для обеспечения безопасной аутентификации пользователей и сервисов в незащищённых сетях, таких как локальная сеть или интернет. Он использует метод «билетной» аутентификации, при котором пользователи получают временные токены (билеты) от сервера аутентификации, которые затем используются для доступа к различным сервисам без повторного ввода паролей.
Kerberos широко используется в корпоративных средах, таких как Active Directory, для обеспечения безопасного доступа к ресурсам.
Процесс аутентификации с использованием протокола Kerberos
- Пользователь вводит свои учётные данные (логин и пароль), и Kerberos аутентифицирует его через центральный сервер (Key Distribution Center, KDC).
- KDC проверяет учётные данные клиента и, если они верны, генерирует два билета:
- Билет предоставления (Ticket Granting Ticket, TGT) — билет, который позволяет клиенту в дальнейшем получать доступ к другим сервисам без повторной аутентификации.
- Сессионный ключ — секретный ключ, используемый для шифрования сообщений между клиентом и сервером.
- Когда пользователь хочет получить доступ к какому-либо сервису, он использует TGT для запроса сервисного билета. KDC проверяет TGT и, если он действителен, генерирует новый билет — сервисный. Он уже позволяет пользователю аутентифицироваться и взаимодействовать с нужным сервисом.
- Когда срок действия TGT истекает, клиент должен повторно пройти процесс аутентификации, чтобы получить новый TGT.
Особенности использования аутентификации по Kerberos
Плюсы протокола Kerberos
- Kerberos использует криптографию для защиты передаваемых данных, что снижает риск перехвата и подделки учётных данных.
- Отсутствие необходимости передавать пароли по сети повышает безопасность.
- Kerberos-сервер (KDC) выступает в качестве централизованного пункта аутентификации, упрощая администрирование.
- Администраторы могут легко контролировать доступ к ресурсам и управлять им.
- Kerberos хорошо масштабируется, позволяя обслуживать большое количество клиентов и серверов.
- Kerberos поддерживается различными операционными системами и приложениями. Например, в Active Directory в Microsoft.
Минусы протокола Kerberos
- Развёртывание и настройка Kerberos-инфраструктуры может быть трудоёмкой задачей, особенно в больших организациях.
- Kerberos-сервер (KDC) является критически важным компонентом, и его отказ может привести к нарушению работы всей системы.
- Kerberos требует синхронизации времени между клиентами и серверами, что может быть проблематично в распределённых средах.
- Kerberos не всегда хорошо интегрируется с мобильными устройствами, что может затруднять их использование в корпоративной среде.
- Интеграция Kerberos с другими системами аутентификации, такими как LDAP или Active Directory, может быть сложной задачей.
Kerberos является надёжным и безопасным протоколом аутентификации, но его внедрение и поддержка требуют определённых усилий и ресурсов.
Как обычно, однозначного ответа на этот вопрос не существует. Выбор зависит от архитектуры вашей системы, уровня безопасности и удобства.
- SAML подходит для организаций с большими корпоративными приложениями и сложными схемами доверия, часто используется для интеграции с облачными сервисами.
- OpenID Connect идеален для современных веб- и мобильных приложений, обеспечивает гибкую аутентификацию и хорошую интеграцию с OAuth 2.0.
- Kerberos лучше всего подходит для локальных сетей и корпоративной среды, где необходимо управление доступом с высоким уровнем безопасности и с использованием билетов.
Задание 1
Соотнесите описанные ситуации с подходящим механизмом предоставления доступа к данным.
Сотрудник юридического отдела вводит свой логин в систему
Идентификация
При вводе логина пользователь идентифицирует себя с аккаунтом сотрудника юридического отдела.
Аналитик в банке работает над проектом, связанным с мошенничеством. Система предоставляет ему доступ только к тем данным, которые произведены в последние 30 дней и помечены как подозрительные
Авторизация
В данном случае речь о персональных данных. Для них настраивается доступ так, чтобы сотрудники имели возможность просматривать только данные, необходимые им для выполнения задач. Для этого надо быть авторизованным на эти действия.
Менеджеру проекта требуется ввести код доступа с устройства OTP, который меняется каждые 30 секунд
Аутентификация
Это пример аутентификации — сотрудник должен подтвердить, что он действительно работает в данной компании, а не кто-то другой вводит его логин и пароль.
Системный администратор сканирует свой бейдж перед дверью для входа в серверную, в котором содержится информация о его имени и фамилии
Идентификация
В данном случае речь про идентификацию. Всё зависит от шага: если бы сотруднику после этого нужно было отсканировать биометрические данные, то указанная ситуация была бы примером аутентификации. А если бы система проверяла наличие у специалиста права для доступа к серверной, то это называлось бы авторизацией.
Задание 3
Перенесите утверждения к протоколам аутентификации, для которых они характерны.
Имеет низкий объём документа и легко читается
OpenID Connect
OpenID Connect за счёт использования JSON Web Tokens (JWT) обладает низким объёмом, что упрощает разработчикам его чтение.
Работает только с веб-приложениями
SAML
Протокол SAML нельзя использовать для мобильных и десктоп-приложений. Для этого подойдёт, например, OpenID Connect.
Позволяет проходить аутентификацию без передачи паролей
Kerberos
Kerberos использует технологию «билетов» для аутентификации. Это позволяет пользователям доказывать свою идентичность без необходимости передачи пароля по сети.
Обладает высокой масштабируемостью
SAML
Протокол имеет высокую масштабируемость и ввиду этого преимущества широко используется в крупных организациях.
Проще во внедрении и поддержке, чем другие протоколы
OpenID Connect
OpenID Connect за счёт большого количества реализаций и развитого сообщество проще внедрить и поддерживать, чем другие протоколы.
Позволяет сотрудникам компаний быстро проходить аутентификацию в корпоративных сетях
Kerberos
Kerberos использует симметричное шифрование и доверенные третьи стороны, что обеспечивает быструю и безопасную аутентификацию в защищённых корпоративных сетях.
Задание 4
Выберите подходящий под описанные условия протокол аутентификации.
Производственная компания запускает учебный портал для своих сотрудников. В штате 2000 работников. Всё производство находится в одном месте, и сотрудники работают офлайн. Пользуются ПК на базе ОС Windows.
Kerberos
Kerberos отлично подходит для применения в корпоративных сетях и системах, работающих в домене Windows. Поскольку численность сотрудников относительно небольшая, то сложностей с настройкой не возникнет.
Стартапу необходимо в короткие сроки обеспечить безопасную аутентификацию и авторизацию к веб-приложению по заказу продуктов из магазинов
OpenID Connect
Наиболее прост в реализации протокол OpenID Connect. Он имеет развитое сообщество и множество готовых реализаций, поэтому подойдёт для описанных условий.
Крупная организация разрабатывает веб-приложение. Требуется обеспечить аутентификацию с поддержкой разных уровней доверия сервисам
SAML
SAML подходит для веб-приложений, где требуется аутентификация через внешние службы и поддержка SSO для нескольких веб-сервисов.
Компания развивает мобильные приложения и веб-сервисы. Нужно организовать централизованную систему единого входа для пользователей, чтобы они могли входить в разные приложения с использованием одной учётной записи
OpenID Connect
OpenID Connect, благодаря поддержке OAuth 2.0 и REST, является оптимальным решением для мобильных и веб-приложений, поддерживая сессии и JWT токены.
Что почитать про протоколы аутентификации
SAML
- Примеры SAML-протоколов
- Clowdflare — один из провайдеров, предоставляющих SAML-аутентификацию.
- Видео с техническим обзором реализации SAML 2.0
- Описание флоу работы SAML
- Технологический обзор возможностей SAML от комьюнити, которое его использует
- Cпецификации по SAML
OpenID Connect
Kerberos
WebAuthn
Самостоятельно вы можете познакомиться с ещё одним способом аутентификации — WebAuthn. Он предоставляет возможность входа в аккаунт с использованием электронных ключей вместо паролей.
- Официальный сайт технологии WebAuthn
- Web Authentication API — документация, поддерживаемая сообществом Mozilla
- Beyond Passwords: How WebAuthn Actually Works — видео с описанием работы WebAuthn
Итоги
- Single Sign-On (SSO) — это механизм, позволяющий пользователям аутентифицироваться один раз и получать доступ ко многим приложениям без повторного ввода учётных данных. Это повышает удобство и безопасность. Для реализации SSO используются различные протоколы аутентификации, включая SAML, OpenID Connect и Kerberos.
- SAML (Security Assertion Markup Language) — один из протоколов аутентификации. При входе пользователя запрос аутентификации отправляется на IdP (Identity Provider), который проверяет учётные данные и возвращает XML-утверждение (assertion) об аутентификации. Пользователь получает доступ к запрашиваемому ресурсу, используя это утверждение для подтверждения своей личности.
- OpenID Connect — это протокол, основанный на OAuth 2.0. Когда пользователь пытается войти в систему, его личность проверяется на внешнем сервере авторизации. Этот сервер осуществляет аутентификацию, и затем пользователю возвращается токен доступа и идентификационный токен, содержащий информацию о пользователе. Эти токены используются для авторизации и доступа к ресурсам приложения.
- Kerberos использует систему билетов для аутентификации пользователей в сетях. При входе пользователь получает билет на аутентификацию от KDC (Key Distribution Center). Этот билет позволяет пользователю получить доступ к сервисам без повторного ввода пароля. Kerberos обеспечивает безопасность с помощью симметричного шифрования и временных меток, что делает его подходящим для корпоративных сетей.