Q: Authorization Services(認証サービス)を使用するプログラムを記述しています。AuthorizationCopyRights を呼び出したときに、パスワードダイアログが表示される場合と表示されない場合があります。何が起こっているのでしょうか?
A: これは、Authorization Services と Security Server(セキュリティサーバ)の、あまり認識されていない側面が関係しています。何が起きているかをを理解するには、Security Server が認証をどのように実装しているかを理解する必要があります。
Security Server が特定のユーザについて認識しているものの 1 つに、資格情報があります。資格情報の標準的な例には、特定のユーザが有効なユーザ名とパスワードを入力したという情報があります。
Security Server は、グローバルな(ログインセッションごとの)資格情報キャッシュと、認可インスタンス [1] ごとの資格情報キャッシュを保持します。ある権限のために認証を要求する場合、(「/etc/authorization」の認可ポリシーデータベースにある)権限指定が、その権限を与えるために入手しなければならない資格情報のリストを示しています。権限指定にはまた、資格情報が共有されるかどうかを決定する shared キーも含まれていることがあります。権限指定の資格情報ごとに、Security Server は資格情報キャッシュから資格情報を取得しようとします。このとき、最初に認可インスタンスに関連する資格情報キャッシュを検索します。資格情報が存在せず、資格情報が共有されている場合は、次にグローバル資格情報キャッシュを検索します。キャッシュ内に資格情報が見つからない場合、Security Server は資格情報を取得しようとします。通常はここで認証ダイアログが表示され、ユーザはユーザ名とパスワードを入力することになります。しかし、Mac OS X の設定によっては、(スマートカードなど)ほかの場所から資格情報を取得することがあります。
資格情報を取得できると、Security Server はそれを認証インスタンスに関連付けられている資格情報キャッシュに記憶しますが、権限指定でその資格情報が共有されることが指定されていた場合は、グローバル資格情報キャッシュに記憶します。
権限指定に timeout キーがある場合、その値は、キャッシュした資格情報をこの権限に適用できる時間(秒単位)を示しています。値 0 は、資格情報を 1 回だけ使用できることを意味します(つまり、直ちにタイムアウトになります)。timeout キーがない場合、資格情報は常に権限の付与に使用できます(資格情報が破壊されている場合を除きます。下記を参照してください)。
上記の説明も、その結果として生じるいくつかの重要な動作を知るまでは、セキュリティに凝る人の雑学のように見えます。
- ログイン時に
loginwindow は、権限 system.login.console を取得します。その副作用として、ユーザがユーザ名とパスワードを知っていることを示す資格情報も取得され、資格情報がグローバル資格情報キャッシュに格納されます。
- ほかの大部分の権限指定(たとえば、ユーザが「システム環境設定」の設定を変更できるかどうかを制御する
system.preferences)は、ユーザに対し、管理者のユーザ名とパスワードを知っていることの証明を要求します。ユーザが admin グループに所属している場合は、ログインの操作により、この資格情報が取得され、グローバル資格情報キャッシュに格納されます。このため、admin グループに所属している場合は、「システム環境設定」で変更するためのパスワードを入力する必要がありません。
- アプリケーションが何らかの権限を要求したときに、ポリシーデータベースの権限指定で、新たに取得した資格情報はすべての共有されるものと指定されており、ユーザがユーザ名とパスワードを入力した場合、その資格情報はグローバル資格情報キャッシュに加わります。別のアプリケーション(つまり別の認可インスタンス)が権限を要求し、その権限指定で、ユーザ名とパスワードの資格情報が必要であることが示されていた場合、Security Server は、グローバル資格情報キャッシュにある資格情報を使用します。したがって、あるアプリケーションでユーザ名とパスワードを入力すると、ほかのアプリケーションでも同じ資格情報を使うことが許可されることになります。
結局、多くの場合、Security Server は必要な資格情報をすでにキャッシュしているので、AuthorizationCopyRights の呼び出しでは、ユーザ名とパスワードの入力は要求されないということです。
権限の要求時に取得した資格情報が、ほかの認可インスタンスと共有されないことを保証する唯一の方法は、その資格情報を破壊することです。資格情報を破壊するには、AuthorizationFree を呼び出し、フラグ kAuthorizationFlagDestroyRights を渡します。
注:
- 認可インスタンスは、ほとんどの場合
AuthorizationRef と同等ですが、AuthorizationRef を外部化してプロセス間で受け渡す場合は、1 つの認可インスタンスを共有する複数のプロセスを所有できます。
[2003 年 8 月 6 日]
|