Понятия служб цепочки для ключей

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

Keychain Services API предоставляет решение этой проблемы. Путем совершения единственного звонка к этому API приложение может хранить информацию входа в систему на цепочке для ключей, где приложение может получить информацию — также с единственным вызовом — при необходимости. Цепочка для ключей является зашифрованным контейнером, содержащим пароли для многократных приложений и безопасных служб. Цепочки для ключей являются безопасными контейнерами хранения, что означает, что, когда цепочка для ключей заблокирована, никто не может получить доступ к ее защищенному содержанию. В OS X пользователи могут разблокировать цепочку для ключей — таким образом обеспечение доверенного доступа приложений к содержанию — путем ввода единственного основного пароля. В iOS каждое приложение всегда имеет доступ к своим собственным элементам цепочки для ключей; пользователя никогда не просят разблокировать цепочку для ключей. Принимая во внимание, что в OS X любое приложение может получить доступ к любому элементу цепочки для ключей, если пользователь дает разрешение в iOS, приложение может получить доступ только к своим собственным элементам цепочки для ключей.

С точки зрения пользователя цепочка для ключей обеспечивает прозрачную аутентификацию; т.е. (после разблокирования цепочки для ключей, если в OS X) пользователь не должен входить в систему отдельно никаких служб, пароли которых сохранены в цепочке для ключей. В OS X пользователь должен только ввести один пароль один раз для доступа к любому числу приложений, серверов, веб-сайтов, и т.д. В iOS пользователь даже не должен вводить пароль цепочки для ключей. Рисунок 1-1 показывает отношение между пользователем, цепочкой для ключей и защищенными паролем службами. Для iOS опущен первый шаг (разблокировавший цепочку для ключей). В iOS приложение может всегда получать доступ к своим собственным элементам цепочки для ключей, но не элементам, создаваемым любым другим приложением.

Рисунок 1-1  , Получающий доступ к защищенным паролем службам с помощью цепочки для ключей в OS X
Accessing password-protected services using a keychain

По умолчанию в OS X каждая учетная запись имеет одну цепочку для ключей (для нового входа в систему на OS X v10.3, эту цепочку для ключей называют login.keychain); однако, пользователь или приложение могут создать столько цепочек для ключей сколько желаемый. Цепочка для ключей входа в систему автоматически разблокирована во время входа в систему, если это имеет тот же пароль как пароль учетной записи пользователя. Когда сначала создаваемый, цепочка для ключей входа в систему является также цепочкой для ключей по умолчанию. Цепочка для ключей по умолчанию используется для хранения недавно создаваемых элементов цепочки для ключей, если различная цепочка для ключей не указана в вызове функции; когда никакая другая цепочка для ключей не указана, определенные другие функции Keychain Services также используют цепочку для ключей по умолчанию. Пользователь может использовать утилиту Keychain Access для обозначения другой цепочки для ключей как значение по умолчанию; однако, цепочка для ключей входа в систему не изменяется. В iOS ситуация более проста: существует единственная цепочка для ключей, доступная для приложений. Несмотря на то, что это хранит элементы цепочки для ключей всех приложений в системе, приложение может получить доступ только к своим собственным элементам цепочки для ключей (за возможным исключением элемента цепочки для ключей, для который приложение, которое создало его, получил персистентную ссылку).

Службы цепочки для ключей и CDSA

В OS X Keychain Services и другой безопасности APIs основан на Common Data Security Architecture (CDSA) с открытым исходным кодом и ее интерфейсе программирования, Common Security Services Manager (CSSM).

OS X Keychain Services API обеспечивает функции для выполнения большинства операций, необходимых приложениям, включая создание, удаление и изменение цепочек для ключей и элементов цепочки для ключей, управление доступом к элементам цепочки для ключей, нахождение элементов цепочки для ключей и получение атрибутов и данных от элементов. Однако базовый API CSSM обеспечивает больше возможностей, которые могли бы представлять интерес для специализированных приложений, таких как приложения, разработанные для администрирования безопасности компьютера или сети. Поэтому API Keychain Services включает много функций, возвращающих или создающих структуры CSSM так, чтобы, если Вы знакомы с API CSSM, можно было переместиться свободно назад и вперед между Keychain Services и CSSM.

