キーチェーンのデータ保護
多くのアプリはパスワードだけでなく、その他の短くも機密性の高いデータ片(鍵やログイントークンなど)を扱う必要があります。キーチェーンには、これらの項目を安全に保存する方法が用意されています。Appleのさまざまなオペレーティングシステムでは、種々のキーチェーン保護クラスと関連付けられた保証を適用するために、それぞれ異なるメカニズムが使用されています。macOS(Appleシリコン搭載Macを含む)では、これらの保証を適用するのにデータ保護が直接使用されることはありません。
概要
キーチェーン項目は、表のキー(メタデータ)と行ごとのキー(秘密鍵)という2つの異なるAES-256-GCMキーを使用して暗号化されます。キーチェーンのメタデータ(kSecValue以外のすべての属性)は検索速度を高めるためにメタデータキーで暗号化され、秘密値(kSecValueData)は対応する秘密鍵で暗号化されます。メタデータキーはSecure Enclaveによって保護されますが、キーチェーンの照会を高速化するためにアプリケーションプロセッサにキャッシュされます。秘密鍵は常に、Secure Enclaveを介してやりとりする必要があります。
キーチェーンはSQLiteデータベース形式で実装され、ファイルシステムに保存されています。データベースは1つしかなく、各プロセスやアプリがアクセスできるキーチェーン項目は、securityd
デーモンによって決定されます。キーチェーンアクセスAPIによりデーモンが呼び出され、このデーモンによってアプリの「Keychain-access-groups」、「application-identifier」、および「application-group」の各エンタイトルメントが照会されます。アクセスは1つのプロセスには限定されないので、アクセスグループを利用してキーチェーン項目をアプリ間で共有することができます。
キーチェーン項目の共有は、同じデベロッパによるアプリ間でのみ可能です。キーチェーン項目を共有するために、他社製アプリはアプリケーショングループのApple Developer Programを通じて割り当てられたプレフィックスに基づくアクセスグループを使用します。プレフィックス要件とアプリケーショングループの一意性は、コード署名、プロビジョニングプロファイル、およびApple Developer Programによって実現されます。
キーチェーンデータは、ファイルのデータ保護で使用されるものと同様のクラス構造で保護されます。これらのクラスは、ファイルのデータ保護の各クラスと同じように動作します。ただし、固有の鍵と機能が使用されます。
利用できるタイミング | ファイルのデータ保護 | キーチェーンのデータ保護 | |||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
ロック解除時 | NSFileProtectionComplete | kSecAttrAccessibleWhenUnlocked | |||||||||
ロック中 | NSFileProtectionComplete UnlessOpen | ||||||||||
初回ロック解除後 | NSFileProtectionComplete UntilFirstUserAuthentication | kSecAttrAccessibleAfterFirstUnlock | |||||||||
常時 | NSFileProtectionNone | kSecAttrAccessibleAlways | |||||||||
パスコードが有効なとき | kSecAttrAccessibleWhen PasscodeSetThisDeviceOnly |
バックグラウンド更新サービスを利用するアプリは、バックグラウンドでのアップデート中にアクセスする必要があるキーチェーン項目にkSecAttrAccessibleAfterFirstUnlockを使用できます。
クラスkSecAttrAccessibleWhenPasscodeSetThisDeviceOnlyの動作はkSecAttrAccessibleWhenUnlockedと同じですが、利用できるのはデバイスにパスコードが構成されているときのみです。このクラスはシステムキーバッグにのみ存在し、以下の特徴があります。
iCloudキーチェーンに同期されない
バックアップされない
エスクローキーバッグに含まれない
パスコードが削除またはリセットされた場合、クラスキーが破棄されることによって、これらの項目は使用できなくなります。
その他のキーチェーンクラスにも「このデバイスのみ」に該当する保護クラスがあります。このクラスはバックアップ中にデバイスからコピーされるときにUIDで常時保護されるので、別のデバイスに復元されると使用できなくなります。Appleは、保護する情報の種類やiOSまたはiPadOSで必要になるタイミングに応じてキーチェーンクラスを選択することで、セキュリティと使いやすさのバランスに配慮しています。
キーチェーンデータのクラス保護
以下のクラス保護がキーチェーン項目に適用されます。
項目 | アクセスできるタイミング |
---|---|
Wi-Fiパスワード | 初回ロック解除後 |
メールアカウント | 初回ロック解除後 |
Microsoft Exchange ActiveSyncアカウント | 初回ロック解除後 |
VPNパスワード | 初回ロック解除後 |
LDAP、CalDAV、CardDAV | 初回ロック解除後 |
ソーシャルネットワークアカウントのトークン | 初回ロック解除後 |
Handoffアドバタイズメント暗号鍵 | 初回ロック解除後 |
iCloudトークン | 初回ロック解除後 |
iMessageキー | 初回ロック解除後 |
ホームシェアリングパスワード | ロック解除時 |
Safariパスワード | ロック解除時 |
Safariブックマーク | ロック解除時 |
Finder/iTunesバックアップ | ロック解除時、移行不可 |
VPN証明書 | 初回ロック解除後、移行不可 |
Bluetooth®キー | 常時、移行不可 |
Appleプッシュ通知サービス(APNs)トークン | 常時、移行不可 |
iCloudの証明書と秘密鍵 | 常時、移行不可 |
SIM PIN | 常時、移行不可 |
「探す」トークン | 常時 |
留守番電話 | 常時 |
macOSでは、構成プロファイルによってインストールされたすべてのキーチェーン項目は常時利用可能です。iOSとiPadOSでは、構成プロファイルによってインストールされたキーチェーン項目は、種類、参照方法、インストールのタイミングによって、アクセスできるタイミングが異なります。デフォルトでは、構成プロファイルを使用してインストールされたキーチェーン項目は、初回ロック解除後に利用可能となり、移行不可です。ただし、構成プロファイルによってインストールされたキーチェーン項目でも、以下の場合には常時利用可能となります:
iOS 15以降、iPadOS 15以降にアップグレードする前にインストールされた
証明書である(識別情報ではない)
com.apple.mdm
ペイロードのIdentityCertificateUUID
によって参照された識別情報である
キーチェーンアクセス制御
キーチェーンでは、アクセス制御リスト(ACL)を使用して、アクセス権や認証要件のポリシーを設定できます。Face IDやTouch IDの使用またはデバイスのパスコードまたはパスワードの入力による認証がない限り項目にアクセスできないように設定することで、正当なユーザが実際にデバイスを使用しているという条件を項目に設けることができます。また、項目の追加後にFace IDまたはTouch IDの登録が変更されていないという条件を指定して、項目へのアクセスを制限することもできます。この制限により、攻撃者が自分の指紋を追加してキーチェーン項目にアクセスすることを防止できます。ACLはSecure Enclave内で評価され、指定した制限が満たされた場合にのみカーネルに渡されます。
macOSのキーチェーンアーキテクチャ
さらにmacOSではキーチェーンにアクセスして、ユーザの名前とパスワード、デジタル署名、暗号鍵、秘密のメモなどを便利かつ安全に保存できます。キーチェーンにアクセスするには、「/アプリケーション/ユーティリティ/」にあるキーチェーンアクセスアプリケーションを使用します。キーチェーンを使用すれば、リソースごとに資格情報を入力する手間を省くことができ、覚えておく必要もなくなります。Macユーザごとに初期のデフォルトキーチェーンが1つ作成されます。また、目的に応じた追加のキーチェーンをユーザが作成することもできます。
macOSでは、ユーザのキーチェーンに加えて、ネットワーク資格情報やPKI(公開鍵基盤)識別情報など、ユーザ固有ではない認証情報を保存するための、システムレベルのキーチェーンが多数使用されます。その1つである「システムルート」キーチェーンには、オンラインバンキングや電子商取引などの一般的なタスクを円滑化するためのインターネットPKIルート認証局(CA)証明書が保存されます。このキーチェーンは変更できません。また、組織内のサイトやサービスで検証を円滑に行うために組織が用意したCA証明書を管理対象のMacコンピュータに導入することもできます。