Хранилища ключей для защиты данных
В iOS, iPadOS, tvOS и watchOS ключи защиты данных для классов файлов и связки ключей организованы в хранилища ключей. В этих операционных системах используются хранилища ключей пользователя, устройства, резервной копии, передачи и резервной копии iCloud.
Хранилище ключей пользователя
Хранилище ключей пользователя — это место хранения защищенных ключей класса, используемых при нормальном функционировании устройства. Например, при вводе код‑пароля выполняется загрузка ключа NSFileProtectionComplete из хранилища ключей пользователя и расшифровка ключа. Хранилище ключей представляет собой двоичный файл списка свойств (.plist) с классом «Без защиты».
На устройствах с системой на кристалле до A9 содержимое файла .plist шифруется с помощью ключа, хранящегося в стираемом накопителе. Для повышения безопасности хранилищ ключей этот ключ стирается и генерируется снова каждый раз, когда пользователь меняет код-пароль.
На устройствах с системами на кристалле A9 или новее файл .plist содержит ключ, указывающий на то, что хранилище ключей помещено в сейф, который защищен с помощью значения функции антиповтора, контролируемой Secure Enclave.
Сопроцессор Secure Enclave управляет хранилищем ключей пользователя и может получать запросы относительно состояния блокировки устройства. Он отвечает, что устройство разблокировано, только в том случае, если все ключи классов в хранилище ключей пользователя являются доступными и были успешно дешифрованы.
Хранилище ключей устройства
Хранилище ключей устройства предназначено для хранения защищенных ключей класса, используемых для выполнения операций с данными конкретного устройства. Устройства iPadOS, настроенные для совместного пользования, иногда нуждаются в доступе к учетным данным до того, как пользователь войдет в систему, поэтому необходимо хранилище ключей, не защищенное код-паролем пользователя.
iOS и iPadOS не поддерживают криптографическое разделение файловой системы разных пользователей, то есть для защиты ключей файлов система будет использовать ключи класса из хранилища ключей устройства. Однако для защиты элементов связки ключей пользователя используются ключи класса из хранилища ключей пользователя. На iPhone и iPad, настроенных для использования одним пользователем (это конфигурация по умолчанию), хранилище ключей устройства и хранилище ключей пользователя совпадают и защищены код‑паролем пользователя.
Хранилище ключей резервной копии
Хранилище ключей резервной копии создается в тот момент, когда Finder (в macOS 10.15 или новее) или iTunes (в macOS 10.14 и более ранних версиях) создает и сохраняет зашифрованную резервную копию на компьютере, куда передается резервная копия устройства. Новое хранилище ключей создается с новым набором ключей, и данные резервной копии повторно шифруются с использованием этих новых ключей. Как было объяснено ранее, элементы связки ключей «без возможности переноса» остаются защищенными ключом на основе UID; это позволяет восстанавливать их на исходном устройстве, но делает недоступными на другом устройстве.
Для защиты хранилища ключей используется заданный пароль, к которому применено 10 миллионов итераций функции формирования ключа PBKDF2. Несмотря на счетчик повторений, привязка к определенному устройству отсутствует, поэтому на хранилище ключей в резервной копии может быть совершена атака методом перебора с участием большого числа компьютеров. Для ослабления этой угрозы необходимо использовать достаточно надежный пароль.
Если пользователь решает не шифровать резервные копии, файлы резервных копий не шифруются независимо от класса защиты данных, однако связка ключей остается защищена ключом на основе UID. Поэтому элементы связки ключей переносятся на новое устройство, только если установлен пароль резервного копирования.
Хранилище ключей передачи
Хранилище ключей передачи используется для синхронизации с Finder (в macOS 10.15 и новее) или iTunes (в macOS 10.14 и более ранних версиях) через USB и систему управления мобильными устройствами (MDM). Благодаря этому хранилищу ключей приложение Finder или iTunes может выполнять резервное копирование и синхронизацию, не запрашивая у пользователя код-пароль, а система MDM может удаленно стирать код-пароль пользователя. Хранилище ключей находится на компьютере, который используется для синхронизации с Finder или iTunes, или в системе MDM, которая удаленно управляет устройством.
Хранилище ключей передачи упрощает работу пользователей при синхронизации устройства, которое может требовать доступа ко всем классам данных. Когда защищенное код-паролем устройство впервые подключается к Finder или iTunes, пользователю необходимо ввести код-пароль. Затем устройство создает хранилище ключей передачи, содержащее ключи того же класса, что и используемые на устройстве, но защищенные с помощью нового сгенерированного пароля. Хранилище ключей передачи и защищающий его ключ делятся между устройством и хостом или сервером, а данные сохраняются на устройстве с классом «Защищено до первой аутентификации пользователя». Поэтому для первого резервного копирования с помощью Finder или iTunes после перезагрузки пользователю необходимо ввести код-пароль устройства.
В случае беспроводного обновления программного обеспечения пользователь получает запрос на ввод код-пароля при запуске обновления. Это нужно для безопасного создания одноразового токена разблокировки, который разблокирует хранилище ключей пользователя после обновления. Этот токен невозможно сгенерировать без ввода код-пароля пользователем, а все ранее созданные токены становятся недействительными, если код-пароль пользователя меняется.
Одноразовые токены разблокировки бывают двух типов в зависимости предназначения: для установки обновлений программного обеспечения либо с участием пользователя, либо без его участия. Они шифруются с помощью ключа, полученного из текущего значения монотонного счетчика, работающего в Secure Enclave, UUID хранилища ключей и UID Secure Enclave.
В системах на кристалле A9 (и новее) одноразовый токен разблокировки больше не зависит от счетчиков или стираемого накопителя. Для его защиты теперь используется значение функции антиповтора, контролируемой сопроцессором Secure Enclave.
Срок действия одноразового токена разблокировки для установки обновлений программного обеспечения при участии пользователя истекает через 20 минут. В iOS 13 и iPadOS 13.1 или новее токен хранится в сейфе, который защищен сопроцессором Secure Enclave. В версиях, выпущенных ранее iOS 13, такой токен экспортировался из Secure Enclave и записывался в стираемый накопитель или защищался с помощью механизма антиповтора в сопроцессоре Secure Enclave. Таймер действия токена увеличивает значение счетчика, если устройство не перезагружалось в течение 20 минут.
Установка программного обеспечения без участия пользователя происходит, когда система обнаруживает наличие обновления и выполняется одно из следующих условий:
в iOS 12 или новее настроено автоматическое обновление;
пользователь выбирает вариант «Установить позже» в окне уведомления об обновлении.
После того как пользователь вводит код-пароль, генерируется одноразовый токен разблокировки, который может поддерживаться в Secure Enclave в действительном состоянии до 8 часов. Если обновление еще не произошло, этот одноразовый токен разблокировки уничтожается при каждой блокировке и заново создается при каждой последующей разблокировке. После каждой разблокировки отсчет 8 часов начинается с начала. По истечении 8 часов таймер действия токена аннулирует одноразовый токен разблокировки.
Хранилище ключей в резервной копии iCloud
Хранилище ключей в резервной копии iCloud аналогично хранилищу ключей в резервной копии. Все ключи классов в этом хранилище являются асимметричными (используют Curve25519, аналогично классу «Защищено, если не открыто»). Хранилище асимметричных ключей также используется для защиты резервной копии связки ключей, необходимой для восстановления Связки ключей iCloud.