前の2つのチュートリアル、JAAS認証とJAAS承認では、LoginContextおよびSubjectクラスを使用して次のようなプログラムを作成する方法を紹介しました
このチュートリアルでは、上記の操作を行なったあと、認証されたユーザーとして指定された任意のアプリケーションを実行するLoginユーティリティについて説明します。
このチュートリアルでは、サンプル・アプリケーションでLoginユーティリティを使用する方法を示します。次のチュートリアル、JAAS LoginユーティリティおよびJava GSS-APIを使用したセキュアなメッセージ交換で示す、Java GSS-APIを使用するクライアント/サーバー・アプリケーションも、Loginユーティリティを使用しています。
このチュートリアルを読む前に、JAAS認証および承認に関する、前の2つのチュートリアルを読む必要はありません。ただし、JAAS承認など、特定のトピックの詳細を知るために、これらのチュートリアル内のいくつかの項を参照することは有用です。また、このチュートリアルを含め、一連のチュートリアルのすべてでログイン構成ファイルを使用するため、付録B: JAASログイン構成ファイルでその内容を確認しておくこともお薦めします。
一連のチュートリアルすべてで、認証サポートの基盤となる技術としてKerberosを使用しています。Kerberos要件を参照してください。
チュートリアルのコードを最初に実行してみる場合、「Loginユーティリティを使用したサンプル・プログラムの実行」を先に読んでから、その他のセクションに戻り、学習を続けてください。
Login.java
に含まれるコードについて理解する必要はありません。そのまま使用するだけでかまいません。ただし、プログラム、ポリシー・ファイル、ログイン構成ファイルが正常に動作するように、このコードが実行することについてある程度理解しておく必要があります。次にそのサマリーを示します。それに続くセクションで詳細な情報および例を示します。
Login
クラスは、次の操作を実行します。
com.sun.security.auth.callback
パッケージ内)を指定します。このクラスは、ユーザー名およびパスワードの入力をユーザーに求めます。MyAction
クラスのインスタンス(Login.java
にも含まれる)を作成し、これにアプリケーション引数(存在する場合)を渡します。Subject.doAsPrivileged
を呼び出し、ユーザーを表すサブジェクト、MyAction
インスタンス、null AccessControlContextに渡します。その結果、アプリケーションのpublic static mainメソッドが呼び出され、アプリケーション・コードはユーザーに代わって実行されるものと見なされます。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
アプリケーションのアクションと同じです。次を実行します。
java.home
システム・プロパティの値を読み取り、出力するuser.home
システム・プロパティの値を読み取り、出力するfoo.txt
という名前のファイルが存在するかどうかを確認する。このチュートリアルの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 Javadoc APIドキュメントを参照してください。
Login、MyActionおよびSampleクラスはすべてセキュリティ関連操作を実行するため、操作を実行するには、ポリシー・ファイルsample.policy
内に関連するアクセス権を指定する必要があります。
このチュートリアルでは、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つの操作を実行します。次を実行します
java.home
システム・プロパティの値の読取り。user.home
システム・プロパティの値の読取り。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指示部を使用して、コード内のセキュリティ関連操作に必要なアクセス権を、コードを実行するすべてのユーザーに付与するのではなく、特定のユーザーに制限する方法を示します。
このため、JAAS承認で説明したように、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
を指定します。
Loginユーティリティを使用してSample
アプリケーションを実行するには、次の操作を実行します。
Login.java
ソース・ファイル。Sample.java
ソース・ファイル。sample.conf
ログイン構成ファイル。sample.policy
ポリシー・ファイル。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
には何も追加する必要はありません。
次に、WindowsおよびSolaris、LinuxおよびmacOSで使用するすべてのコマンドを示します。classpath項目の区切りとして、Solaris、LinuxおよびmacOSではコロンを使用するのに対し、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
次に、Solaris、LinuxおよびmacOSの全コマンドを示します。
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ファイル(Solaris、LinuxおよびmacOSの場合)に記述し、そのファイルを実行して、コマンドを実行する必要がある場合があります。
Kerberosユーザー名とパスワードの入力が求められます。ログイン構成ファイルで指定された、基盤となるKerberosログイン・モジュールにより、Kerberosへのログインが行われます。認証が成功すると、Sample
のコードがユーザーに代わって実行されます。ポリシー・ファイルsample.policy
により、ユーザーには必要なアクセス権が付与されるため、java.home
およびuser.home
システム・プロパティの値、およびfoo.txt
という名前のファイルが現在のディレクトリに存在するかどうかに関する文が表示されます。
ログイン時のトラブルシューティングについては、「トラブルシューティング」を参照してください。