Для получения дополнительной информации о API CSSM, посмотрите Коллективную безопасность: CDSA и CSSM, версия 2 (с исправлениями) от Open Group (http://www .opengroup.org/security/cdsa.htm).

В iOS Keychain Services API обеспечивает все функции, доступные для управления элементами цепочки для ключей.

Структура цепочки для ключей

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

Атрибуты, связанные с элементом цепочки для ключей, зависят от класса элемента; классы элемента, наиболее используемые приложениями (кроме Средства поиска и приложения Доступа Цепочки для ключей в OS X), являются интернет-паролями и универсальными паролями. Как Вы могли бы ожидать, интернет-пароли включают атрибуты для таких вещей как домен защиты, тип протокола и путь. Пароли или другие секреты, сохраненные как элементы цепочки для ключей, шифруются. Когда цепочка для ключей заблокирована, в OS X зашифрованные элементы недоступны; при попытке получить доступ к элементу, в то время как цепочка для ключей заблокирована, Keychain Services выводит на экран диалоговое окно, предлагающее пользователю пароль цепочки для ключей. Атрибуты не шифруются, однако, и могут быть считаны в любое время, даже когда заблокирована цепочка для ключей. В iOS Ваше приложение всегда имеет доступ к своим собственным элементам цепочки для ключей.

В OS X каждый защищенный элемент цепочки для ключей (и сама цепочка для ключей) содержит информацию об управлении доступом в форме непрозрачной структуры данных, названной объектом доступа. Объект доступа содержит одну или более записей списка управления доступом (ACL) для того элемента. Каждая запись ACL имеет список одного или более тегов авторизации, указывающих операции, которые могут быть сделаны с тем элементом, таким как дешифрование или аутентификация. Кроме того, каждая запись ACL имеет список доверяемых приложений, которые могут выполнить указанные операции без авторизации от пользователя.

Средства управления доступом цепочки для ключей

Когда приложение OS X пытается получить доступ к элементу цепочки для ключей для конкретной цели (например, для подписания документа), система смотрит на каждую запись ACL для того элемента, чтобы определить, должно ли приложение быть предоставленным доступом. Если нет никакой записи ACL для той работы, то доступ запрещен, и это до вызывающего приложения, чтобы попробовать что-то еще или уведомить пользователя. Если существуют какие-либо записи ACL для работы, то система смотрит на список доверяемых приложений каждой записи ACL, чтобы видеть, находится ли вызывающее приложение в списке. Если это — или если ACL указывает, что все приложения являются предоставленным доступом — тогда, доступ разрешен без подтверждения от пользователя (как долго, поскольку цепочка для ключей разблокирована). Если существует запись ACL для работы, но вызывающее приложение не находится в списке доверяемых приложений, то системные приглашения пользователь для пароля цепочки для ключей прежде, чем разрешить приложению получать доступ к элементу.

Keychain Services, которую API обеспечивает функции, чтобы создать, удалить, читала и изменяет записи ACL. Поскольку запись ACL всегда связывается с объектом доступа при изменении записи ACL Вы изменяете объект доступа также. Поэтому нет никакой потребности в отдельной функции для обратной записи измененной записи ACL в объект доступа.

Может быть любое число записей ACL в объекте доступа. Если две или больше из записей ACL для той же работы, нет никакого способа предсказать порядок, в котором они будут оценены.

Несмотря на то, что Keychain Services API позволяет Вам создать записи ACL и добавить их к объектам доступа, она ограничивается в способах, которыми можно сконфигурировать полномочия и списки доверяемых приложений. Если Вы хотите реализовать средства управления доступом, идущие вне сложности и структуры, поддерживаемой Keychain Services, можно использовать API CSSM, чтобы создать ряд структур данных CSSM и затем вызвать SecAccessCreateFromOwnerAndACL функция. Несмотря на то, что Вы не можете использовать функции Keychain Services, чтобы извлечь информацию из или изменить объект доступа, сделанный таким образом, Keychain Services распознает объект доступа как структуру данных CSSM и использует его непосредственно в ее базовых вызовах к CSSM.

Доверяемые приложения

Запись ACL или разрешает всем приложениям выполнять операции, указанные ее списком тегов авторизации, или она содержит список доверяемых приложений. Доверяемый список приложений является фактически списком доверяемых объектов приложения (объекты с непрозрачным типом SecTrustedApplicationRef). В дополнение к служению в качестве ссылки на приложение доверяемый объект приложения включает данные, однозначно определяющие приложение, такое как криптографический хеш. Система может использовать эти данные, чтобы проверить, что приложение не было изменено, так как доверяемый объект приложения создавался. Например, когда доверенный доступ запросов приложения к элементу в цепочке для ключей, система проверяет эти данные прежде, чем предоставить доступ. Несмотря на то, что можно извлечь эти данные из доверяемого объекта приложения для хранения или для передачи к другому расположению (такой как по сети), эти данные находятся в частном формате; нет никакого поддерживаемого способа считать или интерпретировать его.

Можно использовать SecTrustedApplicationCreateFromPath функция для создания доверяемого объекта приложения. Доверяемое приложение является двоичной формой приложения, это находится на диске в данный момент, доверяемый объект приложения создается. Если приложение, перечисленное как доверяемое приложение для элемента цепочки для ключей, изменяется всегда, система не распознает его как доверяемое приложение. Вместо этого пользователю предлагают подтверждение, когда то приложение пытается получить доступ к элементу цепочки для ключей.

Когда программа пытается получить доступ к элементу цепочки для ключей, за который она не распознана как доверяемое приложение, система выводит на экран диалоговое окно подтверждения (рисунок 1-2). Диалоговое окно подтверждения имеет три кнопки: Отклоните, Позвольте Один раз, и Всегда Позволяйте. Если пользователь нажимает Always Allow, система создает доверяемый объект приложения для приложения и добавляет его к объекту доступа для того элемента цепочки для ключей.

  Диалоговое окно подтверждения Доступа к приложениям рисунка 1-2
Application access confirmation dialog

Для создания запуска программ более эффективным система предварительно связывает исполнимые программы с динамично загруженными библиотеками (DLLs). Когда пользователь обновляет DLL, система автоматически изменяет исполнимые программы всех программ, пользующихся той библиотекой, процесс, называемый reprebinding. Reprebinding доверяемое приложение поэтому заставляет приложение больше не соответствовать версию, представленную в хеше приложения. В OS X v10.2 и ранее, в следующий раз, когда приложение пытается использовать защищенный элемент цепочки для ключей, появляется диалоговое окно подтверждения. Когда пользователь нажимает Always Allow, система добавляет его к объекту доступа как новое доверяемое приложение. Начиная с OS X v10.3, с другой стороны, система поддерживает базу данных, отслеживающую приложения, которые были reprebound так, чтобы в большинстве случаев не появлялось никакое диалоговое окно подтверждения.

В OS X v10.3 и позже, кроме того, система отслеживает приложения, обновленные Обновлением программного обеспечения. Когда обновленное приложение пытается получить доступ к защищенному элементу цепочки для ключей, система или распознает, что это - то же приложение или, при необходимости, выводит на экран диалоговое окно подтверждения, говорящее, что приложение было изменено и выяснение у пользователя, обработать ли его как более старая версия (рисунок 1-3). Если пользователь нажимает кнопку Change All, система вносит изменение только в цепочки для ключей текущего пользователя, не в цепочки для ключей других пользователей в системе.

  Диалоговое окно подтверждения программного обеспечения Changed рисунка 1-3
Changed software confirmation dialog

Записи ACL

SecAccessCreate функция создает объект доступа с тремя записями ACL. Первое, называемое доступом владельца, определяет, кто может изменить сам объект доступа. По умолчанию нет никаких доверяемых приложений для доступа владельца; пользователю всегда предлагают разрешение, если кто-то пытается изменить средства управления доступом. Вторая запись ACL для операций, которые рассматривают безопасными, таких как шифрование данных. Эта запись ACL применяется ко всем приложениям. Третья запись ACL для операций, которые должны быть ограничены, такие как дешифрование, подписание, получение ключей и экспорт ключей. Эта запись ACL применяется к доверяемым приложениям, перечисленным как ввод к функции.

В дополнение к обеспечению списка доверяемых приложений к SecAccessCreate, Вы указываете CFString, описывающий элемент цепочки для ключей. Это - имя элемента, появляющегося в диалоговых окнах (см. рисунок 1-2 или рисунок 1-3, например). Это - не обязательно то же имя, как появляется для элемента в утилите Keychain Access.

Вы используете другие функции в Keychain Services, чтобы изменить любую из этих записей ACL по умолчанию или добавить дополнительные записи ACL в объект доступа (см. Ссылку Keychain Services). Эти функции позволяют Вам получить все записи ACL для объекта доступа, изменить записи ACL и создать новые. Для каждой записи ACL можно указать приложения, которым доверяют, строку дескриптора элемента, список тегов авторизации и быстрый селекторный бит. Если Вы устанавливаете быстрый селекторный бит, пользователю предлагают пароль цепочки для ключей каждый раз, когда недоверяемое приложение пытается получить доступ к элементу, даже если уже разблокирована цепочка для ключей. Рисунок 1-4 показывает диалоговое окно; сравните это число с рисунком 1-2, который является диалоговым окном, появляющимся, если не установлен быстрый селекторный бит. Если пользователь нажимает Always Allow в ответ на это диалоговое окно, приложение добавляется на объект доступа как доверяемое приложение, и диалоговое окно не появляется снова. Этот бит ясен по умолчанию — необходимо установить его явно для любой записи ACL, для которой Вы хотите эту дополнительную защиту. Существует одно исключение к этому правилу: приложение Доступа Цепочки для ключей всегда требует, чтобы пароль вывел на экран секрет элемента цепочки для ключей, если само приложение Доступа Цепочки для ключей не включено в доверяемый список приложений.

Рисунок 1-4  Разблокировал диалоговое окно цепочки для ключей для подтверждения доступа
Unlock keychain dialog to confirm access

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

Хранение безопасных данных цепочки для ключей OS X

В OS X, для обеспечения безопасности для паролей и других ценных секретов сохранил в цепочке для ключей, необходимо принять, по крайней мере, следующие меры:

Резервные копии Цепочки для ключей iPhone

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

Простота использования служб цепочки для ключей

Несмотря на то, что структура цепочки для ключей обеспечивает много питания и гибкости, это также представляет уровень сложности, с которой не должно иметь дело большинство писателей приложения. К счастью, Вы не делаете. Keychain Services API обеспечивает ряд высокоуровневых функций, обрабатывающих все операции цепочки для ключей большинство приложений, должна будет когда-либо выполнять.

Чтобы создать элемент цепочки для ключей и добавить его к цепочке для ключей в OS X, например, Вы вызываете одну из двух функций, в зависимости от того, хотите ли Вы добавить интернет-пароль или некоторый другой тип пароля: SecKeychainAddInternetPassword или SecKeychainAddGenericPassword. В Вашем вызове функции Вы передаете только те атрибуты, для которых нет никакого очевидного значения по умолчанию. Например, необходимо указать имя службы и названия счета пользователя, но Вы не должны указывать дату создания и создателя, потому что функция может понять тех отдельно. Вы также передаете данные (обычно пароль), что Вы хотите сохранить в цепочке для ключей. Вы даже не должны указывать цепочку для ключей; если Вы передаете NULL для ссылки цепочки для ключей функция использует цепочку для ключей по умолчанию. Если цепочка для ключей заблокирована, функция автоматически выводит на экран диалоговое окно, предлагающее пользователю разблокировать цепочку для ключей. Функция также создает объект доступа для Вас, перечисляя вызывающее приложение как единственное доверяемое приложение.

API iOS Keychain Services использует различную парадигму (см. следующий раздел, Словари Поиска iOS Keychain Services). Этот API имеет единственную функцию (SecItemAdd) для добавления элемента к цепочке для ключей.

Точно так же, когда для Вашего приложения Mac нужен доступ к паролю пользователя, Вы вызываете также SecKeychainFindInternetPassword или SecKeychainFindGenericPassword, передача некоторых атрибутов (таких как имя службы и названия счета пользователя) так, чтобы функция могла найти пароль, в котором Вы нуждаетесь. Если Вы передаете NULL для цепочки для ключей для поиска функция ищет цепочки для ключей в списке поиска цепочки для ключей по умолчанию, совпадающем со списком цепочки для ключей в утилите Keychain Access. Функция предлагает пользователю разблокировать цепочку для ключей при необходимости. В iOS Вы вызываете SecItemCopyMatching функционируйте для нахождения элемента цепочки для ключей принадлежавшим приложению. В этом случае существует только одна цепочка для ключей, и пользователю никогда не предлагают разблокировать ее.

Задачи OS X Keychain Services содержат подробную информацию о том, как добавить основные опции Keychain Services к Вашему приложению.

Словари Поиска iOS Keychain Services

В iOS Keychain Services использует словарь значения ключа для указания атрибутов элемента цепочки для ключей, что Вы хотите поиск или создаете. Для общих обсуждений пар ключ/значение и словарей, посмотрите, что Наборы Программируют Темы и Наборы, Программируя Темы для Базовой Основы.

Типичный поисковый словарь состоит из:

То, какие атрибуты могут быть указаны, зависит от класса элемента, который Вы хотите искать. Например, если Вы указываете значение kSecClassGenericPassword для kSecClass ключ, тогда можно указать значения для даты создания и даты модификации, но не для предмета или эмитента (которые используются с сертификатами).

Например, если бы Вы хотели выполнить поиск без учета регистра пароля для учетной записи Apple Store с названием счета «ImaUser», то Вы могли использовать следующий словарь с SecItemCopyMatching функция:

Тип ключа

Ключ

Значение

Класс элемента

kSecClass

kSecClassGenericPassword

Атрибут

kSecAttrAccount

"ImaUser"

Атрибут

kSecAttrService

"Apple Store"

Поисковый атрибут

kSecMatchCaseInsensitive

kCFBooleanTrue

Возвратите тип

kSecReturnData

kCFBooleanTrue

kSecReturnData ключ заставляет функцию возвращать данные элемента цепочки для ключей — в этом случае, пароль. Если вместо этого Вы хотите словарь ключей атрибута и значений (таким образом, можно определить, например, дату создания элемента), Вы используете kSecReturnAttributes ключ типа возврата со значением kCFBooleanTrue.

Расширенные функции служб цепочки для ключей OS X

OS X Keychain Services позволяет Вам создавать цепочки для ключей, управлять элементами в цепочке для ключей и управлять наборами цепочек для ключей. В большинстве случаев осведомленное о цепочке для ключей приложение не должно делать никакого управления цепочкой для ключей и только должно вызвать несколько функций, чтобы сохранить или получить пароли. По умолчанию Keychain Services автоматически взаимодействует с пользователем, чтобы создать или разблокировать цепочку для ключей при необходимости. Например, при попытке добавить пароль к цепочке для ключей, но никакая цепочка для ключей не существует, Keychain Services предлагает пользователю как показано на рисунке 1-5. Когда пользователь нажимает Reset To Defaults, Keychain Services создает цепочку для ключей с именем login.keychain и тот же пароль как учетная запись пользователя.

Рисунок 1-5  , Предлагающий пользователю создать цепочку для ключей
Prompting the user to create a keychain

Если цепочка для ключей заблокирована, когда Вы пытаетесь сохранить или получить пароль, Keychain Services предлагает пользователю разблокировать цепочку для ключей, как показано на рисунке 1-6. Как только пользователь вводит правильный пароль, Ваше приложение может получить доступ к цепочке для ключей. Keychain Services также выводит на экран диалоговые окна, чтобы подтвердить, что пользователь хочет, чтобы приложение получило доступ к цепочке для ключей (см. рисунок 3-2), и по другим причинам.

  Диалоговое окно Figure 1-6 The Unlock Keychain
The Unlock Keychain dialog box

В дополнение к хранению и получению паролей, существует несколько операций, включая которые некоторые приложения, возможно, должны были бы выполнить:

OS X Keychain Services включает много других функций, которые могут использоваться для управления цепочками для ключей, элементами цепочки для ключей, атрибутами, объектами доступа и ACLs. Можно даже зарегистрировать функцию обратного вызова так, чтобы приложение вызвали, когда событие цепочки для ключей (такое как разблокирование цепочки для ключей) имеет место. Однако эти функции обычно необходимы только программами, специально разработанными для администрирования цепочек для ключей. OS X включает программу администрирования цепочки для ключей, названную Доступом Цепочки для ключей (рисунок 1-7). С этой утилитой пользователь может заблокировать или разблокировать цепочки для ключей, создать новые цепочки для ключей, изменить цепочку для ключей по умолчанию, добавить и удалить элементы цепочки для ключей, изменить значения атрибутов элементов цепочки для ключей, и видеть или изменить данные, хранившие в элементе цепочки для ключей.

Рисунок 1-7  приложение Доступа Цепочки для ключей
The Keychain Access applicationThe Keychain Access application

Для дублирования возможностей этой программы в OS X необходимо было бы быть знакомы с Common Data Security Architecture (CDSA) с открытым исходным кодом и ее API, Common Security Services Manager (CSSM), в дополнение ко всем функциям, предоставленным Keychain Services. Для получения дополнительной информации о API CSSM, посмотрите Коллективную безопасность: CDSA и CSSM, версия 2 (с исправлениями) от Open Group (http://www .opengroup.org/security/cdsa.htm).