前の 2 つのチュートリアル、「JAAS 認証」と「JAAS 承認」では、LoginContext および Subject クラスを使って次のようなプログラムを作成する方法を紹介しました。
このチュートリアルでは、上記の操作を行なったあと、認証されたユーザーとして指定された任意のアプリケーションを実行する Login ユーティリティーについて説明します。
このチュートリアルでは、サンプルアプリケーションで Login ユーティリティーを使用する方法を示します。次のチュートリアルで示す、Java GSS-API を使用するクライアント/サーバーアプリケーションも、Login ユーティリティーを使用しています。
このチュートリアルを読む前に、JAAS 認証および承認に関する、前の 2 つのチュートリアルを読む必要はありません。ただし、ユーザーベースのポリシーファイル文の作成方法など、特定のトピックの詳細を知るために、これらのチュートリアル内のセクションを参照することは有用です。また、このチュートリアルを含め、一連のチュートリアルのすべてでログイン構成ファイルを使用するため、「JAAS ログイン構成ファイル」でその内容を確認しておくこともお勧めします。
一連のチュートリアルすべてで、認証サポートの基盤となる技術として Kerberos を使用しています。「Kerberos 要件」を参照してください。
チュートリアルのコードを最初に実行してみる場合、「Login ユーティリティーを使用したサンプルプログラムの実行」を先に読んでから、その他のセクションに戻り、学習を続けてください。
Login.java に含まれるコードについて理解する必要はありません。実行できるだけで十分です。ただし、プログラム、ポリシーファイル、ログイン構成ファイルを正しく利用するためには、このコードの機能についてある程度理解しておく必要があります。次にそのサマリーを示します。それに続くセクションで詳細な情報および例を示します。
Login クラスは、次の操作を実行します。
com.sun.security.auth.callback
パッケージ内) を指定します。このクラスは、ユーザー名およびパスワードの入力をユーザーに求めます。Login.java
にも含まれる) を作成し、これにアプリケーション引数 (存在する場合) を渡します。Subject.doAsPrivileged
を呼び出し、ユーザーを表すサブジェクト、MyAction インスタンス、null AccessControlContext に渡します。その結果、アプリケーションの公開の main メソッド (static メソッド) が呼び出されます。この場合、アプリケーションコードは自動的に実行されるものと見なされます。Login ユーティリティーを使ってユーザーを認証し、アプリケーションを実行するには、ログイン構成ファイルおよびポリシーファイルに対し、次のような若干の追加または変更を行う必要があります。
Login ユーティリティーは、アプリケーションコードに特別な変更を加えなくても利用できます。アプリケーションのエントリポイントに必要なのは、通常と同じ、記述するクラスの main
メソッドだけです。
次に、Login を呼び出してユーザーの認証を行い、MyAction のインスタンス化を実行してアプリケーションを呼び出す方法を示します。
java <options> Login <AppName> <app arguments>ここで、<AppName> にはアプリケーションのトップレベルクラスの名前、<app arguments> にはアプリケーションが必要とする引数を指定します。このチュートリアルで使用するすべてのコマンドについては、「Login ユーティリティーを使用したサンプルプログラムの実行」を参照してください。
ユーザーの認証に LoginContext を使用する場合は、ログイン構成ファイルを使用して、使用するログインモジュールを指定する必要があります。ログイン構成ファイルおよびその内容の詳細は、JAAS 認証チュートリアルの「ログイン構成ファイル」セクションを参照してください。
Login ユーティリティーを使用する場合、ログイン構成ファイルのエントリ名が、トップレベルのアプリケーションクラス名と正確に一致する必要があります。具体例は、このチュートリアルの「ログイン構成ファイル」を参照してください。
セキュリティーマネージャーを使用してアプリケーションを実行する場合は、常に特定のコード (特定のユーザーにより実行される特定のコード) に付与するアクセス権を示すポリシーが必要です。ポリシーを指定する 1 つの方法は、ポリシーファイルの grant
文を使用することです。詳細については、「ポリシーファイル」を参照してください。
Login ユーティリティーを使ってアプリケーションを起動する場合は、「Login および MyAction クラスに必要なアクセス権」の説明に従ってさまざまなアクセス権を付与する必要があります。
SampleAction.java
アプリケーションのアクションと同じです。次を実行します。
java.home
システムプロパティーの値を読み取り、出力するuser.home
システムプロパティーの値を読み取り、出力するfoo.txt
という名前のファイルが存在するかどうかを確認する。次に、コードを示します。
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 承認」) チュートリアルのログイン構成ファイルと同様、単一のエントリが含まれます。どちらの場合も、使用するアプリケーション技術が 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.class
ファイルと MyAction.class
ファイルを含む Login.jar
JAR ファイルを作成します。Login.jar
にはさまざまなアクセス権を付与する必要があります。特に、Login.jar
のクラスによって呼び出されるセキュリティー保護の必要なメソッドを呼び出すアクセス権と、アプリケーションが必要とするアクセス権は必須です。必要なアクセス権を付与しない場合、アクセス制御チェックは失敗します。
もっとも簡単な方法である、Login.jar AllPermission
を付与する方法をお勧めします。このチュートリアルでは、Login.jar
ファイルは現在のディレクトリ内にあり、ポリシーファイルには次が含まれるものとします。
grant codebase "file:./Login.jar" { permission java.security.AllPermission; };
(注:このセクションは、基本的に前の (「JAAS 承認」) チュートリアルの「SampleAction に必要なアクセス権」セクションを変更したものです。Sample と SampleAction が実行する操作は同じであるため、必要なアクセス権も同じになります。)
Sample
コードは、アクセス権の必要な 3 つの操作を実行します。次のとおりです。
foo.txt
という名前のファイルが存在するかどうかの確認。これらの操作には、次のアクセス権が必要です。
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 ユーティリティーを使用して Sample アプリケーションを実行するには、次の操作を実行します。
sample.policy
内の「your_user_name@your_realm」を、実際のユーザー名およびレルムで置き換えます。Login.java
と Sample.java
をコンパイルします。
javac Login.java Sample.java
Login.java
には 2 つのクラスが含まれるため、Login.java
をコンパイルすると Login.class
および MyAction.class
が生成されます。
Login.class and MyAction.class
を含む Login.jar
という名前の JAR ファイルを作成します。
jar -cvf Login.jar Login.class MyAction.class
Sample.class
を含む Sample.jar
という名前の JAR ファイルを作成します。
jar -cvf Sample.jar Sample.class
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 には何も追加する必要はありません。
次に、Microsoft Windows および Unix システムの両方で使用可能なすべてのコマンドを示します。classpath 項目の区切りとして、UNIX システムではコロンを使用するのに対し、Windows システムではセミコロンを使用する点だけが異なります。<your_realm>
を Kerberos レルムと、<your_kdc>
を Kerberos KDC と置き換えてください。
次に Windows システムの全コマンドを示します。
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 ファイル (Windows) または .sh ファイル (UNIX) に記述します。このファイルを実行することで、コマンドを実行できます。
Kerberos ユーザー名とパスワードの入力が求められます。ログイン構成ファイルで指定された、基盤となる Kerberos ログインモジュールにより、Kerberos へのログインが行われます。認証が成功すると、Sample
のコードがユーザーに代わって実行されます。ポリシーファイル sample.policy
により、ユーザーには必要なアクセス権が付与されているため、java.home
および user.home
システムプロパティーの値、および foo.txt
という名前のファイルが現在のディレクトリに存在するかどうかを示す文が表示されます。
ログイン時のトラブルシューティングについては、「トラブルシューティング」を参照してください。