Лучшие практики для создания безопасных систем аутентификации IOS

Введение

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

Реализация сильных методов аутентификации

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

Многофакторная аутентификация (MFA)

MFA объединяет два или более независимых фактора: что-то, что пользователь знает (пароль), что у него есть (доверенный токен устройства или аппаратного обеспечения), и что-то, что они (биометрические). Для приложений iOS интеграция MFA может быть достигнута с помощью одноразовых паролей (TOTP), генерируемых приложениями аутентификации, запросов на одобрение на основе push-связи или кодов SMS (хотя SMS все чаще отклоняется из-за атак SIM-обмена). Рамка Apple AuthenticationServices поддерживает ASAuthorizationController для управления потоками MFA, но вы должны тщательно обрабатывать сроки службы токенов и аутентификацию на основе риска. Например, требуйте MFA только во время действий с высоким риском (например, изменения паролей или доступ к конфиденциальным данным), чтобы избежать трений во время обычных входов.

OAuth 2.0 и OpenID Connect

Вместо создания пользовательского бэкэнда аутентификации, используйте отраслевые стандарты, такие как OAuth 2.0 и OpenID Connect. Эти протоколы позволяют вашему приложению делегировать аутентификацию доверенным поставщикам (Apple, Google или ваш собственный сервер авторизации) при сохранении четкого контроля над областями и разрешениями. При реализации OAuth 2.0 на iOS используйте ASWebAuthenticationSession или более новый ASAuthorizationController для представления безопасных, управляемых системой сессий браузера. Это предотвращает перехват учетных данных вредоносными приложениями и гарантирует пользователям видеть законную страницу входа провайдера. Всегда применяйте расширение Proof Key for Code Exchange (PKCE) для публичных клиентов, таких как мобильные приложения — это смягчает атаки перехвата кода авторизации, даже если перенаправление URI скомпрометировано.

Узнайте больше о PKCE и его важности для мобильных приложений .

Безопасное хранение учетных данных

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

Услуги Keychain

