[Информационная безопасность] Добавьте SMS аутентификацию в ваше приложение

Автор Сообщение
news_bot ®

Стаж: 6 лет 7 месяцев
Сообщений: 27286

Создавать темы news_bot ® написал(а)
12-Сен-2020 07:30


В комментариях к предыдущей статье, задавали вопросы как организовать многофакторную аутентификацию, используя текстовые сообщения (SMS), предпочтительно бесплатно для владельца приложения/системы.
В этой статье я опишу одну из опций как добиться этого «без регистрации и СМС» (хотя конечно и с регистрацией и тем более СМС, но зато бесплатно и без проблем!)
Если вы используете в качестве хостинга одну из облачных платформ (AWS/Azure/Google Cloud), то конечно имеет смысл использовать сервис предоставляемый этой платформой.
Если же нет, то можно попробовать воспользоваться сервисом предоставляемым одним из лидером в области систем аутентификации Okta.
Если у вас менее чем 1000 активных пользователей в месяц и не более пяти приложений, вы можете создать аккаунт разработчика и вам будут доступны все возможности системы, совершенно бесплатно. Особо одарённые резонно отметят, что можно создать несколько аккаунтов и организовать шардинг для ваших пользователей и они будут правы (тем более для создания аккаунта и его использования, не требуется предоставлять персональные данные или кредитную карту), но я думаю что если у вас достаточно большое количество пользователей, то можно и выделить бюджет для платного аккаунта.
Система предоставляет множество возможностей, включая поддержку OAuth/OIDC/SAML и множество раcширенных опций для интеграции.
Например, если вы хотите предоставить онлайн сервисы для корпораций, то Okta это фактически монополист на рынке для реализации single-sign on. Если вы реализуете SAML service provider и зарегистрируете свой сервис на Okta, корпорация сможет предоставить услуги вашего сервиса для своих сотрудников совершенно прозрачно, т.е. им не надо будет создавать аккаунты или проходить дополнительную аутентификацию на вашем сервисе.
Аутентифицируясь один раз в своей корпоративной сети они смогут мгновенно иметь доступ к вашему сервису. Администрирование со стороны админов тоже превращается в простейшую операцию, добавив пользователя в группу в корпоративной системе, он даёт пользователю возможность работать со сторонним сервисом. Сравните с тем как это было организованно раньше — выгрузка списков пользователей, синхронизация между системами, периодический аудит что ничего не рассинхронизировалось и т.п.
Воистину, сложно переоценить удобство подобной функциональности и как следствие дополнительную привлекательность вашего сервисе по сравнению с конкурентами. Можно посмотреть список уже существующих сервисов и тогда поймёте что подобная функциональность это не будущие, а уже настоящее.
Но цель данной статьи не воспевать хвалебные оды для Okta, а рассмотреть сценарий интеграции фактора аутентификации SMS в ваше приложение.
Мы рассмотрим пример когда у вас есть приложение с уже существующей базой пользователей и вы хотите добавить дополнительную защиту. Т.е. либо вы не доверяете первичную аутентификацию (username/password) сервису Okta, либо хотите внести только минимальные, точечные изменения.
Регистрация аккаунта
Первый шаг это регистрация акаунта. Для этого примера я создал мусорного пользователя на gmail и зарегистрировал аккаунт разработчика на него, это было едиственное что потребовалось для получения аккаунта в Okta. Открываем в браузере страницу регистрации и заполняем требуемые поля.

После верификации почты, вы станете счастливым обладателем аккаунта типа https://dev-71250.okta.com, открыв подобную ссылку браузере и аутентифицируясь, вы увидете консоль управления.

Я рекомендую переключиться в режим «Classic UI» из режима «Developer Console», мне было более комфортно работать в этом режиме.
Создание приложения
Создание приложения опционально для целей простейшего сценария, но полезно если вы хотите назначить policy или реализовать дополнительные возможности.
Из меню Applications выбираем подпункт Applications и нажимаем конопку “Add Application” и на следующем экране нажать ещё одну кнопку “Create New App”.

Если вы сделали всё правильно то увидете что-то подобное:

Создание токена
Следующий шаг, это создание токена для управления функциональностью Okta используя REST API.

Выбираем пункт меню Security и подпункт API, после этого выбираем вкладку Tokens, нажимаем кнопку «Create Token», вводим имя токена описывающего ваше приложение и нажимаем еще одну «Create Token» кнопку.

В моём случае он был типа 0051TT-oaWLfFbq2trgppk2D1dJ3vrYykU и вы должны его использовать при API вызовах в заголовке Authorization (замените его на ваш)
Authorization: SSWS 0051TT-oaWLfFbq2trgppk2D1dJ3vrYykU
Сохраните токен в секретное место, используя этот токен, вы сможете программно управлять фактически всеми настройками вашего аккаунта.
Активация SMS в качестве фактора аутентификации
Следующий шаг после создания токена, это активация SMS в качестве дополнительного фактора.
Переходим в меня Security, подпункт Multifactor выбираем SMS Authentication и меняем статус на Active.

