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

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



前の 2 つのチュートリアル、「JAAS 認証」「JAAS 承認」では、LoginContext および Subject クラスを使って以下のようなプログラムを作成する方法を紹介しました。

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

このチュートリアルでは、サンプルアプリケーションで Login ユーティリティを使用する方法を示します。次のチュートリアルで示す、Java GSS-API を使用するクライアント/サーバアプリケーションも、Login ユーティリティを使用しています。

このチュートリアルを読む前に、JAAS 認証および承認に関する、前の 2 つのチュートリアルを読む必要はありません。 ただし、ユーザベースのポリシーファイル文の作成方法など、特定のトピックの詳細を知るために、これらのチュートリアル内のセクションを参照することは有用です。また、このチュートリアルを含め、一連のチュートリアルのすべてでログイン構成ファイルを使用するため、「JAAS ログイン構成ファイル」でその内容を確認しておくこともお勧めします。

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

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

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

Login.java に含まれるコードについて理解する必要はありません。実行できるだけで十分です。 ただし、プログラム、ポリシーファイル、ログイン構成ファイルを正しく利用するためには、このコードの機能についてある程度理解しておく必要があります。以下にその概略を示します。それに続くセクションで詳細な情報および例を示します。

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

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

Login ユーティリティを使ってユーザを認証し、アプリケーションを実行するには、ログイン構成ファイルおよびポリシーファイルに対し、以下のような若干の追加または変更を行う必要があります。

アプリケーション要件

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

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

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

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

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

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

ポリシーファイル要件

セキュリティマネージャを使用してアプリケーションを実行する場合は、常に特定のコード (特定のユーザにより実行される特定のコード) に付与するアクセス権を示すポリシーが必要です。ポリシーを指定する 1 つの方法は、ポリシーファイルの grant 文を使用することです。 詳細については、「ポリシーファイル」を参照してください。

Login ユーティリティを使ってアプリケーションを起動する場合は、「Login および MyAction クラスに必要なアクセス権」の説明に従ってさまざまなアクセス権を付与する必要があります。

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

このチュートリアルで使用する Sample.java アプリケーションの動作は、前の (「JAAS 承認」) チュートリアルの SampleAction.java アプリケーションの動作と同じです。以下の操作を実行します。

以下に、コードを示します。

import java.io.File;

public class Sample {

  public static void main (String[] args) throws SecurityException {

    // If there were any arguments to read, we'd do it here.

    System.out.println("¥nYour java.home property value is: "
                +System.getProperty("java.home"));

    System.out.println("¥nYour user.home property value is: "
                +System.getProperty("user.home"));

    File f = new File("foo.txt");
    System.out.print("¥nfoo.txt does ");
    if (!f.exists())
        System.out.print("not ");
    System.out.println("exist in the current working directory.");
  }
}

ログイン構成ファイル

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

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

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

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

Krb5LoginModule に引き渡し可能なすべてのオプションの詳細は、Krb5LoginModule ドキュメントを参照してください。

ポリシーファイル

Login、MyAction、および Sample クラスはすべてセキュリティ関連操作を実行するため、操作を実行するには、ポリシーファイル内に関連するアクセス権を指定する必要があります。

Login および MyAction クラスに必要なアクセス権

このチュートリアルでは、Login.class ファイルと MyAction.class ファイルを含む Login.jar JAR ファイルを作成します。 Login.jar にはさまざまなアクセス権を付与する必要があります。特に、Login.jar クラスによって呼び出されるセキュリティ保護の必要なメソッドを呼び出すアクセス権と、アプリケーションが必要とするアクセス権は必須です。必要なアクセス権を付与しない場合、アクセス制御チェックは失敗します。

最も簡単な方法である、Login.jar AllPermission を付与する方法をお勧めします。このチュートリアルでは、Login.jar ファイルは現在のディレクトリ内にあり、ポリシーファイルには以下が含まれるものとします。

