Аутентификация в информационной системе обычно происходит через логин и пароль. Логин служит для идентификации пользователя, а пароль — для подтверждения логина. Такая схема использовалась годами, однако со временем проблема кражи личности приобрела такие масштабы, что потребовался дополнительный уровень защиты — многофакторная аутентификация (multi-factor authentication, MFA).
Смысл MFA в том, что идентификация пользователя происходит по нескольким независимым каналам (факторам) и когда результат по всем положительный, система успешно завершает процесс аутентификации.
Факторы делятся на несколько классов и для MFA должны использовать как минимум два, причём все они должны быть из разных классов. Предполагается, что у злоумышленника не может быть доступа одновременно ко всем факторам.
Вот эти классы:
- нечто, имеющееся у вас — некий физический объект в вашем распоряжении: смарт-карта, токен авторизации, ключ (от замка), пропуск и т.п.;
- то, что вы знаете — пароль или пин-код;
- то, чем вы являетесь — какие-нибудь физические характеристики вашего тела, биометрия (отпечаток пальца, сетчатки и т.п.);
- то, где вы находитесь — ваше местоположение, либо географическое (например, определённое GPS/GLONASS/ec), либо сетевое (tcp/ip подсеть).
В простейшей схеме двухфакторной аутентификации (2FA) используется фактор то, что вы знаете в виде логина и пароля, фактор нечто, имеющееся у вас в виде одноразовых кодов, которые нужно вводить вместе с логином и паролем. Исторически использовался первый фактор нечто, имеющееся у вас в виде небольшого устройства с генератором кодов, при входе в систему нужно было ввести код с экрана устройства.
© Mateusz Adamowski, source
Самым популярным в обычном мире стала разновидность токена в виде SMS с кодом, отправлямым на мобильный телефон пользователя. Такой способ очень очень удобен, но очень небезопасен. Компромиссом между удобством (смартфон) и безопасностью (аппаратный токен) стали мобильные приложения на смартфоне, выполняющие роль генератора кодов.
Самым массовым таким приложением является Google Authenticator, реализующий простой и открытый алгоритм TOTP. Алгоритм этот очень простой и красивый, коротко его можно описать так:
- сервис генерирует общий секретный ключ и каким-то образом передаёт его пользователю, эта операция делается всего один раз и больше никогда не повторяется, обычно секретный код можно прямо с экрана ввести в приложение в виде QR-кода, либо ввести непосредственно руками;
- секретный ключ вставляется в TOTP-приложение и больше никогда не показывается пользователю;
- для аутентификации сервер генерирует проверочный код на основе секретного ключа и текущего времени, округлённого до 30 секунд;
- пользователь открывает приложение и вводит тот код, который показывается на экране, этот код по такому же алгоритму генерируется и обновляется каждые 30 секунд;
- если коды совпадают, аутентификация успешно завершается.
Единственным «тонким» моментом в этой схеме является процесс изначальной синхронизации секретного ключа, лучше всего это делать каким-нибудь защищённым способом. Если этот ключ «утечёт», то злоумышленник получает контроль над этим «токеном». Впрочем, схема (как и многие другие с передачей кода) подвержена MITM-атаке.
❈ ❈ ❈
Почему 2FA SMS — это всегда плохая идея. SMS — это исключительно ненадёжный канал для передачи такого рода данных, ваш номер злоумышленники могут просто украсть через поддельный паспорт, сотрудники сотового оператора могут получить к ним доступ и так далее.
❈ ❈ ❈
Отдельно хочется отметить биометрию. Отпечаток пальца, отпечаток сетчатки и прочее потенциально можно подделать, можно воспользоваться уязвимостями оборудования. Поэтому хорошим тоном считается использование биометрии в качестве «логина», а не «пароля». Другими словами, вы предоставляете системе свою «биометрию», а потом через другие факторы её подтверждаете.