
钥匙串数据保护
许多 App 都需要处理密码和其他一些简短但比较敏感的数据,如密钥和登录令牌。钥匙串提供了储存这些项的安全方式。不同的 Apple 操作系统采用不同机制实施与各钥匙串保护类关联的保障。在运行 macOS 的设备上,数据保护不直接用于实施此类保障。
概览
钥匙串项使用两种不同的 AES-256-GCM 密钥加密:表格密钥(元数据)和行独有密钥(私密密钥)。钥匙串元数据(除 kSecValue 外的所有属性)使用元数据密钥加密以加速搜索,私密值 (kSecValueData) 使用私密密钥进行加密。元数据密钥受安全隔区保护,但会缓存在应用程序处理器中以便进行钥匙串快速查询。私密密钥则始终需要通过安全隔区进行往返处理。
钥匙串以储存在文件系统中的 SQLite 数据库的形式实现,而且数据库只有一个,securityd
监控程序决定每个进程或 App 可以访问哪些钥匙串项。钥匙串访问 API 将生成对监控程序的调用,从而查询 App 的“keychain-access-groups”、“application-identifier”和“application-group”权限。访问组允许在 App 之间共享钥匙串项,而非将访问权限限制于单个进程。
钥匙串项只能在来自同一开发者的 App 之间共享。若要共享钥匙串项,要求第三方 App 在其应用程序组中使用包含前缀的访问组,该前缀由 Apple Developer Program(Apple 开发者计划)分配。通过代码签名、预置描述文件和 Apple Developer Program(Apple 开发者计划)来强制实施对前缀的要求和应用程序组唯一性。
系统用于保护钥匙串数据的类结构与文件数据保护中使用的类结构相似。这些类具有与文件数据保护类对等的行为,但使用的密钥和函数不同。
可用性 | 文件数据保护 | 钥匙串数据保护 | |||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
未锁定状态下 | NSFileProtectionComplete | kSecAttrAccessibleWhenUnlocked | |||||||||
锁定状态下 | NSFileProtectionComplete UnlessOpen | ||||||||||
首次解锁后 | NSFileProtectionComplete UntilFirstUserAuthentication | kSecAttrAccessibleAfterFirstUnlock | |||||||||
始终 | NSFileProtectionNone | kSecAttrAccessibleAlways | |||||||||
密码启用状态下 | kSecAttrAccessibleWhen PasscodeSetThisDeviceOnly |
使用后台刷新服务的 App 可将 kSecAttrAccessibleAfterFirstUnlock 用于后台更新过程中需要访问的钥匙串项。
类 kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly 与 kSecAttrAccessibleWhenUnlocked 行为方式相同;但前者仅当设备配置了密码时可用。此类仅存在于系统密钥包中,且它们:
不同步到 iCloud 钥匙串
不会备份
不包括在托管密钥包中
如果密码被移除或重设,类密钥便会丢弃,这些项目也变得无法使用。
其他钥匙串类都有对应的“仅限本设备”项目,后者在备份期间从设备拷贝时始终通过 UID 加以保护,因此如果该项目恢复至其他设备将无法使用。Apple 根据所保护信息的类型以及 iOS、iPadOS 和 visionOS 需要这些信息的时间选择不同的钥匙串类,妥善平衡了安全性和可用性。
钥匙串数据类保护
以下列出的类保护针对钥匙串项执行。
项目 | 可访问 |
---|---|
无线局域网密码 | 首次解锁后 |
邮件账户 | 首次解锁后 |
Microsoft Exchange ActiveSync 账户 | 首次解锁后 |
VPN 密码 | 首次解锁后 |
LDAP、CalDAV、CardDAV | 首次解锁后 |
社交网络账户令牌 | 首次解锁后 |
“接力”广播加密密钥 | 首次解锁后 |
iCloud 令牌 | 首次解锁后 |
iMessage 信息密钥 | 首次解锁后 |
家庭共享密码 | 未锁定状态下 |
Safari 浏览器密码 | 未锁定状态下 |
Safari 浏览器书签 | 未锁定状态下 |
访达/iTunes 备份 | 未锁定状态下,不可迁移 |
VPN 证书 | 首次解锁后,不可迁移 |
蓝牙密钥 | 始终,不可迁移 |
Apple 推送通知服务 (APNs) 令牌 | 始终,不可迁移 |
iCloud 证书和私钥 | 始终,不可迁移 |
SIM 卡 PIN 码 | 始终,不可迁移 |
“查找”令牌 | 始终 |
语音信箱 | 始终 |
在 macOS 中,由配置描述文件安装的所有钥匙串项始终可用。在 iOS、iPadOS 和 visionOS 中,由配置描述文件安装的钥匙串项具有不同的可访问性,具体取决于其类型、被引用的方式和安装时间。使用配置描述文件安装的钥匙串项默认在首次解锁后可用且不可迁移。但是,由配置描述文件安装的钥匙串项在以下情况下始终可用:
在升级到 iOS 15、iPadOS 15 或更高版本之前安装
是证书(不是身份标识)
是
com.apple.mdm
有效负载中IdentityCertificateUUID
所引用的身份标识
钥匙串访问控制
钥匙串可以使用访问控制列表 (ACL) 以设定可访问性和认证要求的策略。钥匙串项可以设立条件,要求用户指定使用视控 ID、面容 ID、触控 ID 或输入设备密码进行认证,否则不能访问。对钥匙串项的访问也可以限制为在该钥匙串项添加以后,视控 ID、面容 ID 或触控 ID 注册未发生更改。此限制有助于防止攻击者通过添加自己的指纹来访问钥匙串项。ACL 在安全隔区内部进行评估,只有符合其指定的限制条件时,才会释放到内核。
macOS 中的钥匙串架构
macOS 还提供了对钥匙串的访问,用于方便安全地储存用户名和密码、数码身份、加密密钥和安全备忘录。你可以打开“/应用程序/实用工具”中的“钥匙串访问” App 来访问它。使用钥匙串可让你无需输入每个资源的凭证,甚至无需记住。系统会为每个 Mac 用户创建初始默认钥匙串,而用户可为特定目的创建其他钥匙串。
除了用户钥匙串,macOS 还依靠多个系统级钥匙串来维护非用户特定的认证资源,如网络凭证和公用密钥基础设施 (PKI) 身份。其中一个钥匙串 System Roots 不可更改,它储存了互联网 PKI 根证书颁发机构 (CA) 证书,以辅助网上银行和电子商务等常见任务。用户可以类似的方式将内部预置的 CA 证书部署到受管理的 Mac 电脑,以帮助验证内部站点和服务。