Роль Keychain в обеспечении качества продукта

Тестировщики, впервые столкнувшиеся с Keychain, часто не знают, как он используется в тестировании приложений под iOS и в безопасности данных пользователей. Алиса Мордвинова, QA-специалист IT Test, объясняет, как Keychain может повлиять на результаты тестирования и безопасность продукта в целом.
Keychain API в iOS
Keychain (Связка ключей) — это специализированная зашифрованная база данных, которая применяется для хранения метаданных и небольших объемов конфиденциальной пользовательской информации на компьютерах Mac (при наличии разрешений) и устройствах с iOS. Keychain также используется для обеспечения дополнительной защиты при входе в приложения / веб-сайты.
Данные «живут» в хранилище для временных файлов во время перезапуска и удаления приложения, то есть после переустановки приложения все токены, пароли и прочие данные не удаляются сразу. Именно поэтому, даже установив приложение заново, в него зачастую можно войти без необходимости повторной авторизации. Данные можно очистить, если того требует бизнес-логика, например, если необходимо сбросить логин пользователя при удалении приложения: для этого можно использовать добавление уникального uuid к хранимым в Keychain ключам, который будет храниться в UserDefaults и очищаться при удалении приложения.
Keychain API Services являются частью фреймворка Security, поэтому разберем его подробнее.
Как работает Security
Security использует структуру безопасности для защиты информации, установления доверия и управления доступом к программному обеспечению. В целом, службы безопасности отвечают следующим задачам:
▪️ установление личности пользователя (аутентификация), а затем выборочное предоставление доступа к ресурсам (авторизация);
▪️ защита данных как на диске, так и при передаче по сети.
Как показано на схеме ниже, также можно использовать криптографические ресурсы более низкого уровня для создания новых безопасных служб. Однако криптография сложна, а стоимость ошибок обычно настолько высока, что идея реализовать собственное криптографическое решение редко бывает хорошей.
Схема показывает приложение, расположенное над платформой безопасности.
Нужно всегда использовать API самого высокого уровня, который соответствует вашим потребностям, так как более низкий уровень не обеспечит должной безопасности. Только если вашему приложению требуется доступ более низкого уровня к функциям протокола безопасности, то можно напрямую использовать безопасный транспортный API, однако для его настройки требуются отдельные действия. Платформа безопасности не всегда является лучшим вариантом: для обеспечения безопасного сетевого взаимодействия лучше начинать с рассмотрения системы загрузки URL-адресов платформы Foundation, которая основана на платформе безопасности.
Тестирование приложений со знанием работы Keychain
Где со всем этим может столкнуться тестировщик? Расскажу на примере из практики. У нас было два тестировщика и два девайса с одним Apple ID. В приложении авторизация не производилась. В ходе тестирования было обнаружено, что при добавлении/удалении товаров на одном девайсе, они появляются и на другом, на котором не производилось никаких действий. Мне тогда объяснили это так: «Keychain синхронизирует значения через uuid, который используется для anonymous + синхронизации девайсов Apple». Не зная про Keychain, я отправилась изучать документацию Apple.
Как оказалось, в Keychain вместе с данными пользователя (Touch ID, Face ID, электронная почта, номер телефона и другая информация, которую мы вносили когда создавали/входили в Apple ID) сохранились временные файлы. Так я выяснила, что встроенная в Keychain функция SecSharedCredentials API предоставляет возможности для хранения и запроса общих учетных данных на основе пароля.
Пользователи часто сохраняют свое имя пользователя и пароль в связке ключей iCloud при входе на веб-сайты в Safari или в приложения. То есть с общими веб-учетными данными приложение может получить доступ к учетным данным, сохраненным для веб-сайта, вместо того, чтобы требовать от пользователя повторного ввода имени пользователя и пароля.
Apple ID, что логично, имеет идентификатор, которым является учетная запись для доступа ко всем сервисам Apple, и она обеспечивает слаженное взаимодействие всех устройств пользователя. И всё это, в том числе двухфакторная аутентификация, сделано для защиты от фишинга — вида интернет-мошенничества, целью которого является получение доступа к конфиденциальным данным пользователей, — логинам и паролям. И если у вас проскочила мысль «Да кому нужны мои данные», то это может быть кто угодно — конкурент, желающий получить прибыль, коллега, жаждущий преуспеть, или даже члены семьи, которые, возможно, просто хотят узнать ваш виш-лист.
Сертификаты, ключи и службы доверия для передачи данных
Зачем используются ключи и можно ли обойтись без них
Как работает функция App Transport Security (ATS)
▪️ иметь неповрежденную цифровую подпись, показывающую, что сертификат не был подделан;
▪️ иметь имя, совпадающее с DNS-именем сервера;
Если все так, как указано выше, то ATS предоставляет расширенные проверки безопасности:
▪️ обмен данными должен осуществляться с использованием симметричного шифра AES-128 или AES-256;
Если нужно настроить исключения, то у Apple есть инструкция (см. инструкцию).
Как получить политики для установления доверия
Иногда бывают проблемы с установлением доверия, поэтому разберем, как с ними справиться. Сертификат, который считается неповрежденным и действительным (поскольку цепочка подписей не прерывается до доверенного корневого сертификата), оценивается по набору правил, известных как политика доверия. Политика указывает, как определенные поля или расширения сертификата влияют на то, следует ли ему доверять для конкретного использования. Например, в политике может быть указано, что срок действия сертификата не должен истекать или он должен быть помечен как действительный для шифрования, подписи кода или какой-либо другой конкретной цели.
Чтобы настроить работу именно так, как удобно вам, можно перейти со стандартной предопределенной политики — базовой X509 или SSL — на собственную политику. Делается это с помощью сертификата, ключа и API служб доверия.
Еще раз про важность Keychain
Таким образом, мы выяснили, что Keychain — это обязательная часть в работе приложений: без него данные не будут в безопасности, к приложению не будет доверия, и это принесет большие проблемы разработчикам. В этой статье мы рассказали, почему инженерам по обеспечению качества при тестировании iOS важно понимать, как Apple ID и uuid взаимодействуют с приложением, а также то, для чего необходимо иметь разнообразные сложные данные для входа и как это воспринимает обычный пользователь.