JAAS Loginユーティリティの使用

JAAS認証チュートリアルでは、LoginContextクラスおよびSubjectクラスを使用して、ユーザーを認証してアイデンティティを確認するプログラムを作成する方法を示します。

このチュートリアルでは、これらの操作を行った後、認証されたユーザーとして指定された任意のアプリケーションを実行するLoginユーティリティについて説明します。

このチュートリアルでは、サンプル・アプリケーションでLoginユーティリティを使用する方法を示します。次のチュートリアル、JAAS LoginユーティリティおよびJava GSS-APIを使用したセキュアなメッセージ交換で示す、Java GSS-APIを使用するクライアント/サーバー・アプリケーションも、Loginユーティリティを使用しています。

このチュートリアルを読む前に、JAAS認証に関する前のチュートリアルを読む必要はありません。ただし、ログイン構成ファイルは、このチュートリアルおよびこのシリーズ内の他のすべてのチュートリアルで必要であるため、「付録B: JAASログイン構成ファイル」でログイン構成ファイルについて確認してください。

一連のチュートリアルすべてで、認証サポートの基盤となる技術としてKerberosを使用しています。「Kerberos要件」を参照してください。

チュートリアルのコードを最初に実行してみる場合、「Loginユーティリティを使用したサンプル・プログラムの実行」を先に読んでから、その他のセクションに戻り、学習を続けてください。

Loginユーティリティに関する重要な情報

Login.javaに含まれるコードについて理解する必要はありません。そのまま使用するだけでかまいません。ただし、プログラムおよびログイン構成ファイルが正常に動作するように、このコードが実行することについてある程度理解する必要があります。次にその内容をまとめ、後続の項で詳細と例を示します。

Loginクラスは、次の操作を実行します。

  • 引数として、アプリケーションのトップ・レベルのクラス名とアプリケーションに必要なその他の引数が渡されるものとします。
  • トップ・レベルのアプリケーション・クラスのクラス名が、ログイン構成ファイルでの検索対象のエントリ名にも使用されるものとします。
  • ユーザーとの通信に使用するクラスとして、TextCallbackHandlerクラス(com.sun.security.auth.callbackパッケージ内)を指定します。このクラスは、ユーザー名およびパスワードの入力をユーザーに求めます。
  • LoginContextを使用してユーザーを認証します。LoginContextは適切な認証テクノロジまたはLoginModuleを呼び出し、認証を実行します。LoginModulesは、必要に応じてCallbackHandler (この例ではTextCallbackHandler)を使用し、ユーザーと通信します。
  • 次の3とおりのログイン方法を、ユーザーに許可します。
  • MyActionクラスのインスタンス(Login.javaにも含まれる)を作成し、これにアプリケーション引数(存在する場合)を渡します。
  • Subject.callAsを呼び出し、ユーザーおよびMyActionインスタンスを表すSubjectを渡します。その結果、アプリケーションのpublic static mainメソッドが呼び出され、アプリケーション・コードはユーザーに代わって実行されるものと見なされます。

アプリケーションおよびほかのファイル要件

Loginユーティリティを使用してユーザーを認証し、アプリケーションを実行するには、「ログイン構成ファイルの要件」の説明に従って、ログイン構成ファイルに少数の追加または変更を加える必要があります。

アプリケーション要件

Loginユーティリティは、アプリケーション・コードに特別な変更を加えなくても利用できます。アプリケーションのエントリ・ポイントに必要なのは、通常と同じ、記述するクラスのmainメソッドだけです。

次に、Loginを呼び出してユーザーの認証を行い、MyActionのインスタンス化を実行してアプリケーションを呼び出す方法を示します。

java <options> Login <AppName> <app arguments> 

ここで、<AppName>にはアプリケーションのトップレベル・クラスの名前、<app arguments>にはアプリケーションが必要とする引数を指定します。このチュートリアルで使用するすべてのコマンドについては、「Loginユーティリティを使用したサンプル・プログラムの実行」を参照してください。

ログイン構成ファイル要件

ユーザーの認証にLoginContextを使用する場合は、ログイン構成ファイルを使用して、使用するログイン・モジュールを指定する必要があります。ログイン構成ファイルおよびその内容の詳細は、JAAS認証チュートリアルのログイン構成の項を参照してください。

Loginユーティリティを使用する場合、ログイン構成ファイルのエントリ名が、トップ・レベルのアプリケーション・クラス名と正確に一致する必要があります。具体例は、このチュートリアルの「ログイン構成ファイル」を参照してください。

サンプル・アプリケーション・プログラム

Sample.javaアプリケーションは、次のことを行います:

  • java.homeシステム・プロパティの値を読み取り、出力する
  • user.homeシステム・プロパティの値を読み取り、出力する
  • 現行のディレクトリにfoo.txtという名前のファイルが存在するかどうかを確認する。

