JAAS認証
JAASは、次の2つの目的で使用できます。
- ユーザーを認証する際、Javaコードがアプリケーション、アプレット、Bean、またはサーブレットであるかに関係なく、Javaコードを現在実行しているユーザーを確実かつセキュアに判定する。
- ユーザーを承認する際、アクションの実行に必要なアクセス制御権(アクセス権)をユーザーが保持していることを確認する。
このセクションでは、認証コンポーネントの基本的なチュートリアルを提供します。承認コンポーネントについては、「JAAS承認」チュートリアルで説明します。
JAAS認証は、プラガブルな方式で実行されます。つまり、Javaアプリケーションは、基盤となる認証技術から独立して機能します。新規または更新された技術を、アプリケーション自体を変更せずに、プラグインとして使用可能です。使用する特定の認証技術の実装は実行時に決定されます。その内容は、ログイン構成ファイルに指定します。このチュートリアルでは、認証テクノロジとしてKerberosを使用します。(「Kerberos要件」を参照。)
このチュートリアルは、次のセクションで構成されます。
チュートリアルのコードを最初に実行してみる場合は、「コードの実行」を先に読んでから、その他のセクションに戻り、コードの記述および構成ファイルの詳細について学習してください。
認証チュートリアル・コード
認証チュートリアル・コードは、単一のソース・ファイルJaasAcn.java
に含まれています。このファイルのmain
メソッドは、認証の実行後に、認証が成功したかどうかをレポートします。
ユーザーの認証用コードは、非常に簡潔です。次の2つのステップで構成されています。
LoginContextのインスタンス化
ユーザーの認証には、まず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());
引数について、次に説明します。
- JAASログイン構成ファイルのエントリ名
これは、LoginContextが、ログイン構成に説明されているJAASログイン構成ファイル内でこのアプリケーションのエントリ検索に使用する名前です。このようなエントリは、基盤となる適切な認証テクノロジを実装するクラスを指定します。クラスは、
javax.security.auth.spi
パッケージ内のLoginModuleインタフェースを実装する必要があります。サンプル・コードでは、Kerberos認証を行う
com.sun.security.auth.module
パッケージのKrb5LoginModule
を使用します。このチュートリアルで使用するログイン構成ファイル(
jaas.conf
を参照)のエントリは、「JaasSample」という名前です。LoginContextコンストラクタの最初の引数には、この名前を指定してください。 - CallbackHandlerのインスタンス。
LoginModuleがユーザーと通信する必要がある場合(たとえばユーザー名やパスワードの入力を求める場合)、それは直接には行われません。これは、ユーザーとの様々な通信方法が存在するためであり、LoginModulesが様々なタイプのユーザーとの通信から独立させておくことが望ましいです。LoginModuleは、CallbackHandlerを呼び出してユーザーとの通信を実行し、要求された情報(ユーザー名、パスワードなど)を取得します。(CallbackHandlerは、
javax.security.auth.callback
パッケージ内のインタフェースです。)使用する特定のCallbackHandlerのインスタンスを、LoginContextコンストラクタの2番目の引数として指定します。LoginContextは、このインスタンスを基盤となるLoginModule (ここではKrb5LoginModule)に転送します。通常、アプリケーションは、固有のCallbackHandler実装を提供します。単純なCallbackHandlerであるTextCallbackHandlerは、
com.sun.security.auth.callback
パッケージに提供されており、コマンド行に情報を出力し、入力を読み取ります。
LoginContextの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
メソッドを呼び出し(このステップは、このチュートリアルではオプション)、認証されたサブジェクトを取得します。
ログイン構成
JAAS認証はプラガブルな形式で実行されるため、アプリケーションは、基盤となる認証技術から独立した状態を維持できます。システム管理者は、各アプリケーションで使用する認証技術(LoginModules)を決定し、ログイン構成内に構成します。構成情報のソース(ファイルやデータベース)は、現在のjavax.security.auth.login.Configuration実装によって異なります。OracleのデフォルトのConfiguration
実装は、com.sun.security.auth.login.ConfigFileで説明するように、構成ファイルから構成情報を読み取ります。
ログイン構成ファイルとその内容、および使用するログイン構成ファイルの指定方法の詳細は、付録B: JAASログイン構成ファイルを参照してください。
このチュートリアルのログイン構成ファイル
すでに説明したように、このチュートリアルで使用するログイン構成ファイルjass.confには、次のエントリのみが含まれます
JaasSample {
com.sun.security.auth.module.Krb5LoginModule required;
};
このエントリはJaasSample
という名前で、チュートリアル・アプリケーションJaasAcn
,がこのエントリを参照するときに使用する名前です。このエントリは、ユーザー認証を実行するために使用するLoginModuleがcom.sun.security.auth.module
パッケージ内のKrb5LoginModuleであること、および認証が成功したと見なされるためにはこのKrb5LoginModuleが「成功する」必要があることを示します。Krb5LoginModuleが成功するのは、ユーザーが入力した名前およびパスワードを使用して、Kerberos KDCへのログインに成功した場合だけです。
Krb5LoginModuleに渡すことができるすべてのオプションの詳細は、Krb5LoginModule Javadoc APIドキュメントを参照してください。
コードの実行
JAAS認証チュートリアル・コードを実行するには、次の操作を行う必要があります。
- アプリケーションのソース・ファイル
JaasAcn.java
およびログイン構成ファイルjaas.conf
をディレクトリ内に配置します。 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
ログイン時のトラブルシューティングについては、「トラブルシューティング」を参照してください。
問題を修正したら、プログラムを再度実行します。
セキュリティ・マネージャを使用したコードの実行
警告:
セキュリティ・マネージャおよびそれに関連するAPIは非推奨であり、今後のリリースでは削除されます。セキュリティ・マネージャの代わりとなるものはありません。詳細および代替手段については、JEP 411を参照してください。セキュリティ・マネージャがインストールされた環境でJavaプログラムを実行する場合、有効なセキュリティ・ポリシーによりアクセス権が明示的に付与されているのでないかぎり、リソースへのアクセスやセキュリティ関連操作の実行は許可されません(有効なセキュリティ・ポリシーによりこれを実行するには、JDKでのアクセス権を参照)。アクセス権をポリシー・ファイル内のエントリによって付与する必要があります(デフォルトのPolicyの実装とポリシー・ファイルの構文を参照)。
大半のブラウザはセキュリティ・マネージャをインストールするため、一般にアプレットは、セキュリティ・マネージャの監視下で実行されます。一方、アプリケーションでは、アプリケーションの実行時にセキュリティ・マネージャは自動的にインストールされないため、そのようなことはありません。このため、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
およびログイン構成ファイルjaas.conf
をディレクトリ内に配置します。 JaasAcn.java
を次のようにコンパイルします。javac JaasAcn.java
JaasAcn.class
を含むJARファイルを作成します。jar -cvf JaasAcn.jar JaasAcn.class
このコマンドにより、JARファイル
JaasAcn.jar
が作成され、その内部にJaasAcn.class
が格納されます。- JARファイル内のコードに必要なアクセス権を付与するポリシー・ファイルを作成します。
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の実装とポリシー・ファイルの構文」を参照してください。アクセス権は、JDKでのアクセス権で説明されています。
- 次を指定して、
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
を指定します。
ノート:
java.security.auth.login.config
システム・プロパティで、(等号を2つ(==
)ではなく)等号を1つ(=
)使用している場合、このシステム・プロパティおよびjava.security
ファイルの両方で指定された構成が使用されます。コマンドは次のとおりです:
ノート:
<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ファイル(LinuxおよびmacOSの場合)に記述し、そのファイルを実行して、コマンドを実行する必要がある場合があります。
指定されたポリシー・ファイルには、必要なアクセス権をコードに付与するエントリが含まれるため、
JaasAcn
に対してLoginContextのインスタンス化が許可され、実行が継続されます。Kerberosユーザー名とパスワードの入力が求められます。ログイン構成ファイルで指定された、基盤となるKerberos認証メカニズムにより、Kerberosへのログインが行われます。ログインが成功すると「Authentication succeeded!」というメッセージが表示され、失敗すると「Authentication failed:」の後に失敗の理由が続くメッセージが表示されます。ログイン時のトラブルシューティングについては、「トラブルシューティング」を参照してください。
- 適切な