iOS Keychain является наиболее безопасным местом для хранения небольших кусков конфиденциальных данных, таких как пароли, токены аутентификации и криптографические ключи. В отличие от пользовательских по умолчанию или простых файлов, записи Keychain зашифрованы в покое с помощью аппаратного ключа, который привязан к защищенному Enclave устройства. При сохранении токена используйте соответствующий kSecClass (например, kSecClassGenericPassword (например, kSecAttrAccessible атрибут kSecAttrAccessible) атрибут , чтобы гарантировать, что данные могут быть расшифрованы только при разблокировке устройства и наборе пароля, и он не может быть сохранен или перенесен на другое устройство. UserDefault

Документация Apple по ключевым сервисам

Приложение Sandbox и защита данных

Помимо Keychain, принудительное обеспечение API защиты данных iOS на уровне файлов. При создании файлов в каталогах Documents или Caches установите класс защиты файлов в NSFileProtectionCompleteUnlessOpen или, для большей безопасности, NSFileProtectionComplete (доступен только при разблокировке устройства). Это использует тот же аппаратный механизм шифрования, что и Keychain, и гарантирует, что даже слой файловой системы зашифрован. Кроме того, настройте Info.plist приложения, чтобы включить «Защиту файлов до первой аутентификации пользователя» для расширения шифрования на сетевые соединения и кэши диска.

Управление криптографическими ключами

Если ваша система аутентификации использует цифровые подписи, эфемерные ключи или симметричное шифрование, генерируйте и храните эти ключи с помощью Secure Enclave, когда это возможно. API SecKey позволяет создавать ключи с эллиптической кривой (например, P-256), которые никогда не покидают Secure Enclave. Это делает их устойчивыми к извлечению даже с компромиссом уровня ядра. Для ключей, которые должны использоваться в памяти, всегда обнуляйте их после использования и избегайте сериализации в небезопасных местах.

Используйте биометрическую аутентификацию

Touch ID и Face ID предлагают сочетание сильной безопасности и отличного пользовательского опыта.Выгружая ввод пароля в биометрическую проверку, вы уменьшаете поверхность атаки фишинга и закладки ключей, одновременно снижая трение для возвращающихся пользователей.

Интеграция локальной аутентификации

Рамки Apple LocalAuthentication обеспечивают стандартный интерфейс для оценки биометрических политик.LAContext с политикой evaluatePolicy:LAPolicyDeviceС биометрическими данными. Всегда предоставляйте локализованную строку причины, которая четко описывает, почему приложение нуждается в аутентификации (например, «Подписаться на свою учетную запись»). Для современных устройств предпочтение надежному отображению глубины Face ID — значительно сложнее подделать, чем Touch ID. Однако, спроектируйте свой запас изящно: если биометрические данные не зарегистрированы или не работают (например, пользователь носит маску лица), подсказка для пароля приложения или пароля устройства с использованием LAPolicyDeviceOwnerAuthentication.

Лучшие практики для биометрически защищенных токенов

Do notnot store the biometric template itself — it is handled by the Secure Enclave and never exposed to the app. Вместо этого храните токен доступа внутри Keychain с списком управления биометрическим доступом (ACL). Прикрепите объект SecAccessControlkSecAccessControlControlCurrentSet или kSecAccessControlUserPresence. Эта конфигурация гарантирует, что токен может быть получен только после успешного биометрического сканирования. Имейте в виду, что при регистрации нового пальца или изменении данных Face ID существующие биометрические элементы ACL становятся недоступными (если вы не используете kSecAccessControlBiometryAny, что является менее безопасным).

Документация Apple по локальной аутентификации

Внедрение правильного управления сеансом

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

Сеансы на основе токенов

Предпочтите пары токенов-носителей oAuth 2.0: токен доступа (краткосрочный, обычно 15-60 минут) и токен обновления (более длительный, например, 30 дней). Храните оба в Keychain с соответствующим контролем доступа. Никогда не разоблачайте токены доступа в строках запросов URL; передайте их только через заголовок Авторизация Схема Предъявитель . Когда токен доступа истекает, приложение может бесшумно использовать токен обновления для получения нового, не прерывая пользователя. Однако, реализуйте вращение токена обновления (каждый запрос обновления возвращает новый токен обновления и аннулирует старый), чтобы ограничить влияние украденного токена длительного срока действия.

Отзыв и выход

Обеспечить четкий механизм выхода из системы, который делает недействительными токены как локально, так и на стороне сервера. На устройстве немедленно удалить токены из Keychain. На сервере поддерживать список разрешений (или список отзыва токенов), чтобы серверные службы отклоняли любой отмененный токен. Для максимальной безопасности используйте привязку токена (например, требование JWT «cnf» с открытым ключом) для привязки токена к конкретному устройству или паре ключей — это предотвращает использование украденного токена в другом месте.

Время ожидания и бездействие

Внедрить неработающие тайм-ауты сеанса, которые автоматически выводят пользователей из системы после периода бездействия (например, 15 минут для финансовых приложений). Рассмотрим мягкий тайм-аут, который блокирует приложение локально, но сохраняет сеанс до тех пор, пока пользователь не введет короткий PIN-код или биометрическое сканирование. Это уравновешивает безопасность с удобством использования. Кроме того, выявляет аномалии сеанса с использованием отпечатков пальцев устройства (IP-адрес, пользовательский агент) и принудительной повторной аутентификации при увеличении оценки риска.

Безопасное хранение токенов

Мы уже рассмотрели хранилище Keychain, но обратите внимание, что маркеры обновления никогда не должны отправляться в ненадежные среды. Если ваше приложение использует веб-просмотр для аутентификации, убедитесь, что JavaScript не может получить доступ к маркерам через document.cookie (установите HttpOnly и SameSite=Strict флаги на файлах cookie, используемых сервером). Для нативных токенов всегда используйте Keychain с атрибутом kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly , который предотвращает извлечение, если устройство разблокировано после перезагрузки.

Обеспечить безопасную связь

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

Транспортная безопасность (ATS)

Apple по умолчанию применяет ATS в iOS 9 и более поздних версиях, требуя HTTPS-соединения, которые соответствуют современным стандартам безопасности. Вы никогда не должны добавлять исключения в NSAppTransportSecurity (если только это не абсолютно необходимо для устаревших сторонних сервисов и только после тщательного анализа). Всегда устанавливайте NSAllowsArbitraryLoads в NO. Для собственных конечных точек API используйте TLS 1.3 с прямой секретностью. Убедитесь, что ваш сервер поддерживает сильный набор шифров (например, TLS AES 128 GCM SHA256) и отключите слабые шифры.

Сертификат Пиннинг

Даже с HTTPS скомпрометированный орган по сертификации (CA) может выдать мошеннический сертификат для вашего домена. Внедрить прикрепление сертификата путем встраивания открытого ключа сервера (или хэша сертификата) в двоичный файл приложения. Используйте метод делегирования NSURLSssion URLSession: URLSession:didReceiveChallenge:completionHandler: для проверки прикрепленного ключа к представленному сертификату сервера. Не прикрепляйте к самому сертификату листа (он должен обновляться ежегодно), а к открытому ключу промежуточного CA. Альтернативный подход заключается в использовании библиотеки TrustKit , но помните об обновлениях приложений при изменении прикрепляющего ключа.

Передача токенов

Всегда отправляйте токены через соединение HTTPS. Никогда не включайте токены в строку пути или запроса (они могут быть зарегистрированы или кэшированы промежуточными прокси). Используйте ауторизацию: Заголовок Bearer <token> Для дополнительной безопасности свяжитесь с токенами в сеанс TLS, включив хэш главного секрета (связывание канала «tls-unique») в запросе токена — это предотвращает атаки повторного воспроизведения через различные соединения.

OWASP Mobile Top 10 — Безопасная связь

Регулярные обновления безопасности и тестирование

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

Управление зависимостью

Проверяйте каждую стороннюю библиотеку, которую вы интегрируете в свой поток аутентификации. Используйте такие инструменты, как CocoaPods-Audit или встроенная проверка SPM для обнаружения известных уязвимостей. Предпочитайте хорошо поддерживаемые библиотеки с послужным списком безопасности, такие как Alamofire (только при необходимости; сырой URLSession часто безопаснее) или Jose для веб-токенов JSON. Избегайте зависимостей, которые выполняют собственный код или доступ к сети напрямую без надлежащего обзора безопасности.

Автоматическое тестирование безопасности

Включите сканирование безопасности в свой конвейер CI/CD. Используйте инструменты статического анализа (например, SonarQube с правилами Swift или SwiftLint с правилами, ориентированными на безопасность) для флага секретов, закодированных в жестком коде, недостаточной энтропии или неправильного использования криптовалюты. Для динамического анализа, используйте Address Sanitizer Xcode и GuardMalloc , чтобы поймать повреждение памяти. Периодическое ручное тестирование проникновения также имеет решающее значение: тестирование на инъекционные атаки, небезопасное хранение данных и недостатки управления сеансом (например, повторное использование токенов).

Ответ на раскрытие уязвимостей

Apple предоставляет инструмент обратной связи безопасности. Подумайте об участии в программе Apple Security Bounty Всегда сохраняйте код аутентификации вашего приложения в соответствии с последними iOS SDK — Apple часто обесценивает небезопасные API (например, UIWebView был удален; вместо этого используйте ASWebAuthenticationSession).

Дополнительные соображения безопасности

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

Восстановление аккаунта и сброс пароля

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

Ограничение ставок и защита от грубой силы

Внедрить ограничение скорости на стороне сервера на конечных точках входа (например, 5 попыток в минуту на IP или пользователя). После нескольких неудачных попыток, требуется CAPTCHA или задержка повторного использования. На iOS вы также можете использовать структуру ускорения для вычисления задачи доказательства работы (хотя это менее распространено).

Конфиденциальность и минимизация данных

Соберите только данные, необходимые для аутентификации. Избегайте запрашивать разрешения, которые не имеют прямого отношения (например, контакты, местоположение), если пользователь явно не выбирает. Соблюдайте правила конфиденциальности Apple Подписывайтесь с Apple : при интеграции этой функции используйте частный адрес электронной почты пользователя для предотвращения отслеживания. Кроме того, реализуйте Эфемерные веб-браузеры сеансы (используя ASWebAuthenticationSession с предпочитает EphemeralWebBrowserSession = YES ) чтобы избежать утечки любых постоянных файлов cookie из Safari в поток аутентификации.

Аттестация устройств

Для приложений с высокой степенью безопасности (например, банковского обслуживания) рассмотрите возможность использования DeviceCheck или App Attest (через DCAppAttestService ) для подтверждения того, что запрос исходит из подлинной копии вашего приложения, работающего на законном устройстве. Это предотвращает эмулирование запросов с корневых или взломанных устройств. Объединение аттестации с токеном аутентификации для создания поддерживаемого аппаратным обеспечением утверждения безопасности.

Заключение

Защита аутентификации на iOS - это многоуровневая работа, которая охватывает криптографию, проектирование протоколов, хранение и текущее обслуживание. Благодаря внедрению MFA с PKCE, хранению секретов в Keychain с биометрическими элементами управления доступом, управлению сроками службы токенов с ротацией, обеспечению зашифрованных коммуникаций с помощью пиннинга и непрерывному тестированию, вы можете резко снизить риск компрометации. Экосистема, которую Apple предоставляет - от Secure Enclave до LocalAuthentication и App Attest - предлагает сильные примитивы, но они должны применяться правильно и обновляться. Инвестируйте время, чтобы спроектировать свой поток аутентификации с помощью этих лучших практик с самого начала; от этого зависит доверие ваших пользователей.

NIST Digital Identity Guidelines (SP 800-63B)