前のチュートリアル チュートリアルの紹介および目次 次のチュートリアル フィードバック

「JAAS 認証」



当初、JavaTM 認証・承認サービス (JavaTM Authentication and Authorization Service、JAAS) は、JavaTM 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 アプリケーションを実行します.

    • -Djava.security.krb5.realm=<your_realm> (使用する Kerberos 領域)たとえば、領域が "KRBNT-OPERATIONS.ABC.COM" の場合、-Djava.security.krb5.realm=KRBNT-OPERATIONS.ABC.COM のように指定します。

    • -Djava.security.krb5.kdc=<your_kdc> (使用する Kerberos KDC)たとえば、KDC が "samplekdc.abc.com" の場合、-Djava.security.krb5.kdc=samplekdc.abc.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 つのステップを省略できます。

  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.ABC.COM" の場合、-Djava.security.krb5.realm=KRBNT-OPERATIONS.ABC.COM のように指定します。

    4. -Djava.security.krb5.kdc=<your_kdc> (使用する Kerberos KDC)たとえば、KDC が "samplekdc.abc.com" の場合、-Djava.security.krb5.kdc=samplekdc.abc.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 ファイル (Win32) または .sh ファイル (UNIX) に記述します。このファイルを実行することで、コマンドを実行できます。

    指定されたポリシーファイルには、必要なアクセス権をコードに付与するエントリが含まれるため、JaasAcn に対し LoginContext のインスタンス化が許可され、実行が継続されます。Kerberos ユーザ名とパスワードの入力が求められます。ログイン構成ファイルで指定された、基盤となる Kerberos 認証機構により、Kerberos へのログインが行われます。ログインに成功すると「Authentication succeeded!」というメッセージが、失敗すると「Authentication failed.」というメッセージが表示されます。この後に、失敗の原因が示されます。

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



前のチュートリアル チュートリアルの紹介および目次 次のチュートリアル フィードバック