鑰匙圈資料保護
許多 App 需要處理密碼和其他簡短但較為敏感的資料位元,如密鑰和登入代號。鑰匙圈提供了儲存這些項目的安全方式。不同的 Apple 作業系統使用不同機制來強制執行連繫至不同鑰匙圈保護類別的保證。在 macOS 中(包括配備 Apple 晶片的 Mac),不會直接使用「資料保護」來強制執行這些保證。
概覽
「鑰匙圈」項目會使用兩種不同的 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 相同;不過只有在裝置已設定密碼時才能使用。此類別只存在於系統 Keybag 中,且具有以下特性:
不會同步到「iCloud 鑰匙圈」
不會進行備份
不會納入託管 Keybag 中
如密碼遭移除或重設,系統便會捨棄類別密鑰,這些項目也變得無法使用。
其他鑰匙圈類別都有對應的「僅限本裝置」項目,其在備份期間從裝置複製時一律受到 UID 保護,因此如還原到其他裝置,將會無法使用。Apple 依據所保護資料的類型和 iOS 和 iPadOS 需要這些資料的時間來選擇鑰匙圈類別,妥善地在保安與可用性之間取得平衡。
「鑰匙圈」資料類別保護
系統會為鑰匙圈項目強制執行下列的類別保護:
項目 | 可存取 |
---|---|
Wi-Fi 密碼 | 首次解鎖後 |
郵件帳户 | 首次解鎖後 |
Microsoft Exchange ActiveSync 帳户 | 首次解鎖後 |
VPN 密碼 | 首次解鎖後 |
LDAP、CalDAV、CardDAV | 首次解鎖後 |
社交網絡帳户代號 | 首次解鎖後 |
「接手」廣播加密密鑰 | 首次解鎖後 |
iCloud 代號 | 首次解鎖後 |
iMessage 密鑰 | 首次解鎖後 |
家庭共享密碼 | 未鎖定時 |
Safari 密碼 | 未鎖定時 |
Safari 書籤 | 未鎖定時 |
Finder/iTunes 備份 | 未鎖定時,不可遷移 |
VPN 證書 | 首次解鎖後,不可遷移 |
藍牙密鑰 | 總是可以,不可遷移 |
Apple 推送通知服務(APNs)代號 | 總是可以,不可遷移 |
iCloud 證書和專用密鑰 | 總是可以,不可遷移 |
SIM PIN | 總是可以,不可遷移 |
「尋找」代號 | 總是可以 |
留言信箱 | 總是可以 |
在 macOS 上,透過設定描述檔安裝的所有鑰匙圈項目總是可供取用。在 iOS 和 iPadOS 上,因應透過設定描述檔安裝的鑰匙圈項目之類型、參考方式和安裝時間,提供取用的情況會有所不同。依照預設,使用設定描述檔安裝的鑰匙圈項目在首次解鎖後可供取用且不可遷移。但在以下情況下,透過設定描述檔安裝的鑰匙圈項目總是可供取用:
升級至 iOS 15、iPadOS 15 或較新版本之前就已安裝
本身為憑證(而非身份)
為
IdentityCertificateUUID
在com.apple.mdm
承載資料中參考的身份
「鑰匙圈」取用權限控制
「鑰匙圈」可使用連線權限控制列表(ACL)來設定能否存取和認證需求的規則。項目可以設定在哪些條件下必須由用户親身進行認證,方法是指定使用 Face ID、Touch ID 或輸入裝置密碼進行認證,否則無法存取。如要進一步限制項目存取權限,可指明 Face ID 或 Touch ID 的登記內容在該項目加入後沒有經過更改。此限制有助於防止攻擊者加入自己的指紋來存取鑰匙圈項目。ACL 會在「安全隔離區」中進行評估,只有符合其指定的限制條件時,才匯出到核心中。
在 macOS 中的「鑰匙圈架構」
macOS 也提供鑰匙圈的存取權限,可方便且安全地儲存用户名稱和密碼、電子識別身份、加密密鑰和安全備註。在「/應用程式/工具程式/」中開啟「鑰匙圈存取」App 便可存取。使用鑰匙圈讓用户不需要輸入(甚至記住)每項資源的憑證。系統已為每位用户建立初始的預設鑰匙圈,但用户可為特定用途建立其他鑰匙圈。
除了仰賴用户鑰匙圈外,macOS 還需要許多系統層級的鑰匙圈,以維護不屬於特定用户的認證資產,如網絡憑證和公用密鑰基礎架構(PKI)識別身份。其中一種鑰匙圈為無法變更的「系統根」,它儲存了互聯網 PKI 根憑證授權管理中心(CA)的憑證,可讓網絡銀行業務和電子商務等常見作業更加順利。用户能以類似方式將內部配置的 CA 憑證部署到受管理的 Mac 電腦上,以協助驗證內部站台和服務。