Импорт/создание пользователей
Последний шаг в конфигурации, это импорт текущей базы пользователей.
Есть несколько способов создать аккаунты пользователей, включая синхфронизацию из LDAP. Мы рассмотрим два наиболее простых, импортировать из CSV файла и создать пользователей используя API.
Чтобы импортировать из CSV файла, перейдите в меню Directory, подпункт People, нажмите на опцию More Actions и выберите пункт Import Users from CSV.

Пример CSV файла в правильном формате можно загрузить нажав ссылку «this template».

Можно выбрать опцию «Automatically activate new users» чтобы все пользователи автоматически были активированны.

Если всё прошло успешно, то вы увидите импортированных пользователей в списке. Если произошли ошибки в течении импорта, вы сможете загрузить отчёт с детальным описанием проблем импорта.
Второй способ, это создание пользователей програмно используя вызов API create-user-with-password.
Можно создать пользователей используя случайные пароли, чтобы не требовалось дополнительных действий для активации. Пример вызова используя curl (я использую его для простоты демонстрации, но точно также, вызов REST API это фактически пара-тройка строк для вызова HTTP запроса в любом языке программирования):
curl -v -X POST -H "Accept: application/json" -H "Content-Type: application/json" -H "Authorization: SSWS 0051TT-oaWLfFbq2trgppk2D1dJ3vrYykU" -d '{ "profile": { "firstName": "Isaac", "lastName": "Brock", "email": "isaac.brock@mytest.com", "login": "isaac.brock@mytest.com" }, "credentials": { "password" : { "value": "tlpWENT2m344" } } }' https://dev-72150.okta.com/api/v1/users?activate=true
Вы получите подтверждение в JSON
{
  "id":"00uxwl899jsEO8DEy4z6",
  "status":"ACTIVE",
  "created":"2020-09-11T23:11:20.000Z",
  "activated":"2020-09-11T23:11:20.000Z",
  "statusChanged":"2020-09-11T23:11:20.000Z",
  "lastLogin":null,
  "lastUpdated":"2020-09-11T23:11:20.000Z",
  "passwordChanged":"2020-09-11T23:11:20.000Z",
  "type":{"id":"otyxv3zumCroBcUlu4x6"},
  "profile":{"firstName":"Isaac","lastName":"Brock","mobilePhone":null,"secondEmail":null,"login":"isaac.brock@mytest.com","email":"isaac.brock@mytest.com"},
  "credentials":{"password":{},"emails":[{"value":"isaac.brock@mytest.com","status":"VERIFIED","type":"PRIMARY"}],
  "provider":{"type":"OKTA","name":"OKTA"}},
  "_links":{
    "suspend":{"href":"https://dev-72150.okta.com/api/v1/users/00uxwk7e3GKMn4tBF4x6/lifecycle/suspend","method":"POST"},
    "schema":{"href":"https://dev-72150.okta.com/api/v1/meta/schemas/user/oscxv3zumCroBcUlu4x6"},
    "resetPassword":{"href":"https://dev-72150.okta.com/api/v1/users/00uxwk7e3GKMn4tBF4x6/lifecycle/reset_password","method":"POST"},
    "expirePassword":{"href":"https://dev-72150.okta.com/api/v1/users/00uxwk7e3GKMn4tBF4x6/lifecycle/expire_password","method":"POST"},
    "changeRecoveryQuestion":{"href":"https://dev-72150.okta.com/api/v1/users/00uxwk7e3GKMn4tBF4x6/credentials/change_recovery_question","method":"POST"},
    "self":{"href":"https://dev-72150.okta.com/api/v1/users/00uxwk7e3GKMn4tBF4x6"},"type":{"href":"https://dev-72150.okta.com/api/v1/meta/types/user/otyxv3zumCroBcUlu4x6"},
    "changePassword":{"href":"https://dev-72150.okta.com/api/v1/users/00uxwk7e3GKMn4tBF4x6/credentials/change_password","method":"POST"},
    "deactivate":{"href":"https://dev-72150.okta.com/api/v1/users/00uxwk7e3GKMn4tBF4x6/lifecycle/deactivate","method":"POST"}
  }
}