grant codebase "file:./Login.jar" {
   permission java.security.AllPermission;
};

Sample に必要なアクセス権

(注: このセクションは、基本的に前の (「JAAS 承認」) チュートリアルの「SampleAction に必要なアクセス権」セクションを変更したものです。Sample と SampleAction が実行する操作は同じであるため、必要なアクセス権も同じになります。

Sample コードは、アクセス権の必要な次の 3 つの操作を実行します。It

これらの操作には、次のアクセス権が必要です。

permission java.util.PropertyPermission "java.home", "read";
permission java.util.PropertyPermission "user.home", "read";
permission java.io.FilePermission "foo.txt", "read";

これらのアクセス権を Sample.class 内のコードに付与する必要があります。このファイルは、Sample.jar という名前の JAR ファイル内に配置されます。ただし、grant 文は、アクセス権を「コード」だけではなく、コードを実行する認証済みの特定ユーザにも付与します。これは、grant 文の Principal 指示部を使用して、コード内のセキュリティ関連操作に必要なアクセス権を、コードを実行するすべてのユーザに付与するのではなく、特定のユーザに制限する方法を示します。

このため、「プリンシパルベースのポリシーファイル文の作成方法」で説明したように、grant 文は次のようになります。

grant codebase "file:./Sample.jar",
    Principal javax.security.auth.kerberos.KerberosPrincipal 
        "your_user_name@your_realm"  {

   permission java.util.PropertyPermission "java.home", "read";
   permission java.util.PropertyPermission "user.home", "read";
   permission java.io.FilePermission "foo.txt", "read";
};
重要:"your_user_name@your_realm" には、使用する Kerberos ユーザ名、「@」、および領域を指定する必要があります。たとえば、ユーザ名が「mjones」、領域が「KRBNT-OPERATIONS.ABC.COM」の場合、"mjones@KRBNT-OPERATIONS.ABC.COM" (引用符も付ける) を指定します

完全なポリシーファイル

完全なポリシーファイルは、sample.policy です。

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

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

  1. 次のファイルを 1 つのディレクトリ内に格納します。

  2. sample.policy 内の "your_user_name@your_realm" を、実際のユーザ名および領域で置き換えます。

  3. Login.java および Sample.java をコンパイルします。
    javac Login.java Sample.java
    

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

  4. Login.class および MyAction.class を含む Login.jar という名前の JAR ファイルを作成します。
    jar -cvf Login.jar Login.class MyAction.class
    
  5. Sample.class を含む Sample.jar という名前の JAR ファイルを作成します。
    jar -cvf Sample.jar Sample.class
    
  6. 以下を指定して、Login クラスを実行します。

    • 適切な -classpath 節 (Login.jar および Sample.jar JAR ファイル内でクラスを検索するため)

    • セキュリティマネージャのインストールを指定する -Djava.security.manager

    • -Djava.security.krb5.realm=<your_realm> (使用する Kerberos 領域)

    • -Djava.security.krb5.kdc=<your_kdc> (使用する Kerberos KDC)

    • -Djava.security.policy=sample.policy (ポリシーファイル sample.policy を使用)

    • -Djava.security.auth.login.config=sample.conf (ログイン構成ファイル sample.conf を使用)

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

    以下に、Win32 および Unix システムの両方で使用可能なすべてのコマンドを示します。classpath 項目の区切りとして、UNIX システムでは コロンを使用するのに対し、Win32 システムではセミコロンを使用する点だけが異なります。<your_realm> を使用する Kerberos 領域と、<your_kdc> を使用する Kerberos KDC と置き換えてください。

    以下に Win32 システムの全コマンドを示します。

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

    以下に UNIX システムの全コマンドを示します。

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

    コマンド全体を 1 行で入力してください。ここでは、読みやすくするために複数行に分けて表示してあります。コマンドが長すぎる場合は、.bat ファイル (Win32) または .sh ファイル (UNIX) に記述します。このファイルを実行することで、コマンドを実行できます。

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

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



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