当初、JavaTM 認証・承認サービス (JavaTM Authentication and Authorization Service: JAAS) は、JavaTM 2 SDK, Standard Edition (J2SDK), v 1.3 のオプションパッケージ (拡張機能) でした。 現在、JAAS は J2SDK, v 1.4 に統合されています。
JAAS は、次の 2 つの目的で使用できます。
- ユーザを「認証する」際、コードがアプリケーション、アプレット、Bean、またはサーブレットであるかに関係なく、Java コードを実行中のユーザを信頼かつ安全な方法で確認する
- ユーザを「承認する」際、動作の実行に必要なアクセス制御権 (アクセス権) をユーザが保持していることを確認する
JAAS は、Java バージョンの標準 Pluggable Authentication Module (PAM) フレームワークを実装します。 詳細については、「Making Login Services Independent of Authentication Technologies」を参照してください。
これまで、Java 2 は、コードソースベースのアクセス制御 (コードの出所および署名者に基づくアクセス制御) を提供してきました。 しかし、コードの実行者に基づくアクセス制御を追加実行する機能は不足していました。 JAAS は、Java 2 セキュリティアーキテクチャを拡張するフレームワークにより、この機能をサポートします。
JAAS 認証は、「プラグ可能」方式で実行されます。 このため、アプリケーションは、基盤となる認証技術から独立して機能します。 アプリケーション内では、新規または更新された認証技術をプラグインとして使用できます。アプリケーションを変更する必要はありません。 アプリケーションは、LoginContext オブジェクトをインスタンス化することにより、認証プロセスを有効にします。一方、
LoginContext
オブジェクトはConfiguration
を参照して、使用する認証技術またはLoginModule
を決定します。 一般的なログインモジュールは、ユーザ名およびパスワードの入力を促し、入力されたものを検証します。 音声や指紋の読み取りおよびオブジェクトで検証が実行できるものもあります。コードを実行するユーザが認証されると、JAAS 承認コンポーネントはコア Java アクセス制御モデルと連動して機能し、慎重な操作の必要なリソースへのアクセスを保護します。 アクセス制御の決定がコード位置およびコード署名者 (
CodeSource
) のみに基づく J2SDK, v 1.3 とは異なり、J2SDK, v 1.4 では、アクセス制御の決定は、実行コードのCodeSource
およびコードを実行する Subject で表されるユーザまたはサービスに基づいています。 認証に成功した場合、ログインモジュールは、関連するPrincipal
およびクレデンシャルを使ってSubject
を更新します。このドキュメントの対象読者
このドキュメントは、
CodeSource
ベースおよびSubject
ベースのセキュリティモデルの制約を受けるアプリケーションを設計する上級開発者を対象としています。 ログインモジュール開発者 (認証技術を実装する開発者) は、「JAAS ログインモジュール開発者ガイド」 の前にこのドキュメントをお読みください。最初に「JAAS 認証」と「JAAS 承認」 の 2 つのチュートリアルで JAAS の使用方法の概要と有効なサンプルコードを確認した上で、このドキュメントから詳細情報を得ることもできます。
関連ドキュメント
このドキュメントでは、読者がすでに次のドキュメントを読んでいることを前提としています。
「JAAS ログインモジュール開発者ガイド」は、認証技術を実装する
LoginModule
を記述する必要がある上級プログラマ向けのドキュメントであり、このドキュメントの補足として役立ちます。標準 Pluggable Authentication Module (PAM) フレームワーク (JAAS は Java バージョンの PAM を実装) の詳細情報を取得したい読者は、「Making Login Services Independent of Authentication Technologies」を参照してください。
以下の「チュートリアル」は、JASS 認証および承認を利用するすべてのユーザを対象としています。
以下のチュートリアルは、JAAS 認証および承認チュートリアルと似ていますが、Kerberos ログインモジュールの使用方法の解説が含まれるため、使用する前に Kerberos をインストールする必要があります。
この 2 つのチュートリアルは、認証と安全な通信のための基盤技術として Kerberos を利用する Java GSS-API および JAAS の一連のチュートリアルに含まれています。
以前のバージョンの JAAS (JAAS 1.0) と、J2SDK, v 1.4 に含まれる JAAS との相違点を、以下に示します。
J2SDK が JAAS を統合
JavaTM 2 SDK, Standard Edition (J2SDK), バージョン 1.3.x では、JAAS はオプションパッケージ (拡張機能) でした。J2SDK, v 1.4 には、今回 JAAS が統合されました。 JAAS は、ユーザの認証およびアクセス制御の実行手段を提供することにより、コア Java 2 プラットフォームを拡張します。
この統合により、システムのセキュリティポリシー関連が影響を受けます。 J2SDK, バージョン 1.3 以前は、独自のポリシークラス (
java.security.Policy
) を保持していました。 オプションパッケージの JAAS 1.0 では、Principal
ベースのセキュリティポリシー (javax.security.auth.Policy
) が追加提供されていました。 コア SDK への統合により SDK ポリシーが優先されるため、JAAS ポリシーは非推奨になりました。SDK
Policy
API が更新され、Principal
ベースのクエリーを使用できるようになりました。さらに、Policy
リファレンス実装が更新され、ポリシーファイル内でPrincipal
ベースのgrant
エントリを使用できるようになりました。これらのエントリには、Principal
フィールドが含まれている場合があります。Principal
フィールドは、指定のアクセス権を持ち、ユーザまたは指定されたPrincipal
で表現されるその他のエンティティを示し、指定されたコードを実行します。 ポリシーファイルを視覚的に作成するためのユーティリティ、Policy Tool も拡張され、Principal
フィールドを取り込めるようになりました。 これらの変更に合わせて、com.sun.security.auth
パッケージ内の JAAS 1.0Policy
リファレンス実装およびそのサポートするクラスは、非推奨になりました。
Policy
リファレンス実装と関連 API の変更点については、ポリシーについてのドキュメントを参照してください。新しいクラスとインタフェース
次のクラスとインタフェースが追加されました。
非推奨項目
以下に、非推奨項目を示します。
- 非推奨 推奨 新規 UnixLoginModule は、Solaris と Linux の両方で使用可能です。
- 非推奨 推奨
- 非推奨 推奨
- 非推奨 推奨
- 非推奨 推奨
javax.security.auth.AuthPermission
ターゲット名の非推奨推奨
- "createLoginContext"
- "createLoginContext.{configuration entry name}"
JAAS 関連コアクラスおよびインタフェースは、共通クラス、認証クラス、および承認クラスの 3 つのカテゴリに分類できます。
- 共通クラス
- Subject、Principal、Credential (任意のオブジェクト)
- 認証クラスとインタフェース
- 承認クラス
共通クラス
共通クラスは、JAAS 認証および承認コンポーネントの両方に共通です。重要な JAAS クラス、javax.security.auth.Subject は、単一エンティティ (人物など) の関連情報のグループ化を表します。 関連情報には、エンティティの Principal、public クレデンシャル、および private クレデンシャルなどがあります。
プリンシパルの表現には、
java.security.Principal
インタフェースが使用されます。 また、JAAS により定義されるクレデンシャルには、任意のオブジェクトを指定できます。サブジェクト
リソースへのアクセスを承認する場合、最初に、アプリケーションが要求元を認証する必要があります。 JAAS フレームワークでは、要求元を「サブジェクト」という語で表します。 サブジェクトは、ユーザやサービスなどの任意のエンティティです。 一度、サブジェクトが認証されるとjavax.security.auth.Subject
が関連する識別情報、または Principal で占められます。 単一のサブジェクトが複数のプリンシパルを持つ場合もあります。たとえば、ある人物は、名前のプリンシパル (「John Doe」) および SSN プリンシパル (「123-45-6789」) を持ちます。これらのプリンシパルにより、この人物は他のサブジェクトと区別されます。サブジェクトは、「クレデンシャル」と呼ばれるセキュリティ関連の属性も保持できます。 非公開暗号化鍵など、特別な保護が必要なクレデンシャルは、非公開クレデンシャル
Set
内に格納されます。 公開鍵証明書などの共有されるクレデンシャルは、公開クレデンシャルSet
内に格納されます。 クレデンシャルSet
が異なると、それにアクセスおよび変更するためのアクセス権も異なります。サブジェクトは、次のコンストラクタを使用して作成されます。
public Subject(); public Subject(boolean readOnly, Set principals, Set pubCredentials, Set privCredentials);最初のコンストラクタは、プリンシパルおよびクレデンシャルの空 (null ではない) のSet
でサブジェクトを作成します。 2 番目のコンストラクタは、指定されたプリンシパルおよびクレデンシャルのSet
でサブジェクトを作成します。 サブジェクトを読み取り専用にするために使用できるboolean 型の引数も持っています。 読み取り専用のサブジェクト内では、プリンシパルおよびクレデンシャルSet
は不変です。アプリケーション作成者がサブジェクトをインスタンス化する必要はありません。 アプリケーションが
LoginContext
をインスタンス化し、サブジェクトをLoginContext
コンストラクタに渡さない場合、LoginContext
は新しい空のサブジェクトをインスタンス化します。 LoginContext のセクションを参照してください。サブジェクトが読み取り専用の状態でインスタンス化されなかった場合、次のメソッドを呼び出して読み取り専用に設定できます。
public void setReadOnly();ターゲット名「setReadOnly」を持つjavax.security.auth.AuthPermission
は、このメソッドの呼び出すために要求されます。 読み取り専用に設定した後で、プリンシパルやクレデンシャルを追加または削除しようとすると、IllegalStateException
がスローされます。次のメソッドを使用して、サブジェクトの読み取り専用状態をテストできます。
public boolean isReadOnly();サブジェクトに関連したプリンシパルを取得する場合、次の 2 つのメソッドを利用できます。
public Set getPrincipals(); public Set getPrincipals(Class c);最初のメソッドは、サブジェクトに含まれるすべてのプリンシパルを返します。一方、2 番目のメソッドは、指定されたクラス
c
またはそのサブクラスのインスタンスになっているプリンシパルしか返しません。 サブジェクトに関連付けられているプリンシパルがない場合は、空のセットが返されます。サブジェクトに関連した公開クレデンシャルを取得する場合は、次のメソッドを利用できます。
public Set getPublicCredentials(); public Set getPublicCredentials(Class c);これらのメソッドの動作は
getPrincipals
メソッドの動作と似ています。ただし、getPrincipals
メソッドでは、公開クレデンシャルを取得することはできません。
サブジェクト
に関連した非公開クレデンシャルにアクセスする場合は、次のメソッドを利用できます。public Set getPrivateCredentials(); public Set getPrivateCredentials(Class c);これらのメソッドの動作は、
getPrincipals
メソッドやgetPublicCredentials
メソッドとよく似ています。サブジェクトのプリンシパル
Set
、公開クレデンシャルSet
、または非公開クレデンシャルSet
を変更または操作する場合、呼び出し側はjava.util.Set
クラスで定義されたメソッドを使用します。 その方法を示すサンプルコードを以下に示します。Subject subject; Principal principal; Object credential; . . . // add a Principal and credential to the Subject subject.getPrincipals().add(principal); subject.getPublicCredentials().add(credential);注: 「modifyPrincipals」、「modifyPublicCredentials」、または「modifyPrivateCredentials」のいずれかのターゲット名を持つ
AuthPermission
は、それぞれのSet
を変更するために要求されます。サブジェクトの内部セットが返すのは、引数なしのgetPrincipals()
、getPublicCredentials()
、getPrivateCredentials()
メソッドから返されるセットだけです。 このため、返されたセットを変更すると、内部セットも影響を受けます。 サブジェクトの内部セットは、getPrincipals(Class c)
、getPublicCredentials(Class c)
、getPrivateCredentials(Class c)
メソッドから返されるセットは返しません。 メソッド呼び出しごとに、新規セットが作成され、返されます。 これらのセットを変更しても、サブジェクトの内部セットに影響はありません。非公開クレデンシャルの Set で繰り返し処理を実行するには、各クレデンシャルにアクセスするため、
javax.security.auth.PrivateCredentialPermission
が必要です。 詳細については、PrivateCredentialPermission
API ドキュメントを参照してください。サブジェクトは
AccessControlContext
と関連付けられます (以下のdoAs
およびdoAsPrivileged
メソッドの解説を参照)。 次のメソッドは、指定されたAccessControlContext
と関連したサブジェクトを返します。指定されたAccessControlContext
と関連付けられたサブジェクトが存在しない場合には、null
を返します。public static Subject getSubject(final AccessControlContext acc);ターゲット名「getSubject」を持つ
AuthPermission
は、Subject.getSubject
を呼び出すために要求されます。
Subject
クラスには、java.lang.Object
から継承した次のメソッドも含まれます。public boolean equals(Object o); public String toString(); public int hashCode();特定のサブジェクトとしてアクションを実行する doAs メソッド
次の static メソッドは、特定のサブジェクトとしてアクションを実行します。public static Object doAs(final Subject subject, final java.security.PrivilegedAction action); public static Object doAs(final Subject subject, final java.security.PrivilegedExceptionAction action) throws java.security.PrivilegedActionException;どちらのメソッドも、指定されたサブジェクトを現行スレッドの
AccessControlContext
に関連付けてから、action
を実行します。 これにより、サブジェクトとしてaction
を実行する効果が得られます。 最初のメソッドでは、実行時例外がスローされる可能性がありますが、通常の実行では、action
引数を指定してrun
メソッドを実行して得られたオブジェクトが返されます。 2 番目のメソッドも、PrivilegedExceptionAction run
メソッドからのチェックされた例外をスローする場合があることを除き、動作は同じです。 ターゲット名 "doAs" を持つAuthPermission
は、doAs
メソッドを呼び出すために要求されます。次に、
doAs
メソッドを最初に利用する場合の例を示します。 ユーザ "Bob" がLoginContext
によって認証されたため、com.ibm.security.Principal
クラスのプリンシパルにサブジェクトが生成され、プリンシパルの名前が "BOB" になったと想定してください。 また、SecurityManager がインストール済みで、アクセス制御ポリシー内に以下が存在するものとします (ポリシーファイルの詳細については Policy を参照)。// grant "BOB" permission to read the file "foo.txt" grant Principal com.ibm.security.Principal "BOB" { permission java.io.FilePermission "foo.txt", "read"; };以下に、サンプルアプリケーションコードを示します。
class ExampleAction implements java.security.PrivilegedAction { public Object run() { java.io.File f = new java.io.File("foo.txt"); // the following call invokes a security check if (f.exists()) { System.out.println("File foo.txt exists"); } return null; } } public class Example1 { public static void main(String[] args) { // Authenticate the subject, "BOB". // This process is desribed in the // LoginContext section. Subject bob; // Set bob to the Subject created during the // authentication process // perform "ExampleAction" as "BOB" Subject.doAs(bob, new ExampleAction()); } }実行時に、
ExampleAction
がf.exists()
を呼び出すと、セキュリティチェックが実行されます。 ただし、ExampleAction
が 「BOB」 として実行中であり、ポリシー (上記) により必要なFilePermission
が 「BOB」 に付与されているため、ExampleAction
はセキュリティチェックを通過します。 ポリシー内のgrant
文を変更する (たとえば、不正なCodeBase
を追加するかプリンシパルを "MOE" に変更する) と、SecurityException
がスローされます。doAsPrivileged メソッド
次のメソッドも、特定のサブジェクトとしてアクションを実行します。
public static Object doAsPrivileged( final Subject subject, final java.security.PrivilegedAction action, final java.security.AccessControlContext acc); public static Object doAsPrivileged( final Subject subject, final java.security.PrivilegedExceptionAction action, final java.security.AccessControlContext acc) throws java.security.PrivilegedActionException;ターゲット名「doAsPrivileged」を持つ
AuthPermission
は、doAsPrivileged
メソッドを呼び出すために要求されます。doAs と doAsPrivileged
doAsPrivileged
メソッドの動作は、doAs
とまったく同じです。ただし、指定されたサブジェクトを現行のスレッドのAccessControlContext
に関連付ける代わりに、指定されたAccessControlContext
を使用します。 このように、現行のものとは異なったAccessControlContext
によってアクションが制限されることがあります。
AccessControlContext
には、AccessControlContext
のインスタンス化以降に実行されたすべてのコードに関する情報 (コード位置や、ポリシーによってコードに付与されたアクセス権など) が含まれます。 アクセス制御チェックを成功させるため、ポリシーは、AccessControlContext
によって参照される各コード項目に、必要なアクセス権を付与する必要があります。
doAsPrivileged
に提供されたAccessControlContext
がnull
である場合、アクションが別のAccessControlContext
によって制限されることはありません。 このことは、サーバ環境で役立つ場合があります。 サーバは、複数の着信要求を認証し、各要求に対して別々のdoAs
を実行することができます。 各doAs
アクションを新たに開始し、現行のサーバの制限AccessControlContext
をなくすため、サーバはdoAsPrivileged
を呼び出し、null
AccessControlContext
を提供することができます。Principals
以前に説明したように、認証に成功した場合、プリンシパルをサブジェクトに関連付けることができます。 プリンシパルは、サブジェクトの識別情報を表します。また、java.security.Principal
およびjava.io.Serializable
インタフェースを実装する必要があります。 サブジェクトに関連したプリンシパルの更新方法は、サブジェクトを参照してください。Credentials
公開および非公開クレデンシャルクラスは、コア JAAS クラスライブラリの一部ではありません。 あらゆるクラスがクレデンシャルになります。 ただし、開発者は、クレデンシャルに関連する 2 つのインタフェース、Refreshable
およびDestroyable
を実装するクレデンシャルクラスを持つことを決定できます。Refreshable
この
javax.security.auth.Refreshable
インタフェースは、クレデンシャルの自動更新機能を提供します。 たとえば、有効期間の制限されたクレデンシャルがこのインタフェースを実装すると、呼び出し側が有効期間を更新できるようになります。 このインタフェースには、次の 2 つの abstract メソッドがあります。boolean isCurrent();このメソッドは、クレデンシャルが現在有効かどうかを判定します。void refresh() throws RefreshFailedException;このメソッドは、クレデンシャルの有効期間を更新または拡張します。 このメソッド実装は、AuthPermission("refreshCredential")
セキュリティチェックを実行します。このため、呼び出し側はクレデンシャルを更新するためのアクセス権を保持します。Destroyable
この
javax.security.auth.Destroyable
インタフェースは、クレデンシャルのコンテンツを破棄する機能を提供します。 このインタフェースには、次の 2 つの abstract メソッドがあります。boolean isDestroyed();このメソッドは、クレデンシャルが破棄されたかどうかを判別します。void destroy() throws DestroyFailedException;このメソッドは、このクレデンシャルに関連した情報を破棄および消去します。 以降、このクレデンシャルの特定メソッドを呼び出すと、IllegalStateException
がスローされます。 このメソッド実装は、AuthPermission("destroyCredential")
セキュリティチェックを実行します。このため、呼び出し側はクレデンシャルを破棄するためのアクセス権を保持します。認証クラスとインタフェース
サブジェクト (ユーザまたはサービス) の認証では、次の処理が行われます。
- アプリケーションが
LoginContext
をインスタンス化します。
LoginContext
が、Configuration
からアプリケーション用に構成されたすべてのログインモジュールをロードします。
- アプリケーションが、
LoginContext
のlogin
メソッドを呼び出します。
login
メソッドがロードされたすべてのログインモジュールを呼び出します。各ログインモジュールはサブジェクトを認証しようとします。 成功した場合、認証されているサブジェクトを表すSubject
オブジェクトに、適切なプリンシパルとクレデンシャルを関連付けます。
LoginContext
が、認証状態をアプリケーションに返します。
- 認証が成功すると、アプリケーションは
Subject
をLoginContext
から取得します。
以下では、認証クラスについて説明します。
LoginContext
javax.security.auth.login.LoginContext
クラスは、サブジェクトの認証に使用される基本的なメソッドを提供します。このクラスを使用すると、基盤となる認証技術に依存しないアプリケーションを開発できます。LoginContext
は、Configuration
への問い合わせを実行して、特定のアプリケーション用に構成された認証サービスまたはLoginModule
を確認します。 このため、アプリケーション自体を変更せずに、複数の異なるログインモジュールをプラグインとしてアプリケーションで使用できます。
LoginContext
は、選択可能な 4 つのコンストラクタを提供します。public LoginContext(String name) throws LoginException; public LoginContext(String name, Subject subject) throws LoginException; public LoginContext(String name, CallbackHandler callbackHandler) throws LoginException public LoginContext(String name, Subject subject, CallbackHandler callbackHandler} throws LoginExceptionすべてのコンストラクタは、共通のパラメータname
を共有します。LoginContext
は、この引数をログイン構成のインデックスとして使用し、LoginContext
のインスタンス化を行うアプリケーション用として構成されるログインモジュールを特定します。 サブジェクトを入力パラメータとして取らないコンストラクタは、新規サブジェクトをインスタンス化します。 どのコンストラクタでも、null の入力は許可されません。 呼び出し元はターゲット名「createLoginContext.<name>」を持つAuthPermission
に対して、LoginContext
のインスタンス化を要求します。 ここで、<name> は、アプリケーションがLoginContext
のインスタンス化の際にname
パラメータで参照するログイン構成エントリの名前です。
CallbackHandler
とこれが必要な状況については、CallbackHandler のセクションを参照してください。実際の認証は、次のメソッドへの呼び出しを使って行われます。
public void login() throws LoginException;
login
を呼び出すと、すべての構成済みログインモジュールが呼び出され、認証を実行します。 認証に成功した場合は、次のメソッドを使用して、認証されたサブジェクト (プリンシパル、公開クレデンシャル、および非公開クレデンシャル) を取得できます。public Subject getSubject();サブジェクトをログアウトして、認証済みのプリンシパルおよびクレデンシャルを削除するには、次のメソッドを使用します。
public void logout() throws LoginException;次のサンプルコードは、サブジェクトの認証およびログアウトに必要な呼び出しを示します。
// let the LoginContext instantiate a new Subject LoginContext lc = new LoginContext("entryFoo"); try { // authenticate the Subject lc.login(); System.out.println("authentication successful"); // get the authenticated Subject Subject subject = lc.getSubject(); ... // all finished -- logout lc.logout(); } catch (LoginException le) { System.err.println("authentication unsuccessful: " + le.getMessage()); }LoginModule
LoginModule
インタフェースを使用すると、異なる種類の認証技術を実装して、アプリケーションでプラグインとして利用できます。 たとえば、ユーザ名/パスワードベースの認証を実行できるログインモジュールがあります。 スマートカードやバイオメトリックデバイスなどのハードウェアへのインタフェースを提供するログインモジュールもあります。注: アプリケーション作成者は、ログインモジュールの機能を理解していなくてもかまいません。アプリケーションの作成と構成情報 (ログイン構成ファイルの内容など) の指定に集中し、アプリケーションが構成によって指定されたログインモジュール利用してユーザを認証できるようにしてください。
認証技術を実装するログインモジュールを作成する必要があるプログラマは、「JAAS ログインモジュール開発者ガイド」 で具体的な手順を確認してください。
CallbackHandler
ログインモジュールがユーザとの通信を介して認証情報を取得することが必要な場合があります。 ログインモジュールは、 javax.security.auth.callback.CallbackHandler を使用してこれを実行します。 アプリケーションは、
CallbackHandler
インタフェースを実装し、これをLoginContext
に渡します。LoginContext
はこれを基盤となるログインモジュールに直接転送します。ログインモジュールはCallbackHandler
を使って、ユーザからの入力 (パスワード、スマートカードなどの暗証番号など) を収集したり、ユーザに情報 (状態情報など) を提供したりします。 アプリケーションにCallbackHandler
の指定を許可することにより、基盤となるログインモジュールは、アプリケーションとユーザ間の通信方法に依存せずに動作するようになります。 たとえば、GUI アプリケーション用のCallbackHandler
実装は、ウィンドウを表示してユーザの入力を促します。 一方、非 GUI ツール用のCallbackHandler
は、コマンド行から直接入力するようユーザに求めます。CallbackHandler
は、1 つのメソッドを持った実装するためのインタフェースです。void handle(Callback[] callbacks) throws java.io.IOException, UnsupportedCallbackException;ログインモジュールは
CallbackHandler handle
メソッドに適切なCallback
からなる配列 (たとえばユーザ名の場合 NameCallback、パスワードの場合 PasswordCallback) を渡し、要求に従ってユーザと通信し、Callback
内に適切な値を設定します。たとえば、NameCallback
を処理する場合、CallbackHandler
はユーザから名前を取得し、NameCallback
のsetName
メソッドを呼び出してその名前を格納します。
「CallbackHandler」
のドキュメントには、このドキュメントには記載されていない大量のサンプルが記載されています。Callback
javax.security.auth.callback パッケージには、Callback
インタフェースおよびいくつかの実装が含まれています。 ログインモジュールは、Callback
の配列を、CallbackHandler のhandle
メソッドに直接渡すことができます。使用方法の詳細については、各種
Callback
API を参照してください。承認クラス
JAAS 承認を行うには、実行中のコードと実行ユーザに基づいてアクセス権を付与し、次の作業を行う必要があります。
- LoginContext のセクションの説明に従ってユーザを認証する
- 認証の結果生成されるサブジェクトをサブジェクトの説明に従ってアクセス制御コンテキストに関連付ける
- 以下の説明に従ってセキュリティポリシー内にプリンシパルベースのエントリを構成する
以下では、
Policy
抽象クラスと承認固有のクラスAuthPermission
およびPrivateCredentialPermission
について説明します。Policy
java.security.Policy
クラスは、システム全体のアクセス制御ポリシーを表す抽象クラスです。Policy
API は J2SDK, v1.4 でアップグレードされ、Principal
ベースのクエリーをサポートするようになっています。J2SDK は、デフォルトで、ファイルベースのサブクラス実装を提供します。この実装もアップグレードされ、ポリシーファイル内で
Principal
ベースのgrant
エントリを使用できるようになっています。ポリシーファイルおよびその内部のエントリ構造の詳細は、 「デフォルトの Policy の実装とポリシーファイルの構文」を参照してください。
AuthPermission
javax.security.auth.AuthPermission
クラスは、JAAS に必須の基本的なアクセス権をカプセル化します。AuthPermission
には名前 (ターゲット名とも呼ばれる) は含まれますが、アクションリストは含まれません。したがって、名前付きアクセス権を得るか、アクセス権を得ないかのどちらかになります。
AuthPermission
は、java.security.Permission
から継承されたメソッドのほかに 2 つの public コンストラクタを持っています。public AuthPermission(String name); public AuthPermission(String name, String actions);最初のコンストラクタは、指定された name で新規AuthPermission
を作成します。 2 番目のコンストラクタも、指定された name でAuthPermission
オブジェクトを作成しますが、actions
引数が追加指定されています。この引数は現在のところ未使用であるため、null にします。 このコンストラクタは、Policy
オブジェクトで新規Permission
オブジェクトをインスタンス化するためだけに存在します。 その他の大半のコードでは、最初のコンストラクタの使用が適しています。現在のところ、
AuthPermission
オブジェクトは、Policy
、Subject
、LoginContext
、およびConfiguration
オブジェクトへのアクセスの保護に使用されます。 サポートされる有効な名前のリストについては、 AuthPermission の javadoc ドキュメントを参照してください。PrivateCredentialPermission
javax.security.auth.PrivateCredentialPermission
クラスは、サブジェクト
の非公開クレデンシャルへのアクセスを保護し、1 つの public コンストラクタを提供します。public PrivateCredentialPermission(String name, String actions);このクラスの詳細は、PrivateCredentialPermission javadoc のドキュメントを参照してください。
JAAS チュートリアルとサンプルプログラム
「JAAS 認証」 および 「JAAS 承認」 の各チュートリアルには、次のサンプルが含まれています。
- SampleAcn.java。JAAS 認証を説明するサンプルアプリケーション
- SampleAzn.java。承認チュートリアルで使用されるサンプルアプリケーション。 認証と承認の両方を説明する
- sample_jaas.config。両方のチュートリアルで使用されるサンプルログイン構成ファイル
- sampleacn.policy。認証チュートリアルのコードに必要なアクセス権を付与するサンプルポリシーファイル
- sampleazn.policy。承認チュートリアルのコードに必要なアクセス権を付与するサンプルポリシーファイル
- SampleLoginModule.java。チュートリアルのログイン構成ファイル (
sample_jaas.config
) によって、基盤となる適切な認証を実装するクラスとして指定される。 SampleLoginModule のユーザ認証は、ユーザによって指定された名前とパスワードが特定の値を持っていることを検証する処理である
- SamplePrincipal.java。
Principal
インタフェースを実装するサンプルクラス。 SampleLoginModule によって使用されるアプリケーション、ポリシーファイル、およびログイン構成ファイルの詳細については、チュートリアルを参照してください。
チュートリアルに説明されているとおり、アプリケーション作成者は SampleLoginModule.java や SamplePrincipal.java のコードを理解していなくてもかまいません。 ログインモジュールを作成するプログラマは、「JAAS ログインモジュール開発者ガイド」でその方法を確認できます。
付録 A: java.security セキュリティプロパティファイルでの JAAS 設定
java.security
マスターセキュリティプロパティファイル内で多数の JAAS 設定を行うことができます。このファイルは、Java 2 Runtime の lib/security ディレクトリ内にあります。JAAS は、
java.security
に次の 2 つの新しいセキュリティプロパティを追加します。
login.configuration.provider
login.config.url.n
次の既存のプロパティも JAAS ユーザと関係があります。
policy.provider
policy.url.n
ログイン構成プロバイダ
Sun Microsystems が提供するデフォルトの JAAS ログイン構成実装は、その構成情報をファイルから取得します。この情報は、チュートリアルに記載されている特殊な形式で提供されることになっています。
代替プロバイダクラス実装を
login.configuration.provider
プロパティ内に指定することで、デフォルトの JAAS ログイン構成実装を置き換えることができます。例を示します。
login.configuration.provider=com.foo.Configセキュリティプロパティlogin.configuration.provider
が見つからない、または指定されていない場合、デフォルト値が設定されます。login.configuration.provider=com.sun.security.auth.login.ConfigFileログイン構成プロバイダを、コマンド行から動的に設定することはできません。
ログイン構成 URL
Sun Microsystems が提供するデフォルト実装のように、ファイル内に構成情報が指定されていることを要求するログイン構成実装を使用している場合は、
login.config.url.n
プロパティに個々の URL を指定することにより、ログイン構成ファイルの位置を静的に設定できます。「n」は、1 から始まる連続した番号です。「n >= 2」のように複数の構成ファイルが指定される場合、それらは読み込まれ、結合されて単一の構成になります。例を示します。
login.config.url.1=file:C:/config/.java.login.config login.config.url.2=file:C:/users/foo/.foo.login.config構成ファイルの位置が
java.security
プロパティファイルに指定されておらず、コマンド行から-Djava.security.auth.login.config
オプションを使って動的に指定されてもいない場合、JAAS は以下からデフォルト構成のロードを試みます。file:${user.home}/.java.login.configポリシープロバイダ
代替プロバイダクラス実装を
policy.provider
プロパティ内に指定することで、デフォルトの JAAS アクセス制御ポリシー実装を置き換えることができます。例を示します。
policy.provider=com.foo.Policyセキュリティプロパティpolicy.provider
が見つからない、または指定されていない場合、Policy
はデフォルト値に設定されます。policy.provider=sun.security.provider.PolicyFileポリシープロバイダを、コマンド行から動的に設定することはできません。
ポリシーファイル URL
アクセス制御ポリシーファイルの位置は、
auth.policy.url.n
プロパティにそれぞれの URL を指定することにより、静的に設定できます。「n」は、1 から始まる連続した番号です。「n >= 2」のように複数のポリシーが指定される場合、それらは読み込まれ、結合されて単一のポリシーになります。例を示します。
policy.url.1=file:C:/policy/.java.policy policy.url.2=file:C:/users/foo/.foo.policy
java.security
プロパティファイルにポリシーファイルの位置が指定されておらず、-Djava.security.policy
オプションによってコマンド行から動的に指定されることもない場合、アクセス制御ポリシーは、J2SDK と同時にインストールされたシステムポリシーファイルと同じになります。 このポリシーファイルの特徴は次のとおりです。
- 標準の拡張機能にすべてのアクセス権を付与
- 任意のユーザが非特権ポートで待機することを許可
- 任意のコードがセキュリティ上それほど重要でない特定の「標準」プロパティ ("os.name"、"file.separator" など) を読み取ることを許可
サンプルマスターセキュリティプロパティファイル
以下に、Java 2 Runtime v1.4 で提供される
java.security
を示します。 JAAS 関連プロパティのサンプル設定は太字で示します。 この例では、policy.provider
、policy.url.n
、およびlogin.configuration.provider
プロパティのデフォルトのjava.security
ファイル内の値はそのまま使用します。 デフォルトのjava.security
ファイル内のlogin.config.url.n
の値はコメント化されています。 以下の例ではコメント化されていません。# # This is the "master security properties file". # # In this file, various security properties are set for use by # java.security classes. This is where users can statically register # Cryptography Package Providers ("providers" for short). The term # "provider" refers to a package or set of packages that supply a # concrete implementation of a subset of the cryptography aspects of # the Java Security API. A provider may, for example, implement one or # more digital signature algorithms or message digest algorithms. # # Each provider must implement a subclass of the Provider class. # To register a provider in this master security properties file, # specify the Provider subclass name and priority in the format # # security.provider.<n>=<className> # # This declares a provider, and specifies its preference # order <n>. The preference order is the order in which providers are # searched for requested algorithms (when no specific provider is # requested). The order is 1-based; 1 is the most preferred, followed # by 2, and so on. # # <className> must specify the subclass of the Provider class whose # constructor sets the values of various properties that are required # for the Java Security API to look up the algorithms or other # facilities implemented by the provider. # # There must be at least one provider specification in java.security. # There is a default provider that comes standard with the JDK. It # is called the "SUN" provider, and its Provider subclass # named Sun appears in the sun.security.provider package. Thus, the # "SUN" provider is registered via the following: # # security.provider.1=sun.security.provider.Sun # # (The number 1 is used for the default provider.) # # Note: Statically registered Provider subclasses are instantiated # when the system is initialized. Providers can be dynamically # registered instead by calls to either the addProvider or # insertProviderAt method in the Security class. # # List of providers and their preference orders (see above): # security.provider.1=sun.security.provider.Sun security.provider.2=com.sun.net.ssl.internal.ssl.Provider security.provider.3=com.sun.rsajca.Provider security.provider.4=com.sun.crypto.provider.SunJCE security.provider.5=sun.security.jgss.SunProvider # # Select the source of seed data for SecureRandom. By default it uses # a system/thread activity algorithm. Optionally, if the platform supports # it an entropy gathering device can be selected. # #securerandom.source=file:/dev/random # # The entropy gathering device is described as a URL and can # also be specified with the property "java.security.egd". For example, # -Djava.security.egd=file:/dev/urandom # Specifying this property will override the securerandom.source setting. # # Class to instantiate as the javax.security.auth.login.Configuration # provider. # login.configuration.provider=com.sun.security.auth.login.ConfigFile # # Default login configuration file # login.config.url.1=file:${user.home}/.java.login.config # # Class to instantiate as the system Policy. This is the name of the class # that will be used as the Policy object. # policy.provider=sun.security.provider.PolicyFile # The default is to have a single system-wide policy file, # and a policy file in the user's home directory. policy.url.1=file:${java.home}/lib/security/java.policy policy.url.2=file:${user.home}/.java.policy # whether or not we expand properties in the policy file # if this is set to false, properties (${...}) will not be expanded in policy # files. policy.expandProperties=true # whether or not we allow an extra policy to be passed on the command line # with -Djava.security.policy=somefile. Comment out this line to disable # this feature. policy.allowSystemProperty=true # whether or not we look into the IdentityScope for trusted Identities # when encountering a 1.1 signed JAR file. If the identity is found # and is trusted, we grant it AllPermission. policy.ignoreIdentityScope=false # # Default keystore type. # keystore.type=jks # # Class to instantiate as the system scope: # system.scope=sun.security.provider.IdentityDatabase # # List of comma-separated packages that start with or equal this string # will cause a security exception to be thrown when # passed to checkPackageAccess unless the # corresponding RuntimePermission ("accessClassInPackage."+package) has # been granted. package.access=sun. # # List of comma-separated packages that start with or equal this string # will cause a security exception to be thrown when # passed to checkPackageDefinition unless the # corresponding RuntimePermission ("defineClassInPackage."+package) has # been granted. # # by default, no packages are restricted for definition, and none of # the class loaders supplied with the JDK call checkPackageDefinition. # #package.definition= # # Determines whether this properties file can be appended to # or overridden on the command line via -Djava.security.properties # security.overridePropertiesFile=true # # Determines the default key and trust manager factory algorithms for # the javax.net.ssl package. # ssl.KeyManagerFactory.algorithm=SunX509 ssl.TrustManagerFactory.algorithm=SunX509 # # Determines the default SSLSocketFactory and SSLServerSocketFactory # provider implementations for the javax.net.ssl package. If, due to # export and/or import regulations, the providers are not allowed to be # replaced, changing these values will produce non-functional # SocketFactory or ServerSocketFactory implementations. # #ssl.SocketFactory.provider= #ssl.ServerSocketFactory.provider=
ログイン構成は、
java.security
ファイル内のlogin.config.url.n
セキュリティプロパティを使用して配置されます。 このプロパティの詳細およびjava.security
ファイルの位置については、「付録 A」を参照してください。デフォルトの Configuration 実装
ConfigFile
は、その構成情報をログイン構成ファイルから取得します。 JAAS の提供するデフォルトログイン Configuration 実装の詳細については、com.sun.security.auth.login.ConfigFile
クラスの javadoc を参照してください。以下はサンプルのログイン構成ファイルです。
Login1 { sample.SampleLoginModule required debug=true; }; Login2 { sample.SampleLoginModule required; com.sun.security.auth.module.NTLoginModule sufficient; com.foo.SmartCard requisite debug=true; com.foo.Kerberos optional debug=true; };アプリケーション Login1 は、構成済みのログインモジュールの
SampleLoginModule
のみを保持します。 このため、Login1 がサブジェクト (ユーザまたはサービス) を認証しようとする試みは、SampleLoginModule
が成功した場合にのみ成功します。アプリケーション Login2 の認証ロジックは、以下の表で簡単に説明できます。 注:
required
、sufficient
、requisite
、およびoptional
の各フラグについては、Configuration
の javadoc ドキュメントを参照してください。
* = 前の requisite モジュールが失敗するか、または前の sufficient モジュールが成功したため、アプリケーションに制御が返されるので、この値は微妙に変化します。
Login2 の認証状態 SampleLoginModule required 成功 成功 成功 成功 失敗 失敗 失敗 失敗 NTLoginModule sufficient 成功 失敗 失敗 失敗 成功 失敗 失敗 失敗 SmartCard requisite * 成功 成功 失敗 * 成功 成功 失敗 Kerberos optional * 成功 失敗 * * 成功 失敗 * 全体の認証 成功 成功 成功 失敗 失敗 失敗 失敗 失敗
最終更新日: 2001 年 8 月 8 日