3 JavaクライアントでのJAAS認証の使用
これらの節で参照するサンプル・コードは、WebLogic Server配布キットの次の場所から入手できます。
EXAMPLES_HOME\src\examples\security\jaas
EXAMPLES_HOME
ディレクトリは、ORACLE_HOME
\wlserver\samples\server
にあります。
jaas
ディレクトリには、instructions.html
ファイル、ant
ビルド・ファイル、sample_jaas.config
ファイル、および以下のJavaファイルが含まれています。
-
BaseClient.java
-
BaseClientConstants.java
-
SampleAction.java
-
SampleCallbackHandler.java
-
SampleClient.java
-
TradeResult.java
-
TraderBean.java
以降の説明は、実際のサンプルを見ながら読み進めてください。
JAASとWebLogic Server
Java Authentication and Authorization Service (JAAS)は、Java EE Development Kitのセキュリティに対する標準拡張です。JAASでは、ユーザーのIDに基づいてアクセス制御を実行できます。WebLogic Serverでは、JAASがJNDI認証メカニズムのかわりとして提供されています。JAAS認証を使用する場合は、いくつか考慮事項があります。
WebLogic Serverクライアントは、標準のJAASの認証部分だけを利用します。JAAS LoginContextは、構成されているすべての認証プロバイダのLoginModuleインスタンスを順番どおりに実行し、構成されている各プロバイダの完了ステータスの管理を行います。
Javaクライアントに対してJAAS認証を使用する場合は、次のことに注意してください。
-
WebLogic Serverクライアントは認証にJNDIログインまたはJAASログインのいずれも使用できますが、JAASログインのほうが望ましい方法です。
-
JAASは認証方式として望ましい選択肢ですが、WebLogic提供のLoginModule (
weblogic.security.auth.login.UsernamePasswordLoginModule
)はユーザー名とパスワードの認証しかサポートしていません。したがって、クライアントの証明書認証(双方向SSL認証ともいう)ではJNDIを使用します。クライアントの証明書認証にJAASを使用するには、証明書の認証を行うカスタムLoginModuleを記述する必要があります。ノート:
WebLogic Serverクライアントで使用するLoginModuleを自分で作成する場合は、weblogic.security.auth.Authenticate.authenticate()を呼び出してログインを実行するように記述します。
-
リモートのJavaクライアントからJAASログインを実行する(つまり、JavaクライアントがWebLogic Serverクライアントではない)場合には、WebLogic提供のLoginModuleをログインの実行に使用できます。ただし、WebLogic提供のLoginModuleを使用せずに自分で作成することを選択した場合は、
weblogic.security.auth.Authenticate.authenticate()
メソッドを呼び出してログインを実行するように記述する必要があります。 -
Security Assertion Markup Language (SAML)などリモートまたは境界のログイン・システムを使用する場合は、
weblogic.security.auth.Authenticate.authenticate()
を呼び出す必要はありません。WebLogic Serverを使用してログインを実行する場合は、authenticate()
メソッドを呼び出すだけで済みます。ノート:
WebLogic Serverは、JAAS認証に対して完全なコンテナ・サポートを提供し、アプリケーション・コードにおけるJAASの認証と認可の完全な使用をサポートしています。
-
WebLogic Serverでは、ログインの実行にJAASが呼び出されます。LoginModuleは各認証プロバイダに含まれています。これは、JNDIまたはJAASを介してのJavaクライアントのログインだけでなく、サーブレットのログインについても当てはまります。WebLogic ServerがJAASログオンを実行するために内部で呼び出すメソッドは、
weblogic.security.auth.Authentication.authenticate()
です。認証クラスを使用する場合、ヘルパー・クラスとしてはweblogic.security.SimpleCallbackHandler
が有用であると考えられます。 -
WebLogic ServerはJAAS認可を使用してリソースを保護することはしませんが(WebLogicセキュリティを使用)、アプリケーション・コードでJAAS認可を使用してアプリケーションの独自のリソースを保護することはできます。
JAASの詳細は、JAASドキュメント(http://www.oracle.com/technetwork/java/javase/jaas/index.html
)を参照してください。
JAAS認証の開発環境
WebLogic Serverでは、サーバーに確実に安全に認証するためにJAASクラスが使用されます。JAASは、プラガブル認証モジュール(PAM)フレームワークのJavaバージョンを実装します。このフレームワークにより、アプリケーションは基底の認証技術から独立することができます。このため、PAMフレームワークを利用することで、Javaアプリケーションに修正を加えることなく新しいまたは最新版の認証技術を使用することができます。
WebLogic Serverは、リモートのJavaクライアントの認証および内部の認証でJAASを使用します。したがって、JAASに直に関与する必要があるのは、カスタム認証プロバイダの開発者とJavaクライアント・アプリケーションの開発者だけです。Webブラウザ・クライアントのユーザーまたはコンテナ内のJavaクライアント・アプリケーション(サーブレットからEJBを呼び出すものなど)の開発者は、JAASを直接使用したり、その知識を身につけたりする必要はありません。
ノート:
WebLogicクライアントでセキュリティを実装するためには、JavaクライアントでWebLogic Serverソフトウェア配布キットをインストールする必要があります。
この節では、以下の内容について説明します。
JAAS認証API
WebLogic ServerでJAAS認証を使用するJavaクライアントを実装するには、Java EE アプリケーション・プログラミング・インタフェース(API)とWebLogic APIを組み合せて使用します。
表3-1では、JAAS認証の実装に使用されるJava APIパッケージについて説明します。表3-1の情報はJava APIのドキュメントから取られており、WebLogic Server固有の情報がコメントで追加されています。Java APIの詳細は、http://docs.oracle.com/javase/8/docs/api/index.html
およびhttps://javaee.github.io/javaee-spec/javadocs/index.html?overview-summary.htmlのJavadocを参照してください。
表3-1では、JAAS認証の実装に使用されるWebLogic APIについて説明します。Oracle WebLogic Server Java APIリファレンスを参照してください。
表3-1 Java JAAS API
Java JAAS API | 説明 |
---|---|
|
|
呼出し側は、
このクラスのサンプル実装は、JAAS認証を使用するクライアント・アプリケーションの作成を参照してください。 |
|
これは、アプリケーションにおけるLoginModuleの構成を表す抽象クラスです。 WebLogic Serverでは、このクラスのかわりにログイン構成ファイルを使用します。サンプル構成ファイルは、JAAS認証を使用するクライアント・アプリケーションの作成を参照してください。デフォルトでは、WebLogic Serverは構成ファイルから読取りを行う構成クラスを使用します。 |
|
アプリケーション開発者は ノート: WebLogic Serverは、LoginModuleの実装(
|
|
このインタフェースの実装は
|
|
アプリケーションは、
基底のセキュリティ・サービスは、個々の |
表3-2 WebLogic JAAS API
WebLogic JAAS API | 説明 |
---|---|
ユーザー資格証明の認証に使用される認証クラス。 LoginModuleのWebLogic実装(
|
|
基底のセキュリティ・サービスでは、このクラスを使用して このコールバックによって、ContextHandlerがLoginModule.login()メソッドに渡されます。 |
|
基底のセキュリティ・サービスでは、このクラスを使用して |
|
基底のセキュリティ・サービスでは、このクラスを使用して
ノート: アプリケーション開発者は、URL情報の取得にこのクラスを使用しないでください。かわりに、weblogic.security.URLCallbackHandlerを使用します。 |
|
このクラスはWebLogic Serverクライアントの サンプル実装は、JAAS認証を使用するクライアント・アプリケーションの作成を参照してください。 |
|
アプリケーション開発者が |
JAASクライアント・アプリケーション・コンポーネント
JAAS認証クライアント・アプリケーションには、少なくとも以下のコンポーネントが含まれます。
-
Javaクライアント
Javaクライアントは
LoginContext
オブジェクトをインスタンス化し、オブジェクトのlogin()
メソッドを呼び出すことでログインを呼び出します。login()
メソッドはLoginModule内のメソッドを呼び出して、ログインおよび認証を実行します。LoginContextはまた、新しい空の
javax.security.auth.Subject
オブジェクト(認証されているユーザーまたはサービスを表す)をインスタンス化し、構成されたLoginModuleを作成し、それをこの新しいSubject
およびCallbackHandler
で初期化します。LoginContextは、その後LoginContextの
getSubject
メソッドを呼び出すことで、認証されたサブジェクトを取得します。LoginContextはweblogic.security.Security.runAs()
メソッドを使って、ユーザーIDにかわって実行されるPrivilegedAction
またはPrivilegedExceptionAction
とSubject
のIDを関連付けます。 -
LoginModule
LoginModuleは
CallbackHandler
を使用して、ユーザー名およびパスワードを取得し、そのユーザー名とパスワードが要求どおりのものであるかどうかを判別します。認証に成功すると、LoginModuleは、ユーザーを表すプリンシパルをサブジェクトに格納します。LoginModuleがサブジェクトに格納するプリンシパルは
Principal
のインスタンスであり、java.security.Principal
インタフェースを実装するクラスです。LoginModuleファイルは、ユーザー名およびパスワードの認証や証明書の認証など、様々なタイプの認証を実行するように記述できます。クライアント・アプリケーションに含めるLoginModuleは、1つ(最低要件)でも複数でもかまいません。
ノート:
WebLogic ServerアプリケーションでJAAS javax.security.auth.Subject.doAsメソッドを使用する場合、サブジェクトとクライアント・アクションは関連付けられません。doAsメソッドを使用してWebLogic ServerアプリケーションにJava EEセキュリティを実装することは可能ですが、この場合でもSecurity.runAs()メソッドを使用する必要があります。
-
Callbackhandler
CallbackHandler
は、javax.security.auth.callback.CallbackHandler
インタフェースを実装します。LoginModuleは、CallbackHandler
を使って、ユーザーと対話し、ユーザー名やパスワードなどのリクエストされた情報を取得します。 -
構成ファイル
このファイルでは、アプリケーションで使用するLoginModuleを構成します。LoginModuleの場所と、複数のLoginModuleがある場合は、実行する順番を指定します。このファイルを使うと、JavaアプリケーションはLoginModuleを使って定義および実装される認証テクノロジから独立を保つことができます。
-
アクション・ファイル
このファイルでは、クライアント・アプリケーションが実行する処理を定義します。
-
ant
構築スクリプト(build.xml
)このスクリプトは、アプリケーションに必要なすべてのファイルをコンパイルし、それらをWebLogic Serverのアプリケーション・ディレクトリにデプロイします。
ここで説明しているコンポーネントを実装する完全な実践的JAAS認証クライアントの詳細は、EXAMPLES_HOME
\src\examples\security\jaas
のJAASサンプル・アプリケーションを参照してください。EXAMPLES_HOME
は、WebLogic Serverのコード・サンプルが構成されているディレクトリで、ORACLE_HOME
\wlserver\samples\server
にあります。WebLogic Serverサンプル・コードの詳細は、Oracle WebLogic Serverの理解のサンプル・アプリケーションおよびサンプル・コードを参照してください。
JAAS認証の基本の詳細は、http://docs.oracle.com/javase/8/docs/technotes/guides/security/jaas/tutorials/GeneralAcnOnly.html
でJAAS認証チュートリアルに関する項を参照してください。
WebLogic LoginModule実装
LoginModule
クラス(UsernamePasswordLoginModule.class
)のWebLogic実装は、WebLogic Server配布キットにおいて、WL_HOME\server\lib
ディレクトリのweblogic.jar
ファイルで提供されています。
ノート:
WebLogic Serverは、JAASで定義されているすべてのコールバックのタイプだけではなく、JAAS仕様を拡張するコールバックのタイプもすべてサポートしています。
WebLogic ServerのUsernamePasswordLoginModule
は、実行に先立ってシステム・ユーザーの認証定義が存在するかどうかを調べ、すでに定義されている場合は何も行いません。
JAAS LoginModuleの実装の詳細は、LoginModule開発者ガイド(http://docs.oracle.com/javase/8/docs/technotes/guides/security/jaas/JAASLMDevGuide.html
)を参照してください。
JVM全体のデフォルト・ユーザーとrunAs()メソッド
LoginModuleのWebLogic Server実装(weblogic.security.auth.login.UsernamePasswordLoginModule
)を初めて使用してログインすると、指定されたユーザーがJVM (Java仮想マシン)に対するマシン全体のデフォルト・ユーザーとなります。weblogic.security.Security.runAs()
メソッドを実行すると、このメソッドは指定されたSubject
と現在のスレッドのアクセス許可を関連付けてから、アクションを実行します。指定されたSubject
が権限を持たないユーザー(グループに割り当てられていないユーザーは権限を持たないと見なされる)を表している場合、JVM全体のデフォルト・ユーザーが使用されます。したがって、runAs()
メソッドでは必要なSubject
を指定することが重要です。それには、以下のオプションがあります。
例3-1 runAs()メソッドのラッパー・コード
import java.security.PrivilegedAction; import javax.security.auth.Subject; import weblogic.security.Security; public class client { public static void main(String[] args) { Security.runAs(new Subject(), new PrivilegedAction() { public Object run() { // //If implementing in client code, main() goes here. // return null; } }); } }
JAAS認証を使用するクライアント・アプリケーションの作成
WebLogic Server Javaクライアントで認証にJAASを使用するには、LoginModule
クラスおよびCallbackHandler
クラスを実装して、使用するLoginModuleクラスを指定する構成ファイルを記述し、その他のタスクを実行します。
WebLogic Server JavaクライアントにおいてJAASを使ってサブジェクトを認証するには、次の手順を実行します。
-
WebLogic Serverで使用する認証メカニズム用の
LoginModule
クラスを実装します。認証メカニズムのタイプごとにLoginModuleクラスが必要です。1つのWebLogic Serverデプロイメントに対して複数のLoginModuleクラスを割り当てることができます。ノート:
ユーザー名およびパスワードの認証には、WebLogic Server提供のLoginModuleの実装(weblogic.security.auth.login.UsernamePasswordLoginModule)を使用することをお薦めします。ユーザー名およびパスワードの認証用に自分でLoginModuleを作成することもできます。しかし、WebLogic ServerのLoginModuleを修正して再利用しようとはしないでください。LoginModuleを自分で作成する場合は、ログインを実行するためにweblogic.security.auth.Authenticate.authenticate()メソッドを呼び出すように記述します。SAMLなどのリモート・ログイン・メカニズムを使用している場合は、authenticate()メソッドを呼び出す必要はありません。WebLogic Serverを使用してログインを実行する場合は、authenticate()を呼び出すだけで済みます。
weblogic.security.auth.Authenticate
クラスは、表3-1で説明されているように初期コンテキストとしてJNDI Environmentオブジェクトを使用します。 -
LoginModuleがユーザーと対話し、ユーザー名、パスワード、URLなどのリクエストされた情報を取得するために使用する
CallbackHandler
クラスを実装します。URLにはWebLogicクラスタのURLも指定でき、その場合クライアント側でサーバーのフェイルオーバーによるメリットを得られます。WebLogic Server配布キットには、JAASクライアント・サンプルで使用するSampleCallbackHandler
が含まれています。SampleCallbackHandler.java
コードは、EXAMPLES_HOME
\src\examples\security\jaas
ディレクトリで配布キットの一部として入手できます。EXAMPLES_HOME
ディレクトリは、ORACLE_HOME
\wlserver\samples\server.
にあります。ノート:
独自のCallbackHandlerクラスを実装するかわりに、WebLogic提供による2つのCallbackHandlerクラス、すなわちweblogic.security.SimpleCallbackHandlerまたはweblogic.security.URLCallbackHandlerのいずれかを使用できます。これらのクラスの詳細は、Oracle WebLogic Server用Java APIリファレンスを参照してください。
-
WebLogic Serverで使用するLoginModuleクラス、およびLoginModuleクラスを呼び出す順序を指定する構成ファイルを記述します。WebLogic Server配布キットで提供されるJAASクライアントのサンプルで使用されるサンプル構成ファイルについては、次の例を参照してください。
/** Login Configuration for the JAAS Sample Application **/ Sample { weblogic.security.auth.login.UsernamePasswordLoginModule required debug=false; };
-
Javaクライアントにおいて、
LoginContext
をインスタンス化するコードを記述します。LoginContext
は、構成ファイルsample_jaas.config
を調べて、WebLogic Server用に構成されているデフォルトのLoginModuleをロードします。次に示すLoginContext
インスタンス化の例を参照してください。... import javax.security.auth.login.LoginContext; ... LoginContext loginContext = null; try { // Create LoginContext; specify username/password login module loginContext = new LoginContext("Sample", new SampleCallbackHandler(username, password, url)); }
ノート:
IDアサーション・プロバイダやWebLogic Serverのリモート・インスタンスなどの他の手段を使ってユーザーを認証する場合には、デフォルトLoginModuleはリモート・ソースによって決定されます。
-
LoginContext
のlogin()
メソッドを呼び出します。login()
メソッドによって、ロードされたLoginModuleがすべて呼び出されます。各LoginModuleでサブジェクトの認証が試みられます。構成されているログイン条件が満たされない場合、LoginContext
はLoginException
をスローします。次に示すlogin()
メソッドの例を参照してください。... import javax.security.auth.login.LoginContext; import javax.security.auth.login.LoginException; import javax.security.auth.login.FailedLoginException; import javax.security.auth.login.AccountExpiredException; import javax.security.auth.login.CredentialExpiredException; ... /** * Attempt authentication */ try { // If we return without an exception, authentication succeeded loginContext.login(); } catch(FailedLoginException fle) { System.out.println("Authentication Failed, " + fle.getMessage()); System.exit(-1); } catch(AccountExpiredException aee) { System.out.println("Authentication Failed: Account Expired"); System.exit(-1); } catch(CredentialExpiredException cee) { System.out.println("Authentication Failed: Credentials Expired"); System.exit(-1); } catch(Exception e) { System.out.println("Authentication Failed: Unexpected Exception, " + e.getMessage()); e.printStackTrace(); System.exit(-1); }
-
Javaクライアント内にコードを記述して、
javax.security.auth.Subject.getSubject()
メソッドを使用するLoginContext
インスタンスから認証されたサブジェクトを取得し、アクションをサブジェクトとして呼び出します。サブジェクトの認証に成功したら、weblogic.security.Security
.runAs()
メソッドを呼び出すことで、そのサブジェクトに対してアクセス制御を設定できます。runAs()
メソッドは、指定されたサブジェクトと現在のスレッドのアクセス許可を関連付けた後、アクションを実行します。getSubject()
メソッドとrunAs()
メソッドについては、次の実装例を参照してください。... /** * Retrieve authenticated subject, perform SampleAction as Subject */ Subject subject = loginContext.getSubject(); SampleAction sampleAction = new SampleAction(url); Security.runAs(subject, sampleAction); System.exit(0); ...
ノート:
WebLogic ServerアプリケーションでJAAS javax.security.auth.Subject.doAsメソッドを使用する場合、サブジェクトとクライアント・アクションは関連付けられません。doAsメソッドを使用してWebLogic ServerアプリケーションにJava EEセキュリティを実装することは可能ですが、この場合でもSecurity.runAs()メソッドを使用する必要があります。
-
サブジェクトが必要な権限を持っている場合にアクションを実行するコードを記述します。株式取引用のEJBを実行する
javax.security.PrivilegedAction
クラスの実装例SampleAction
が用意されています。SampleAction.java
コードは、EXAMPLES_HOME
\src\examples\security\jaas
ディレクトリで配布キットの一部として入手できます。EXAMPLES_HOME
は、WebLogic Serverのサンプル・コードが構成されているディレクトリで、ORACLE_HOME
\wlserver\samples\server
にあります。 -
LoginContext
インスタンスのlogout()
メソッドを呼び出します。logout()
メソッドは、ユーザーのセッションをクローズし、Subject
をクリアします。次に示すlogin()
メソッドの例を参照してください。... import javax.security.auth.login.LoginContext; ... try { System.out.println("logging out..."); loginContext.logout(); }
ノート:
LoginModule.logout()メソッドはWebLogic認証プロバイダまたはカスタム認証プロバイダに対して呼び出されることはありません。これは、いったんプリンシパルが作成されサブジェクト内に入れられると、WebLogicセキュリティ・フレームワークはこのサブジェクトのライフサイクルを制御しなくなるからです。したがって、JAAS LoginContextを作成してログインおよびサブジェクトの取得を行うコードでも、ログアウトするためにLoginContextを呼び出す必要があります。LoginContext.logout()を呼び出すと、サブジェクトからプリンシパルがクリアされます。
JNDI認証の使い方
Javaクライアントは、Java Naming and Directory Interface (JNDI)を使用してWebLogic Serverに資格証明を渡します。これを実行するために、JavaクライアントはJNDI InitialContext
を取得して、Oracle WebLogic Serverとの接続を確立します。また、InitialContext
を使用してOracle WebLogic Server JNDIツリーで必要となるリソースを調べます。
.
ノート:
JAASは認証方法として望ましい選択肢ですが、WebLogic認証プロバイダのLoginModuleはユーザー名とパスワードの認証しかサポートしていません。したがって、クライアントの証明書認証(双方向SSL認証ともいう)ではJNDIを使用します。クライアントの証明書認証にJAASを使用するには、LoginModuleで証明書の認証を行うカスタム認証プロバイダを記述する必要があります。LoginModuleの作成方法については、http://docs.oracle.com/javase/8/docs/technotes/guides/security/jaas/JAASLMDevGuide.html
を参照してください。
ユーザーとユーザーの資格証明を指定するには、表3-1で示されているJNDIプロパティを設定します。
表3-3 認証に使用されるJNDIプロパティ
プロパティ | 意味 |
---|---|
INITIAL_CONTEXT_FACTORY |
エントリ・ポイントをOracle WebLogic Server環境に提供します。クラスweblogic.jndi.WLInitialContextFactoryはOracle WebLogic Server用のJNDI SPIです。 |
PROVIDER_URL |
ネーム・サービスを提供するWebLogic Serverのホストとポートを指定します。たとえば: |
SECURITY_PRINCIPAL |
ユーザーがデフォルトの(アクティブな)セキュリティ・レルムに対して認証されているときのユーザーのIDを指定します。 |
SECURITY_CREDENTIALS |
ユーザーがデフォルトの(アクティブな)セキュリティ・レルムに対して認証されているときのユーザーの資格証明を指定します。 |
これらのプロパティは、InitialContext
コンストラクタに渡されるハッシュ表に格納されます。例3-2に、WebLogic Serverで実行されるJavaクライアントでのJNDI認証の使い方を示します。
ノート:
JNDIのコンテキストとスレッドおよび潜在的なJNDIコンテキスト問題の予防方法の詳細は、Oracle WebLogic ServerのJNDIアプリケーションの開発でJNDIのコンテキストとスレッドと潜在的なJNDIコンテキスト問題の予防方法を参照してください。
WebLogic Server 9.0より前のバージョンでは、JNDIでIIOP以外のプロトコルを使用する場合、最初のユーザーは削除されず、他のユーザーが存在しない場合はデフォルト・ユーザーになります。これは適切な処理ではありません。ユーザー名と資格証明を指定しない以後のログインに対してデフォルト・ユーザーのIDが付与されるからです。
バージョン9.0以降では、このような動作は発生せず、デフォルト・ユーザーも存在しません。
以前の動作に戻すには、コマンドラインまたはInitialContextインタフェースでweblogic.jndi.WLContext.ENABLE_DEFAULT_USER
フィールドを設定する必要があります。
例3-2 認証の例
... Hashtable env = new Hashtable(); env.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory"); env.put(Context.PROVIDER_URL, "t3://weblogic:7001"); env.put(Context.SECURITY_PRINCIPAL, "javaclient"); env.put(Context.SECURITY_CREDENTIALS, "javaclientpassword"); ctx = new InitialContext(env);
JavaクライアントのJAAS認証サンプル・コード
EXAMPLES_HOME
\src\examples\security\jaas
にあります。EXAMPLES_HOME
は、WebLogic Serverのサンプル・コードが構成されているディレクトリで、ORACLE_HOME
\wlserver\samples\server
にあります。このサンプルの説明と、構築、構成、および実行の手順については、サンプル・ディレクトリのpackage.html
ファイルを参照してください。このサンプル・コードは、修正して再利用できます。