Защита данных связки ключей
Многим приложениям для работы необходимы пароли и другие короткие, но конфиденциальные фрагменты данных, например ключи и токены входа. Связка ключей предоставляет безопасный способ хранения этих элементов. Различные операционные системы Apple используют разные механизмы для обеспечения уровней безопасности, связанных с разными классами защиты связки ключей. В macOS (включая компьютер Mac с чипом Apple) технология защиты данных не используется напрямую для обеспечения этих уровней безопасности.
Обзор
Для шифрования элементов связки ключей используются два разных ключа AES-256-GCM: ключ таблицы (метаданные) и ключ строки (секретный ключ). Метаданные связки ключей (все атрибуты, кроме kSecValue) шифруются с помощью ключа метаданных для ускорения поиска, а секретное значение (kSecValueData) шифруется с помощью отдельного секретного ключа. Ключ метаданных защищен сопроцессором Secure Enclave, однако кэшируется в процессоре приложений для быстрой отправки запросов к связке ключей. Для доступа к секретному ключу всегда требуется обращение к Secure Enclave.
Связка ключей реализована в виде базы данных SQLite, которая хранится в файловой системе. Существует только одна база данных, и демон securityd
определяет, к каким элементам связки ключей может обращаться каждый процесс или каждое приложение. API доступа к связке ключей выдают вызовы демону, который запрашивает заданные для приложения права Keychain-access-groups (группы доступа к связке ключей), application-identifier (идентификатор приложения) и application-group (группа приложения). Группы доступа не ограничивают доступ одним процессом, а позволяют нескольким приложениям совместно использовать элементы связки ключей.
Элементы связки ключей могут использоваться совместно только приложениями одного и того же разработчика. Для совместного использования ключей приложения сторонних разработчиков используют группы доступа с префиксом, который был выделен им через программу Apple Developer Program путем распределения по группам приложений. Для принудительного использования префиксов и уникальных групп приложений используются подпись кода, профили обеспечения и программа Apple Developer Program.
Для защиты данных связки ключей используется структура классов, аналогичная структуре, используемой для защиты данных в файлах. Работа этих классов аналогична работе классов защиты данных в файлах, но эти классы используют отдельные ключи и функции.
Доступность | Защита данных в файлах | Защита данных связки ключей | |||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
В разблокированном состоянии | NSFileProtectionComplete | kSecAttrAccessibleWhenUnlocked | |||||||||
В заблокированном состоянии | NSFileProtectionCompleteUnlessOpen | Недоступно | |||||||||
После первой разблокировки | NSFileProtectionCompleteUntilFirstUserAuthentication | kSecAttrAccessibleAfterFirstUnlock | |||||||||
Всегда | NSFileProtectionNone | kSecAttrAccessibleAlways | |||||||||
При включении код-пароля | Недоступно | kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly |
Если приложение пользуется службами фонового обновления, оно может использовать класс kSecAttrAccessibleAfterFirstUnlock для элементов связки ключей, которые необходимы во время фонового обновления.
Класс kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly работает так же, как и kSecAttrAccessibleWhenUnlocked, однако его можно использовать, только если на устройстве задан код-пароль. Элементы этого класса существуют только в системном хранилище ключей; они:
не синхронизируются со Связкой ключей iCloud;
не включаются в резервные копии;
не включаются в хранилища ключей передачи.
В случае удаления или сброса код-пароля ключи класса становятся недействительными, что не позволяет использовать эти элементы.
Другие классы связки ключей имеют эквивалент «Только для этого устройства». При перемещении с устройства во время резервного копирования этот эквивалент защищается с помощью UID, что не позволяет восстановить его на другом устройстве. Apple достигла отличного баланса между безопасностью и удобством, выбирая классы связки ключей в зависимости от типа защищаемой информации и от того, когда эта информация необходима операционной системе iOS и iPadOS. Например, VPN-сертификат должен быть доступен постоянно, поэтому устройство поддерживает постоянное подключение, но он классифицируется как «без возможности переноса», поэтому не может быть перемещен на другое устройство.
Функции защиты класса для данных связки ключей
К элементам связки ключей применяются функции защиты следующих классов.
Элемент | Доступность |
---|---|
Пароли Wi-Fi | После первой разблокировки |
Учетные записи Почты | После первой разблокировки |
Учетные записи Microsoft Exchange ActiveSync | После первой разблокировки |
Пароли VPN | После первой разблокировки |
LDAP, CalDAV, CardDAV | После первой разблокировки |
Токены учетных записей социальных сетей | После первой разблокировки |
Ключи шифрования уведомлений Handoff | После первой разблокировки |
Токен iCloud | После первой разблокировки |
Ключи iMessage | После первой разблокировки |
Пароль «Домашней коллекции» | В разблокированном состоянии |
Пароли Safari | В разблокированном состоянии |
Закладки Safari | В разблокированном состоянии |
Резервное копирование с помощью Finder или iTunes | В разблокированном состоянии, без возможности переноса |
Личные ключи, установленные профилем конфигурации | В разблокированном состоянии, без возможности переноса |
Сертификаты VPN | Всегда, без возможности переноса |
Ключи Bluetooth® | Всегда, без возможности переноса |
Токен службы Apple Push Notification (APNs) | Всегда, без возможности переноса |
Сертификаты и личный ключ iCloud | Всегда, без возможности переноса |
PIN-код SIM-карты | Всегда, без возможности переноса |
Сертификаты, установленные профилем конфигурации | Всегда |
Токен Локатора | Всегда |
Автоответчик | Всегда |
Контроль доступа к связке ключей
Для установки политик доступа и требований аутентификации связки ключей могут использовать списки контроля доступа (ACL). Элементы в связке могут задавать условия, требующие участия пользователя, запрещая доступ до тех пор, пока пользователь не выполнит аутентификацию с помощью Face ID, Touch ID либо не введет код-пароль или пароль устройства. Можно также ограничить доступ к элементам, указав, что регистрация с помощью Face ID или Touch ID не должна меняться с момента добавления элемента. Это ограничение направлено на то, чтобы злоумышленник не мог добавить собственный отпечаток пальца и получить доступ к элементу связки ключей. Списки контроля доступа оцениваются внутри Secure Enclave и передаются ядру только при соблюдении заданных ограничений.
Архитектура связки ключей в macOS
macOS также предоставляет доступ к связке ключей для удобного и безопасного хранения имен пользователей и паролей, цифровых удостоверений, ключей шифрования и секретных заметок. Для доступа к связке ключей необходимо открыть приложение «Связка ключей» в папке «/Программы/Утилиты». Использование связки ключей устраняет необходимость вводить — или даже запоминать — учетные данные для каждого ресурса. Для каждого пользователя Mac создается связка ключей по умолчанию. Также пользователи могут создавать другие связки ключей, предназначенные для определенных целей.
Помимо применения пользовательских связок ключей, в macOS используется ряд системных связок ключей, которые поддерживают ресурсы аутентификации, не зависящие от пользователя, такие как учетные данные сетей и идентификаторы инфраструктуры открытых ключей (PKI). Например, неизменяемая связка ключей System Roots хранит сертификаты корневого центра сертификации инфраструктуры открытых ключей интернета, упрощая такие распространенные задачи, как интернет-банкинг и электронная торговля. Аналогичным образом пользователь может развернуть внутренние сертификаты центра сертификации на управляемых компьютерах Mac, чтобы помочь в проверке внутренних веб-сайтов и служб.