セキュリティ
macOS TahoeのSecure Enclave搭載MacでログインキーチェーンをMac間でコピーすると失敗する
要約
macOS Tahoe以降、Secure Enclaveを搭載したMacでは、ログインキーチェーンファイルを別のMacにコピーしても、パスワードが正しくても正常に機能しなくなりました。これは、キーチェーンの暗号化キーがSecure Enclaveに紐づけられているため、コピー先のMacでは復号に必要なキーが利用できないことが原因です。
全文翻訳
最近、macOSのログインキーチェーンに関する問題に遭遇しました。ログインキーチェーンに馴染みのない方のために説明すると、これはmacOSが各ユーザーアカウントに対して自動的に作成するキーチェーンです。ユーザーのログインキーチェーンのパスワードは、Macへのログインに使用するパスワードと同じです。これは暗号化されたデータベースファイルとして保存され、デフォルトではログインパスワードとキーチェーンパスワードが同じであるため、ユーザーがログインすると自動的にアンロックされます。
macOS Tahoe以降、ログインキーチェーンはlogin.keychain-dbという名前のSQLiteデータベースファイルです。これはユーザーのホームフォルダの以下のディレクトリに保存されます:/Users/username_goes_here/Library/Keychains
従来は、ログインキーチェーンファイルをあるMacから別のMacにコピーし、そのパスワードを提供することで宛先のMacで開くことができました。macOS Tahoe以降では、Secure Enclaveを使用するMacではこれは機能しないようです。これらのMacでは、AppleのPlatform Securityドキュメントの「キーチェーンデータ保護」セクションで説明されている理由により、ログインキーチェーンのパスワードを持っているだけでは十分ではなくなりました。
キーチェーン項目は、テーブルキー(メタデータ)と行ごとのキー(秘密キー)の2つの異なるAES-256-GCMキーを使用して暗号化されます。キーチェーンメタデータ(kSecValue以外のすべての属性)は、検索を高速化するためにメタデータキーで暗号化され、秘密の値(kSecValueData)は秘密キーで暗号化されます。メタデータキーはSecure Enclaveによって保護されますが、キーチェーンの高速なクエリを可能にするためにアプリケーションプロセッサにキャッシュされます。秘密キーは常にSecure Enclaveを経由する必要があります。詳細については、ジャンプの下を参照してください。
上記の抜粋の関連部分は次のとおりです。「メタデータキーはSecure Enclaveによって保護されますが、キーチェーンの高速なクエリを可能にするためにアプリケーションプロセッサにキャッシュされます。秘密キーは常にSecure Enclaveを経由する必要があります。」
これによると、ログインキーチェーンのアンロックにはパスワード以上のものが必要であるように思われます。なぜなら、アンロックされるキーは、キーチェーンが作成されたMacのSecure Enclaveに紐づけられているからです。復号キーがソースMacのSecure Enclaveに保存されているため、キーチェーンを手動で別のMacにコピーしてからアンロックしても機能しません。キーチェーンのパスワードは正しいかもしれませんが、その内容を復号するために必要な実際のキーは宛先のMacでは利用できません。
Apple Silicon Macから別のMac(この場合はmacOS仮想マシン)にlogin.keychain-dbファイルをコピーし、アカウントの正しいパスワードを使用してアンロックを試みることで、これをテストできました。注意:macOS VMを使用してテストすることにした理由は、VMにはSecure Enclaveがないからです。これにより、キーがソースMacのSecure Enclaveに保存されている場合、VMはそのキーにアクセスできないことを確認できます。
使用したテスト手順は次のとおりです。
1. 以下のユーザー名でApple Silicon Macにユーザーアカウントを作成します:username
2. Apple Silicon Macでusernameアカウントにログインします。
3. /Users/username/Library/Keychainsにあるlogin.keychain-dbファイルを見つけます。
4. login.keychain-dbファイルを便利な場所にコピーします。
5. 新しいmacOS VMをセットアップします。
6. Apple Silicon Macのusernameアカウントで使用したのと同一のパスワードで、macOS VMにusernameユーザーアカウントを作成します。
7. macOS VMでusernameアカウントにログインします。
8. /Users/username/Library/Keychainsにあるlogin.keychain-dbファイルを見つけます。
9. macOS VMの/Users/username/Library/Keychainsにある既存のlogin.keychain-dbファイルを削除します。
10. Apple Silicon Macからlogin.keychain-dbファイルをmacOS VMの/Users/username/Library/Keychainsにコピーします。
11. macOS VMを再起動します。
12. macOS VMでusernameアカウントにログインします。
期待した動作:macOS VMでusernameアカウントとしてログインしたときに、ログインキーチェーンが自動的にアンロックされる。
実際の結果:usernameアカウントとしてmacOS VMにログインしたときに、新しいログインキーチェーンファイルが自動的に作成された。
なぜこうなったのか?ログを確認する時間だ。
正しいパスワードが提供されたにもかかわらず、アンロックの試行が失敗したことがログから確認できました。以下のコマンドを実行して関連ログを取得することで、これを裏付けることができました。
このファイルには、以下に表示されるものとは異なる解釈またはコンパイルがされる可能性のある、非表示または双方向のUnicodeテキストが含まれています。レビューするには、非表示のUnicode文字を表示するエディタでファイルを開いてください。双方向Unicode文字の詳細はこちら
非表示の文字を表示
log show --predicate 'subsystem == "com.apple.securityd" && category == "KCLogin"' --last 1h
view raw gistfile1.txt hosted with ❤ by GitHub
ログは以下を示しました。
このファイルには、以下に表示されるものとは異なる解釈またはコンパイルがされる可能性のある、非表示または双方向のUnicodeテキストが含まれています。レビューするには、非表示のUnicode文字を表示するエディタでファイルを開いてください。双方向Unicode文字の詳細はこちら
非表示の文字を表示
Timestamp Thread Type Activity PID TTL
2026-09-08 11:49:11.321174-0400 0x33c Default 0x2fb6 170 0 loginwindow: (Security) [com.apple.securityd:KCLogin] StorageManager::login: loginDLDbIdentifier is /Users/username/Library/Keychains/login.keychain
2026-09-08 11:49:11.321284-0400 0x33c Default 0x2fb6 170 0 loginwindow: (Security) [com.apple.securityd:KCLogin] Attempting to unlock login keychain "/Users/username/Library/Keychains/login.keychain-db"
2026-09-08 11:49:11.466352-0400 0x33c Default 0x2fb6 170 0 loginwindow: (Security) [com.apple.securityd:KCLogin] SecKeychainLogin result: 0, password was supplied
2026-09-08 11:50:53.497587-0400 0x338 Default 0x2d4a 170 0 loginwindow: (Security) [com.apple.securityd:KCLogin] StorageManager::login: loginDLDbIdentifier is /Users/username/Library/Keychains/login.keychain
2026-09-08 11:50:53.497759-0400 0x338 Default 0x2d4a 170 0 loginwindow: (Security) [com.apple.securityd:KCLogin] Attempting to unlock login keychain "/Users/username/Library/Keychains/login.keychain-db"
2026-09-08 11:50:53.713693-0400 0x338 Default 0x2d4a 170 0 loginwindow: (Security) [com.apple.securityd:KCLogin] SecKeychainLogin failed: -2147413984, password was supplied
2026-09-08 11:50:54.014314-0400 0x338 Default 0x2d4d 170 0 loginwindow: (Security) [com.apple.securityd:KCLogin] StorageManager::login: loginDLDbIdentifier is /Users/username/Library/Keychains/login.keychain
2026-09-08 11:50:54.014418-0400 0x338 Default 0x2d4d 170 0 loginwindow: (Security) [com.apple.securityd:KCLogin] Creating login keychain /Users/username/Library/Keychains/login.keychain
2026-09-08 11:50:54.240675-0400 0x338 Default 0x2d4d 170 0 loginwindow: (Security) [com.apple.securityd:KCLogin] Login keychain created successfully
view raw gistfile1.txt hosted with ❤ by GitHub
A. ログは、アンロック試行にパスワード値が提供されたことを確認しています。テスト設定からキーチェーンのパスワードが別途正しいことが確認されているため、単純なパスワードの不一致がアンロック失敗の原因である可能性は排除されるはずです。
このファイルには、以下に表示されるものとは異なる解釈またはコンパイルがされる可能性のある、非表示または双方向のUnicodeテキストが含まれています。レビューするには、非表示のUnicode文字を表示するエディタでファイルを開いてください。双方向Unicode文字の詳細はこちら
非表示の文字を表示
2026-09-08 11:50:53.713693-0400 0x338 Default 0x2d4a 170 0 loginwindow: (Security) [com.apple.securityd:KCLogin] SecKeychainLogin failed: -2147413984, password was supplied
view raw gistfile1.txt hosted with ❤ by GitHub
B. その後ファイルシステムを確認したところ、コピーされたキーチェーンファイルがlogin.keychに変更されていることが示されました。