ログイン構成ファイル

このチュートリアルのsample.confログイン構成ファイルには、「JAAS認証」チュートリアルのログイン構成ファイルと同様、単一のエントリが含まれます。どちらの場合も、使用するアプリケーション技術がcom.sun.security.auth.moduleパッケージのKrb5LoginModuleであるため、エントリの内容は同じになります。

唯一の違いは、エントリに使用する名前です。前のチュートリアルでは、「JaasSample」という名前を使用しました。これは、JaasAcnクラスがエントリの検索にこの名前を使用するためです。アプリケーションでLoginユーティリティを使用する場合、Loginユーティリティはログイン構成ファイルのエントリ名がトップ・レベルのアプリケーション・クラスの名前と同じであると見なします。このチュートリアルで使用するアプリケーション・クラスの名前は「Sample」であるため、ログイン構成ファイルのエントリもこの名前にする必要があります。このため、ログイン構成ファイルは次のようになります。

Sample {
   com.sun.security.auth.module.Krb5LoginModule required;
};

「required」は、認証が成功したと見なされるためには、Krb5LoginModuleを使用するログインが「成功」する必要があることを示します。Krb5LoginModuleが成功するのは、ユーザーが入力した名前およびパスワードを使用して、Kerberos KDCへのログインに成功した場合だけです。

Krb5LoginModuleに渡すことができるすべてのオプションの詳細は、Krb5LoginModule Javadoc APIドキュメントを参照してください。

Loginユーティリティを使用したサンプル・プログラムの実行

Loginユーティリティを使用してSampleアプリケーションを実行するには、次の操作を実行します。

  1. 次のファイルを1つのディレクトリ内に格納します。
  2. Login.javaSample.javaをコンパイルします。
    javac Login.java Sample.java

    Login.javaには2つのクラスが含まれるため、Login.javaをコンパイルするとLogin.classおよびMyAction.classが生成されます。

  3. Login.class and MyAction.classを含むLogin.jarという名前のJARファイルを作成します。
    jar -cvf Login.jar Login.class MyAction.class
  4. Sample.classを含むSample.jarという名前のJARファイルを作成します。
    jar -cvf Sample.jar Sample.class
  5. 次を指定して、Loginクラスを実行します。
    • 適切な-classpath節(Login.jarおよびSample.jar JARファイル内のクラスを検索するため)。
    • -Djava.security.krb5.realm=<your_realm> (使用するKerberosレルム)。
    • -Djava.security.krb5.kdc=<your_kdc> (使用するKerberos KDC)。
    • -Djava.security.auth.login.config=sample.conf。使用するログイン構成ファイルとしてsample.confを指定します。

    ノート:

    java.security.auth.login.configシステム・プロパティで、(等号を2つ(==)ではなく)等号を1つ(=)使用している場合、このシステム・プロパティおよびjava.securityファイルの両方で指定された構成が使用されます。

    Loginの引数として、アプリケーションの名前(ここではSample)を渡します。次に、アプリケーションに必要な任意の引数を追加します。ただし、ここではSampleには何も追加する必要はありません。

    次に、Windows、LinuxおよびmacOSで使用する完全なコマンドを示します。classpath項目の区切りとして、LinuxおよびmacOSではコロンを使用するのに対し、Windowsではセミコロンを使用する点のみが異なります。<your_realm>をKerberosレルムと、<your_kdc>をKerberos KDCと置き換えてください。

    次にWindowsの全コマンドを示します。

    java -classpath Login.jar;Sample.jar
     -Djava.security.krb5.realm=<your_realm> 
     -Djava.security.krb5.kdc=<your_kdc>
     -Djava.security.auth.login.config=sample.conf Login Sample

    次に、LinuxおよびmacOSの全コマンドを示します。

    java -classpath Login.jar:Sample.jar
     -Djava.security.krb5.realm=<your_realm>
     -Djava.security.krb5.kdc=<your_kdc>
     -Djava.security.auth.login.config=sample.conf Login Sample

    コマンド全体を1行で入力してください。ここでは、読みやすくするために複数行に分けて表示してあります。システムに対しコマンドが長すぎる場合は、.batファイル(Windowsの場合)または.shファイル(LinuxおよびmacOSの場合)に記述し、そのファイルを実行して、コマンドを実行する必要がある場合があります。

    Kerberosユーザー名とパスワードの入力が求められます。ログイン構成ファイルで指定された、基盤となるKerberosログイン・モジュールにより、Kerberosへのログインが行われます。認証が成功すると、Sampleのコードがユーザーに代わって実行されます。java.homeおよびuser.homeシステム・プロパティの値、およびfoo.txtという名前のファイルが現在のディレクトリに存在するかどうかに関する文が表示されます。

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