ページ

2010年3月2日火曜日

Keychain Services 調査 (4) ドキュメントを読む #2 - ACL

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

(前回)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 Applications

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へ登録される。
Changed software confirmation dialog

  • 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, ...)
  |    :
  |