(前回)Cocoaの日々
Keychain Service のドキュメント読みの続き。今日は ACL (Access Control List)の話。ここが Keychain のキモでもある。
前回のおさらい:
まず構成は...
[Keychain Services] |--login.keychain(デフォルト) | | | |-- keychain item 1 (data, attribute1, attribute2, ..) | |-- keychain item 2 (data, attribute1, attribute2, ..) | | : |
ACLについては...
- 各item は access object を持つ。access object には複数の access control list (ACL) が含まれる。
では、まとめ再開..
Mac Dev Center: Keychain Services Programming Guide: Keychain Services Concepts
Keychain Access Controls
- ACLの仕組みは Mac OS X のみで、iPhoneには適用されない(iPhoneは自身のKeychainのみアクセスできる)
- アプリケーションが Keychain へアクセスする時 ACL によって許可判定が行われる
- ACL が設定されていない場合は、拒否される
- ACL に信頼されたアプリケーションとして登録されている場合、アクセスは許可される。認証ダイアログは表示されない。※ただし Keychainにロックがかかっていない場合
- ACLに記載のないアプリケーションの場合、アクセス確認ダイアログが表示されユーザに許可を求める
- 1つの access object の中に複数の ACL を定義できる。ただし、評価順序は不定。
- ACL を使い、権限チェック(authorization)と信頼済アプリの設定が可能。それよりも複雑なチェックを行いたい場合は CSSM API を使うことができる。
trusted application object
- 信頼されたアプリのリストは、"trusted application object" ( SecTrustedApplicationRef ) のリストで構成される
- trusted application object は、アプリケーションを識別する為のデータを持つ(暗号化されたハッシュ値のようなもの)
- システムはこのデータを使うことで、アプリが ACLへ登録された後に変更されていないかどうか知ることができる。
- このデータは、非公開の形式で読取や解析はサポートされていない。
- 信頼されたアプリの登録には SecTrustedApplicationCreateFromPath 使える
- 登録後にアプリに変更が入った場合は、信頼されたアプリと認識されない。この場合、アクセス確認ダイアログが表示されてユーザに許可を求める
Application access confirmation dialog
- 信頼されたアプリ以外のアプリから Keychain へアクセスがあった場合、アクセス確認ダイアログが表示される。
- アクセス確認ダイアログには "Deny", "Allow once", "Always Allow" の三択が表示される。
- "Always Allow" が選択された場合、trusted application object が生成され、当該Keychain item 内の access objectへ登録される。
- DLLが更新された時、そのDLLを使用しているプログラムバイナリが更新される (re-prebinding)。
- Mac OS X v10.2 以前は、アクセス確認ダイアログが表示され、Always Allow が選択された場合は新しいアプリとして登録される
- Mac OS X v10.3 以降では、システムは更新されたアプリをトラッキングしていて、ほとんどの場合アクセス確認ダイアログは表示されない。
- さらに Mac OS X v10.3 以降は、Software Update によって更新されたアプリはトラッキングされている。この為、更新後も信頼されたアプリと認識し、アプリ更新確認ダイアログ ( Confirm Application Change) が表示される。選択肢は "Don't change" と "Change All"。後者を選択すると現行ユーザの Keychain が更新される。
- - - -
今日の話を受けて、構成は次のように書き直せる。
[Keychain Services] |--login.keychain(デフォルト) | | | |-- keychain item 1 (data, attribute1, attribute2, .., access object(ACL1, ACL2, ...)) | |-- keychain item 2 (data, attribute1, attribute2, .., access object(ACL1, ACL2, ...)) | | : |
別の表現
[Keychain Service] |--login.keychain(デフォルト) | | | |-- keychain item1 | | |-- data | | |-- attributes (attr1, attr2, ...) | | |-- access object (ACL1, ACL2, ...) | | | |-- keychain item2 | | |-- data | | |-- attributes (attr1, attr2, ...) | | |-- access object (ACL1, ACL2, ...) | : |