当初、Java 認証・承認サービス (Java Authentication and Authorization Service: JAAS) は、Java 2 SDK, Standard Edition (J2SDK), v 1.3 のオプションパッケージでした。現在、JAAS は J2SDK, v 1.4 に統合されています。
JAAS は、次の 2 つの目的で使用できます。
このセクションでは、認証コンポーネントの基本的なチュートリアルを提供します。承認コンポーネントについては、「JAAS 承認」チュートリアルで説明します。
JAAS 認証は、プラグイン可能方式で実行されます。つまり、Java アプリケーションは、基盤となる認証技術から独立して機能します。新規または更新された技術を、アプリケーション自体を変更せずに、プラグインとして使用可能です。使用する特定の認証技術の実装は実行時に決定されます。その内容は、ログイン構成ファイルに指定します。このチュートリアルでは、認証テクノロジとして Kerberos を使用します。(「Kerberos 要件」を参照してください)。
このチュートリアルは、次のセクションで構成されます。
チュートリアルのコードを最初に実行してみる場合は、「コードの実行」を先に読んでから、その他のセクションに戻り、コードの記述および構成ファイルの詳細について学習してください。
認証チュートリアルコードは、単一のソースファイル JaasAcn.java に含まれています。このファイルの main
メソッドは、認証の実行後に、認証が成功したかどうかをレポートします。
ユーザーの認証用コードは、非常に簡潔です。次の 2 つのステップで構成されています。
最初に基本的なコードが、続いて、import 文およびエラー処理を含む JaasAcn.java
ソースファイルの完全なコードが表示されます。
ユーザーの認証には、まず javax.security.auth.login.LoginContext
が必要です。次に、LoginContext をインスタンス化する基本的な方法を示します。
import javax.security.auth.login.*; . . . LoginContext lc = new LoginContext(<config file entry name>, <CallbackHandler to be used for user interaction>);次に、このチュートリアルコードによるインスタンス化の実行方法を具体的に示します。
import javax.security.auth.login.*; import com.sun.security.auth.callback.TextCallbackHandler; . . . LoginContext lc = new LoginContext("JaasSample", new TextCallbackHandler());
引数について、次に説明します。
これは、LoginContext が、JAAS ログイン構成ファイル内でこのアプリケーションのエントリ検索に使用する名前です。詳細は、ここを参照してください。このようなエントリは、基盤となる適切な認証技術を実装するクラスを指定します。クラスは、javax.security.auth.spi
パッケージ内の LoginModule インタフェースを実装する必要があります。
サンプルコードでは、Kerberos 認証を行う com.sun.security.auth.module
パッケージの Krb5LoginModule
を使用します。
このチュートリアルで使用するログイン構成ファイル (jaas.conf) のエントリは、「JaasSample」という名前です。LoginContext コンストラクタの最初の引数には、この名前を指定してください。
LoginModule がユーザーと通信する必要がある場合 (たとえばユーザー名やパスワードの入力を求める場合)、通信は直接には行われません。このため、ユーザーとのさまざまな通信方法が存在します。実際のところ、ログインモジュールがユーザーと通信する際、特定の方法に依存しないようにすることは、望ましい方法です。LoginModule は、CallbackHandler を呼び出してユーザーとの通信を実行し、要求された情報 (ユーザー名、パスワードなど) を取得します。CallbackHandler は、javax.security.auth.callback
パッケージ内のインタフェースです。
使用する特定の CallbackHandler のインスタンスを、LoginContext コンストラクタの 2 番目の引数として指定します。LoginContext は、このインスタンスを基盤となる LoginModule (ここでは Krb5LoginModule) に転送します。通常、アプリケーションは、固有の CallbackHandler 実装を提供します。com.sun.security.auth.callback
パッケージには、サンプル実装として 2 つの単純な CallbackHandler (TextCallbackHandler と DialogCallbackHandler) が用意されています。このチュートリアルのコードでは、コマンド行に情報を出力し、コマンド行から入力を読み取る TextCallbackHandler を使用します。
login
メソッドの呼び出しこれで LoginContext lc
を保持できたので、login
メソッドを呼び出して認証処理を実行します。
lc.login();
LoginContext は、新しい空の javax.security.auth.Subject
オブジェクト (認証されるユーザーまたはサービスを表す) をインスタンス化します。LoginContext は、構成済み LoginModule (この例では Krb5LoginModule) を構築し、この新しいサブジェクトおよび TextCallbackHandler を使って初期化します。
LoginContext の login
メソッドは、Krb5LoginModule 内のメソッドを呼び出して、ログインおよび認証を実行します。Krb5LoginModule は、TextCallbackHandler を利用して、ユーザー名およびパスワードを取得します。次に、Krb5LoginModule は、この情報を使用して Kerberos KDC からユーザークレデンシャルを取得します。詳細は、Kerberos のドキュメントを参照してください。
認証に成功した場合、Krb5LoginModule は、(1) ユーザーを表す Kerberos プリンシパルと (2) ユーザーのクレデンシャル (TGT) をサブジェクトに追加します。これらの用語の詳細は、「サブジェクト、プリンシパル、認証、およびクレデンシャル」を参照してください。
そのあと、呼び出し側アプリケーションは、LoginContext の getSubject
メソッドを呼び出し (このステップは、このチュートリアルではオプション)、認証されたサブジェクトを取得します。
JaasAcn.java
コードここまでで、ユーザーの認証に必要な基本コードを見てきました。ここで、すべてを統合して、関連する import 文およびエラー処理を含む完全なクラスを JaasAcn.java 内に作成できます。
import javax.security.auth.*; import javax.security.auth.callback.*; import javax.security.auth.login.*; import com.sun.security.auth.callback.TextCallbackHandler; /** * This JaasAcn application attempts to authenticate a user * and reports whether or not the authentication was successful. */ public class JaasAcn { public static void main(String[] args) { // Obtain a LoginContext, needed for authentication. Tell // it to use the LoginModule implementation specified by // the entry named "JaasSample" in the JAAS login // configuration file and to also use the specified // CallbackHandler. LoginContext lc = null; try { lc = new LoginContext("JaasSample", new TextCallbackHandler()); } catch (LoginException le) { System.err.println("Cannot create LoginContext. " + le.getMessage()); System.exit(-1); } catch (SecurityException se) { System.err.println("Cannot create LoginContext. " + se.getMessage()); System.exit(-1); } try { // attempt authentication lc.login(); } catch (LoginException le) { System.err.println("Authentication failed: " System.err.println(" " + le.getMessage()); System.exit(-1); } System.out.println("Authentication succeeded!"); } }
JAAS 認証はプラグイン可能な形式で実行されるため、アプリケーションは、基盤となる認証技術から独立した状態を維持できます。システム管理者は、各アプリケーションで使用する認証技術 (ログインモジュール) を決定し、ログイン構成内に構成します。構成情報のソース (ファイルやデータベース) は、現在の javax.security.auth.login.Configuration 実装によって異なります。Sun Microsystems のデフォルトの Configuration
実装は、com.sun.security.auth.login.ConfigFile.html で説明するように、構成ファイルから構成情報を読み取ります。
ログイン構成ファイルとその内容、および使用するログイン構成ファイルの指定方法については、「JAAS ログイン構成ファイル」を参照してください。
すでに説明したように、このチュートリアルで使用するログイン構成ファイル jaas.conf には、次のエントリのみが含まれます。
JaasSample { com.sun.security.auth.module.Krb5LoginModule required; };
このエントリの名前は「JaasSample」です。チュートリアルアプリケーション JaasAcn
がエントリを参照するときに、この名前を使用します。このエントリは、ユーザー認証に使用するログインモジュールが com.sun.security.auth.module
パッケージ内の Krb5LoginModule であること、および認証が成功したと見なされるためにはこの Krb5LoginModule が「成功する」必要があることを示します。Krb5LoginModule が成功するのは、ユーザーが入力した名前およびパスワードを使用して、Kerberos KDC へのログインに成功した場合だけです。
Krb5LoginModule に引き渡し可能なすべてのオプションの詳細は、Krb5LoginModule ドキュメントを参照してください。
JAAS 認証チュートリアルコードを実行するには、次の操作を行う必要があります。
JaasAcn.java
をコンパイルします。
javac JaasAcn.java
JaasAcn
アプリケーションを実行します
-Djava.security.krb5.realm=<your_realm>
(使用する Kerberos レルム)。たとえば、レルムが「KRBNT-OPERATIONS.EXAMPLE.COM」の場合、-Djava.security.krb5.realm=KRBNT-OPERATIONS.EXAMPLE.COM
のように指定します。-Djava.security.krb5.kdc=<your_kdc>
(使用する Kerberos KDC)。たとえば、KDC が「samplekdc.example.com」の場合、-Djava.security.krb5.kdc=samplekdc.example.com
のように指定します。-Djava.security.auth.login.config=jaas.conf
。使用するログイン構成ファイルとして jaas.conf
を指定します。次に、完全なコマンドを示します。<your_realm>
を Kerberos レルムと、<your_kdc>
を Kerberos KDC と置き換えてください。
java -Djava.security.krb5.realm=<your_realm> -Djava.security.krb5.kdc=<your_kdc> -Djava.security.auth.login.config=jaas.conf JaasAcn
コマンド全体は、1 行で入力してください。ここでは、読みやすくするために複数行に分けて表示してあります。
Kerberos ユーザー名とパスワードの入力が求められます。ログイン構成ファイルで指定された、基盤となる Kerberos 認証メカニズムにより、Kerberos へのログインが行われます。ログインが成功すると、次のメッセージが表示されます。
Authentication succeeded!ログインが失敗した場合 (パスワードのスペルミスなどにより)、次のメッセージが表示されます。
Authentication failed:このあとに、失敗の原因が示されます。たとえば、ユーザー名のスペルが間違っている場合、次のようなメッセージが表示されます (読みやすくするため、書式を一部変更してあります)。
Authentication failed: Kerberos Authentication Failed: javax.security.auth.login.LoginException: KrbException: Client not found in Kerberos database
ログイン時のトラブルシューティングについては、「トラブルシューティング」を参照してください。
問題を修正したら、プログラムを再度実行します。
セキュリティーマネージャーがインストールされた環境で Java プログラムを実行する場合、有効なセキュリティーポリシーによりアクセス権が明示的に付与されているのでないかぎり、リソースへのアクセスやセキュリティー関連操作の実行は許可されません。J2SE v 1.2 以降と互換性のある Java プラットフォームでは、アクセス権の付与をポリシーファイル内のエントリに指定する必要があります。
大半のブラウザはセキュリティーマネージャーをインストールします。このため、一般にアプレットは、セキュリティーマネージャーに監視されながら実行されます。一方、アプリケーションではそのようなことはありません。これは、アプリケーションの実行時には、セキュリティーマネージャーは自動的にインストールされないためです。このため、JaasAcn
などのアプリケーションでは、デフォルトでリソースへのフルアクセスが可能です。
セキュリティーマネージャーを使用してアプリケーションを実行するには、コマンド行に -Djava.security.manager
引数を含めてインタプリタを呼び出すだけです。
ポリシーファイルは指定せずに、セキュリティーマネージャーを使用して JaasAcn
を呼び出そうすると (必要なアクセス権または AllPermission
を付与するデフォルトポリシー設定をほかの場所で保持しないかぎり)、次のメッセージが表示されます。
% java -Djava.security.manager \ -Djava.security.krb5.realm=<your_realm> \ -Djava.security.krb5.kdc=<your_kdc> \ -Djava.security.auth.login.config=jaas.conf JaasAcn Exception in thread "main" java.security.AccessControlException: access denied ( javax.security.auth.AuthPermission createLoginContext.JaasSample)
LoginContext の作成に必要なアクセス権をコードに付与するポリシーファイルが作成および使用されていないため、上に示すように AccessControlException が表示されます。
セキュリティーマネージャーをインストールした環境で JaasAcn
アプリケーションを実行するために必要なすべてのステップを、次に示します。「コードの実行」で説明した手順を実行済みの場合は、最初の 2 つのステップを省略できます。
JaasAcn.java
をコンパイルします。
javac JaasAcn.java
JaasAcn.class
を含む JAR ファイルを作成します。
jar -cvf JaasAcn.jar JaasAcn.class
このコマンドにより、JAR ファイル JaasAcn.jar
が作成され、その内部に JaasAcn.class
が格納されます。
LoginContext のインスタンス化を実行するコードに必要なアクセス権は、「createLoginContext.<entry name>」をターゲットとする javax.security.auth.AuthPermission
です。ここで、<entry name> は、アプリケーションが LoginContext のインスタンス化で参照する、ログイン構成ファイルのエントリ名です。コード内に示されているように、JaasAcn
アプリケーションが LoginContext のインスタンス化で使用する名前は、「JaasSample」です。
LoginContext lc = new LoginContext("JaasSample", new TextCallbackHandler());このため、次のアクセス権を
JaasAcn.jar
に付与する必要があります。
permission javax.security.auth.AuthPermission "createLoginContext.JaasSample";ポリシーファイル jaasacn.policy を、
JaasAcn.java
などの格納先ディレクトリにコピーします。これは、次の grant
文を含むテキストファイルで、JaasAcn.jar
(現在のディレクトリ内) に必要なアクセス権を付与します。
grant codebase "file:./JaasAcn.jar" { permission javax.security.auth.AuthPermission "createLoginContext.JaasSample"; };
注:ポリシーファイルおよびその内部のエントリ構造については、「デフォルトの Policy の実装とポリシーファイルの構文」を参照してください。アクセス権の詳細は、ここを参照してください。
JaasAcn
アプリケーションを実行します
-classpath
節 (JaasAcn.jar
JAR ファイル内のクラスを検索するため)。-Djava.security.manager
。セキュリティーマネージャーのインストールを指定します。-Djava.security.krb5.realm=<your_realm>
(使用する Kerberos レルム)。たとえば、レルムが「KRBNT-OPERATIONS.EXAMPLE.COM」の場合、-Djava.security.krb5.realm=KRBNT-OPERATIONS.EXAMPLE.COM
のように指定します。-Djava.security.krb5.kdc=<your_kdc>
(使用する Kerberos KDC)。たとえば、KDC が「samplekdc.example.com」の場合、-Djava.security.krb5.kdc=samplekdc.example.com
のように指定します。-Djava.security.policy=jaasacn.policy
。使用するポリシーファイルとして jaasacn.policy
を指定します。-Djava.security.auth.login.config=jaas.conf
。使用するログイン構成ファイルとして jaas.conf
を指定します。次に、完全なコマンドを示します。<your_realm>
を Kerberos レルムと、<your_kdc>
を Kerberos KDC と置き換えてください。
java -classpath JaasAcn.jar -Djava.security.manager -Djava.security.krb5.realm=<your_realm> -Djava.security.krb5.kdc=<your_kdc> -Djava.security.policy=jaasacn.policy -Djava.security.auth.login.config=jaas.conf JaasAcn
コマンド全体は、1 行で入力してください。ここでは、読みやすくするために複数行に分けて表示してあります。コマンドが長すぎる場合は、.bat ファイル (Windows) または .sh ファイル (UNIX) に記述します。このファイルを実行することで、コマンドを実行できます。
指定されたポリシーファイルには、必要なアクセス権をコードに付与するエントリが含まれるため、JaasAcn
に対し LoginContext のインスタンス化が許可され、実行が継続されます。Kerberos ユーザー名とパスワードの入力が求められます。ログイン構成ファイルで指定された、基盤となる Kerberos 認証メカニズムにより、Kerberos へのログインが行われます。ログインに成功すると「Authentication succeeded!」というメッセージが、失敗すると「Authentication failed.」というメッセージが表示されます。このあとに、失敗の原因が示されます。
ログイン時のトラブルシューティングについては、「トラブルシューティング」を参照してください。