前のチュートリアル チュートリアルの紹介および目次 次のチュートリアル

「JAAS 認証」

当初、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 要件」を参照してください)。

このチュートリアルは、次のセクションで構成されます。

  1. 認証チュートリアルコード
  2. ログイン構成
  3. コードの実行
  4. セキュリティーマネージャーを使用したコードの実行

チュートリアルのコードを最初に実行してみる場合は、「コードの実行」を先に読んでから、その他のセクションに戻り、コードの記述および構成ファイルの詳細について学習してください。

認証チュートリアルコード

認証チュートリアルコードは、単一のソースファイル JaasAcn.java に含まれています。このファイルの main メソッドは、認証の実行後に、認証が成功したかどうかをレポートします。

ユーザーの認証用コードは、非常に簡潔です。次の 2 つのステップで構成されています。

  1. LoginContext のインスタンス化。
  2. LoginContext の login メソッドの呼び出し。

最初に基本的なコードが、続いて、import 文およびエラー処理を含む JaasAcn.java ソースファイルの完全なコードが表示されます。

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());

引数について、次に説明します。

  1. JAAS ログイン構成ファイルのエントリ名

    これは、LoginContext が、JAAS ログイン構成ファイル内でこのアプリケーションのエントリ検索に使用する名前です。詳細は、ここを参照してください。このようなエントリは、基盤となる適切な認証技術を実装するクラスを指定します。クラスは、javax.security.auth.spi パッケージ内の LoginModule インタフェースを実装する必要があります。

    サンプルコードでは、Kerberos 認証を行う com.sun.security.auth.module パッケージの Krb5LoginModule を使用します。

    このチュートリアルで使用するログイン構成ファイル (jaas.conf) のエントリは、「JaasSample」という名前です。LoginContext コンストラクタの最初の引数には、この名前を指定してください。

  2. CallbackHandler のインスタンス。

    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 を使用します。

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 メソッドを呼び出し (このステップは、このチュートリアルではオプション)、認証されたサブジェクトを取得します。

完全な 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 認証チュートリアルコードを実行するには、次の操作を行う必要があります。

  1. アプリケーションのソースファイル JaasAcn.java およびログイン構成ファイル jaas.conf をディレクトリ内に配置します。
  2. JaasAcn.java をコンパイルします。
    javac JaasAcn.java
    
  3. 次を指定して、JaasAcn アプリケーションを実行します

次に、完全なコマンドを示します。<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 つのステップを省略できます。

  1. アプリケーションのソースファイル JaasAcn.java およびログイン構成ファイル jaas.conf をディレクトリ内に配置します。
  2. JaasAcn.java をコンパイルします。
    javac JaasAcn.java
    
  3. JaasAcn.class を含む JAR ファイルを作成します。
    jar -cvf JaasAcn.jar JaasAcn.class
    

    このコマンドにより、JAR ファイル JaasAcn.jar が作成され、その内部に JaasAcn.class が格納されます。

  4. 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 の実装とポリシーファイルの構文」を参照してください。アクセス権の詳細は、ここを参照してください。

  5. 次を指定して、JaasAcn アプリケーションを実行します
    1. 適切な -classpath 節 (JaasAcn.jar JAR ファイル内のクラスを検索するため)。
    2. -Djava.security.manager。セキュリティーマネージャーのインストールを指定します。
    3. -Djava.security.krb5.realm=<your_realm> (使用する Kerberos レルム)。たとえば、レルムが「KRBNT-OPERATIONS.EXAMPLE.COM」の場合、-Djava.security.krb5.realm=KRBNT-OPERATIONS.EXAMPLE.COM のように指定します。
    4. -Djava.security.krb5.kdc=<your_kdc> (使用する Kerberos KDC)。たとえば、KDC が「samplekdc.example.com」の場合、-Djava.security.krb5.kdc=samplekdc.example.com のように指定します。
    5. -Djava.security.policy=jaasacn.policy。使用するポリシーファイルとして jaasacn.policy を指定します。
    6. -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.」というメッセージが表示されます。このあとに、失敗の原因が示されます。

    ログイン時のトラブルシューティングについては、「トラブルシューティング」を参照してください。


前のチュートリアル チュートリアルの紹介および目次 次のチュートリアル

Copyright © 1993, 2013, Oracle and/or its affiliates. All rights reserved.
連絡先