В дальнейшем при создании пользователя в вашей системе, необходимо создать соотвествующего пользователя и в Okta используя один из возможных способов.
Также, при удалении пользователя, необходимо удалить пользователя и из Okta.
Для удаления пользователя необходимо сначала перевести его в состоянии деактивации используя API вызов deactivate-user, а после этого можно удалить окончательно, используя API вызов delete-user.
На этом подготовительные шаги закончены и можно приступать к самому интересному.
Вам будет необходимо изменить свою систему/приложение так, чтобы она научилась поддерживать использование второго фактора. В самом простом случае, это вызов нескольких REST API методов.
Подключение SMS фактора для пользователя
Поддержка состоит из первичного подключения SMS фактора для конкретного аккаунта, активации и собственно верификации этого фактора.
После того как все изменения внесены, пользователи вашей системы должны выполнить одноразовую, первичную регистрацию и подтверждение активации. В дальнейшем, если у пользователя изменился номер мобильного, необходимо повторить подобный процесс.
Id пользователя можно сохранить после вызова API для создания пользователя, либо его можно получить используя вызов API get user.
Для первичного подключения делаем вызов API
curl -v -X POST -H "Accept: application/json" -H "Content-Type: application/json" -H "Authorization: SSWS 0051TT-oaWLfFbq2trgppk2D1dJ3vrYykU" -d '{ "factorType": "sms", "provider": "OKTA", "profile": { "phoneNumber": "+7 945-500-6000" } }' "https://dev-72150.okta.com/api/v1/users/00uxwl899jsEO8DEy4z6/factors"
Здесь и далее:
72150 — id вашего сайта в Okta
0051TT-oaWLfFbq2trgppk2D1dJ3vrYykU — это ваш API токен.
00uxwl899jsEO8DEy4z6 — это id пользователя.
Получаем подтверждение JSON
{
  "id":"mblxwleaf79ugvCvG4x6",
  "factorType":"sms",
  "provider":"OKTA",
  "vendorName":"OKTA",
  "status":"PENDING_ACTIVATION",
  "created":"2020-09-11T23:02:06.000Z",
  "lastUpdated":"2020-09-11T23:02:06.000Z",
  "profile":{"phoneNumber":"+79455006000"},
  "_links":{
    "resend":[{"name":"sms","href":"https://dev-72150.okta.com/api/v1/users/00uxwl899jsEO8DEy4z6/factors/mblxwleaf79ugvCvG4x6/resend","hints":{"allow":["POST"]}}],
    "activate":{"href":"https://dev-72150.okta.com/api/v1/users/00uxwl899jsEO8DEy4z6/factors/mblxwleaf79ugvCvG4x6/lifecycle/activate","hints":{"allow":["POST"]}},
    "self":{"href":"https://dev-72150.okta.com/api/v1/users/00uxwl899jsEO8DEy4z6/factors/mblxwleaf79ugvCvG4x6","hints":{"allow":["GET"]}},"user":{"href":"https://dev-72150.okta.com/api/v1/users/00uxwl899jsEO8DEy4z6","hints":{"allow":["GET"]}}
  }
}

Значение «id» будет необходимо использовать в вызове активации.
После чего посылаем запрос на активацию
curl -v -X POST -H "Accept: application/json" -H "Content-Type: application/json" -H "Authorization: SSWS 0051TT-oaWLfFbq2trgppk2D1dJ3vrYykU" -d '{ "passCode": "519138" }' "https://dev-72150.okta.com/api/v1/users/00uxwl899jsEO8DEy4z6/factors/mblxwleaf79ugvCvG4x6/lifecycle/activate"
Получаем подтверждение в JSON
{
  "id":"smsxwkq8xAO2Z8btF4x6",
  "factorType":"sms",
  "provider":"OKTA",
  "vendorName":"OKTA",
  "status":"ACTIVE",
  "created":"2020-09-11T23:03:28.000Z",
  "lastUpdated":"2020-09-11T23:03:28.000Z",
  "profile":{"phoneNumber":"+79455006000"},
  "_links":{
    "self":{"href":"https://dev-72150.okta.com/api/v1/users/00uxwl899jsEO8DEy4z6/factors/smsxwkq8xAO2Z8btF4x6","hints":{"allow":["GET","DELETE"]}},
    "verify":{"href":"https://dev-72150.okta.com/api/v1/users/00uxwl899jsEO8DEy4z6/factors/smsxwkq8xAO2Z8btF4x6/verify","hints":{"allow":["POST"]}},
    "user":{"href":"https://dev-72150.okta.com/api/v1/users/00uxwl899jsEO8DEy4z6","hints":{"allow":["GET"]}}
  }
}

