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

JAAS認証

当初、Java認証・承認サービス(Java Authentication and Authorization Service: JAAS)は、Java 2 SDK, Standard Edition (J2SDK), v 1.3のオプション・パッケージでした。現在、JAASはJ2SDK 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のインスタンス。

    ログイン・モジュールがユーザーと通信する必要がある場合(たとえばユーザー名やパスワードの入力を求める場合)、それは直接には行われません。これは、ユーザーとの様々な通信方法が存在するためであり、ログイン・モジュールが様々なタイプのユーザーとの通信から独立させておくことが望ましいです。ログイン・モジュールは、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メソッドを呼び出し(このステップは、このチュートリアルではオプション)、認証されたサブジェクトを取得します。

完全な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.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つのステップを省略できます。

  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ファイル(Solaris、LinuxおよびMac OS Xの場合)にそれを入れる必要がある場合があります。このファイルを実行することで、コマンドを実行できます。

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

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


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

Copyright © 1993, 2020, Oracle and/or its affiliates. All rights reserved.