鑰匙圈資料保護
許多 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 Developer Program 強制執行。
系統用來保護鑰匙圈項目的類別結構,與檔案「資料保護」中使用的類別結構相似。這些類別具有與檔案「資料保護」類別相同的行為,但使用的密鑰和功能不同。
可用性 | 檔案資料保護 | 鑰匙圈資料保護 | |||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
未鎖定時 | 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 便可存取。使用鑰匙圈便無需輸入(甚至不需要記住)每個資源的憑證。系統會為每位 Mac 使用者製作一個初始預設鑰匙圈,而使用者可針對特定目的製作其他鑰匙圈。
除了仰賴使用者鑰匙圈外,macOS 還需要許多系統層級的鑰匙圈,以維護不屬於特定使用者的認證資產,如網路憑證和公用密鑰基礎架構(PKI)識別身分。其中一種鑰匙圈為無法變更的「系統根」,且它儲存了網際網路 PKI 根憑證授權管理中心(CA)的憑證,可讓網路銀行業務和電子商務等常見作業更加順利。使用者能以類似方式將內部佈建的 CA 憑證部署到受管理的 Mac 電腦上,以協助驗證內部站台和服務。