«id» фактора (в нашем случае «smsxwkq8xAO2Z8btF4x6») можно сохранить, либо его можно получить для конкретного пользователея используя вызов API list-enrolled-factors.
Верификация пользователя используя SMS код
После того как первичное подключение было успешно завершено и фактор активирован, можно начинать его использование в повседневной работе. SMS фактор работает для всех стран и единственное ограничение, что посылка SMS может быть не чаще чем 30 секунд для пользователя. (т.е. несколько пользователей могут посылать одновременно, но перепослать для того кому только что была отправлена SMS можно только после 30 секундного интервала.
Для верификации фактора, сначала необходимо отправить запрос на отсылку кода
curl -v -X POST -H "Accept: application/json" -H "Content-Type: application/json" -H "Authorization: SSWS 0051TT-oaWLfFbq2trgppk2D1dJ3vrYykU" -d '{ }' "https://dev-72150.okta.com/api/v1/users/00uxwl899jsEO8DEy4z6/factors/smsxwkq8xAO2Z8btF4x6/verify"
В случае успеха вы получите подтверждение в JSON
{
  "factorResult":"CHALLENGE",
  "profile":{"phoneNumber":"+79455006000"},
  "_links":{
      "verify":{"href":"https://dev-72150.okta.com/api/v1/users/00uxwl899jsEO8DEy4z6/factors/smsxwkq8xAO2Z8btF4x6/verify","hints":{"allow":["POST"]}},
     "factor":{"href":"https://dev-72150.okta.com/api/v1/users/00uxwl899jsEO8DEy4z6/factors/smsxwkq8xAO2Z8btF4x6",
     "hints":{"allow":["GET","DELETE"]}}
  }
}

После этого отсылается запрос на проверку полученного кода
curl -v -X POST -H "Accept: application/json" -H "Content-Type: application/json" -H "Authorization: SSWS 0051TT-oaWLfFbq2trgppk2D1dJ3vrYykU" -d '{ "passCode": "213199" }' "https://dev-72150.okta.com/api/v1/users/00uxwl899jsEO8DEy4z6/factors/smsxwkq8xAO2Z8btF4x6/verify"
При успешном завершении проверки вы получите JSON с подтверждением
{"factorResult":"SUCCESS"}

При ошибке, JSON с деталями ошибки
{
  "errorCode":"E0000082",
  "errorSummary":"Each code can only be used once. Please wait for a new code and try again.",
  "errorLink":"E0000082",
  "errorId":"oaeNyUSSDUkRvmgoN5TsW-zKw",
  "errorCauses":[{"errorSummary":"Each code can only be used once. Please wait for a new code and try again."}]
}

Заключение
Пример в данной статье продемонстрировал возможность легкого и бесплатного использования дополнительных факторов аутентификации для вашего приложения с небольшой пользовательской базой (до тысячи активных пользователей в месяц).
Выполнив начальную конфигурацию и используя несколько простых HTTP вызовов можно включить SMS аутентификацию в своё приложение.
Существует реализация open source клиента для Okta на многих языках, но в принципе можно обойтись и прямыми HTTP вызовами, особенно если вы планируете ограничится только поддержкой SMS.
На данный момент поддерживается несколько дополнительных факторов и Okta позволяет использовать любые комбинации которые вы захотите (если разрешит ваш админ или СБ):
  • Okta Security Question Factor
  • Okta SMS Factor
  • Okta Call Factor
  • Okta Verify TOTP Factor
  • Okta Verify Push Factor
  • Google Authenticator Factor
  • RSA SecurID Factor
  • Symantec VIP Factor
  • Upload YubiKey Seed
  • YubiKey Factor
  • Okta Email Factor
  • U2F Factor
  • WebAuthn Factor
  • Custom HOTP Factor

Например Call фактор, позволяет проводить верификацию используя голосовые звонки, так что даже пользователи без мобильных телефонов смогут произвести верификацию.
Если вы хотите использовать только TOTP факторы (типа Google Authenticator и т.п.), то можно не городить интеграцию с Okta, а добавить реализацию для вашего языка (обычно не больше пары сотен строк кода) и проводить проверку без зависимости от сторонних сервисов. Только не забудьте шифровать пользовательские secret перед сохранением!
Детальная документация расположенна на https://developer.okta.com/docs/.
Исходный код клиента для многих языков можно найти на https://github.com/okta.
Я не являюсь сотрудником Okta и не получаю выгоду от его использования. Также, не являюсь экспертом в системах безопасности, но мере возможности отвечу на ваши вопросы относительно реализации и использования дополнительных факторов аутентификации. Либо на вопросы о других возможностях сервисов Okta.
Надеюсь что данная статья поможет сделать онлайн сервисы чуть более надёжными, а мир чуточку лучше.
===========
Источник:
habr.com
===========

Похожие новости: Теги для поиска: #_informatsionnaja_bezopasnost (Информационная безопасность), #_okta_sms_mfa_second_factor, #_informatsionnaja_bezopasnost (
Информационная безопасность
)
Профиль  ЛС 
Показать сообщения:     

Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы

Текущее время: 28-Сен 15:23
Часовой пояс: UTC + 5