Java 2 セキュリティーのアクセス制御例外
Java™ 2 セキュリティーの振る舞いは、それ自体のセキュリティー・ポリシーで指定されます。 セキュリティー・ポリシーとは、特定のコード・ベースがアクセスできるシステム・リソースを指定し、 そのシステム・リソースへの署名が必要なユーザーを指定するアクセス制御マトリックスです。 Java 2 セキュリティー・ポリシーは、java.security.AccessController.checkPermission メソッドによって実行される宣言です。
i = m;
while (i > 0) {
if (caller i's domain does not have the permission)
throw AccessControlException;
else if (caller i is marked as privileged)
return;
i = i - 1;
};
このアルゴリズムでは、java.security.AccessController.checkPermission メソッドが実行されるときに、 呼び出しスタック上のすべてのクラス (呼び出し元) に許可があることが必要で、 許可がない場合には、その要求は拒否され、java.security.AccessControlException 例外が作成されます。 ただし、呼び出し元が特権とマークされていて、 そのクラス (呼び出し元) にその許可が付与されている場合、 アルゴリズムは戻り、呼び出しスタック全体が全探索されることはありません。 後続のクラス (呼び出し元) に、必要な許可が付与されている必要はありません。
- アプリケーションが Java 2 セキュリティーで保護されているアプリケーション・プログラミング・インターフェース (API) を呼び出す場合は、アプリケーションの Java 2 セキュリティー・ポリシーに必要な許可を付与します。 アプリケーションが Java 2 セキュリティーで保護されている API を直接呼び出さない場合、必要な許可は、Java 2 セキュリティーで保護されているリソースにアクセスするサード・パーティー API の副次作用によりもたらされます。
- 必要な許可がアプリケーションに付与されている場合、必要以上にアクセスが行われます。 この場合は、Java 2 セキュリティーで保護されているリソースにアクセスするサード・パーティー・コードへの、特権のマークが適切ではない可能性があります。
呼び出しスタックの例
これは呼び出しスタックの例で、 ここでは、アプリケーション・コードがサード・パーティーの API ユーティリティー・ライブラリーを使用して、 パスワードを更新しています。 以下の例では、ポイントを説明しています。 コードに特権とマークする場所を決めるのは、 アプリケーションに固有で、しかも状況によって異なります。 この決定について的確な判断を下すには、 かなり深いドメインについての知識とセキュリティーの専門的知識を持っている必要があります。 このトピックについては、詳しく解説した出版物や書籍が多数あります。 詳細については、このような資料を参照することを強くお勧めします。
PasswordUtil ユーティリティー を使用すると、ユーザーのパスワードを変更できます。 ユーティリティーで旧パスワードと新規パスワード (こちらは 2 回) を入力して、正しいパスワードが確実に入力されるようにします。 旧パスワードがパスワード・ファイルに保管されているパスワードと一致した場合、 新規パスワードは保管され、パスワード・ファイルが更新されます。 スタック・フレームに、特権とマークされたものがないと仮定します。 java.security.AccessController.checkPermission アルゴリズムに従うと、 呼び出しスタック上のすべてのクラスにパスワード・ファイルへの書き込み許可が付与されている場合を除いて、アプリケーションは失敗します。 クライアント・アプリケーションには、パスワード・ファイルに直接書き込む許可、 およびパスワード・ファイルを任意に更新する許可がありません。
ただし、PasswordUtil.updatePasswordFile メソッドによって、 パスワード・ファイルにアクセスするコードに 特権のマークが付けられた場合、PasswordUtil クラスに 必要な許可が付与されているかぎり、 許可確認アルゴリズムは、 その許可のために PasswordUtil.updatePasswordFile メソッドを 呼び出すクラスから、 必要な許可を確認することはありません。 クライアント・アプリケーションは、パスワード・ファイルへの書き込み許可を付与しなくても、パスワードの更新を正常に実行できます。
コードに特権とマークする権限は、大変柔軟で強力です。 この権限は正しく使用されないと、 システムのセキュリティー全般が危険にさらされ、 セキュリティー・ホールが露出されることになる可能性があります。 コードに特権とマークする権限を使用する場合は十分に注意を払ってください。
java.security.AccessControlException 例外に対する解決方法
- 与えられていない許可をアプリケーションに付与する。
- 問題点とリスクを考慮した後、一部のコードに特権とマークする。