| Oracle® Fusion Middleware Oracle WebLogic Serverセキュリティのプログラミング 11g リリース1(10.3.6) B61619-04 | 
 | 
|  前 |  次 | 
この節では、以下の内容について説明します。
これらの節で参照するサンプル・コードは、WebLogic Server配布キットの次の場所から入手できます。
SAMPLES_HOME\server\examples\src\examples\security\jaas
jaasディレクトリには、instructions.htmlファイル、antビルド・ファイル、sample_jaas.configファイル、および以下のJavaファイルが含まれています。
BaseClient.java
BaseClientConstants.java
SampleAction.java
SampleCallbackHandler.java
SampleClient.java
TradeResult.java
TraderBean.java
以降の説明は、実際のサンプルを見ながら読み進めてください。
Java Authentication and Authorization Service (JAAS)は、Java EE Development Kit 5.0のセキュリティに対する標準拡張です。JAASでは、ユーザーのIDに基づいてアクセス制御を実行できます。JAASは、JNDI認証メカニズムのかわりとしてWebLogic Serverで提供されています。
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)を参照してください。
クライアントがアプリケーション、アプレット、Enterprise JavaBeans (EJB)、または認証が必要なサーブレットのどれであるかに関係なく、WebLogic ServerはJAASのクラスを使用して安全かつ確実にそのサーバーに対して認証を行います。JAASは、プラガブル認証モジュール(PAM)フレームワークのJavaバージョンを実装します。このフレームワークにより、アプリケーションは基底の認証技術から独立することができます。このため、PAMフレームワークを利用することで、Javaアプリケーションに修正を加えることなく新しいまたは最新版の認証技術を使用することができます。
WebLogic Serverは、リモートのJavaクライアントの認証および内部の認証でJAASを使用します。したがって、JAASに直に関与する必要があるのは、カスタム認証プロバイダの開発者とJavaクライアント・アプリケーションの開発者だけです。Webブラウザ・クライアントのユーザーまたはコンテナ内のJavaクライアント・アプリケーション(サーブレットからEJBを呼び出すものなど)の開発者は、JAASを直接使用したり、その知識を身につけたりする必要はありません。
| 注意:WebLogicクライアントでセキュリティを実装するためには、JavaクライアントでWebLogic Serverソフトウェア配布キットをインストールする必要があります。 | 
この節では、以下の内容について説明します。
WebLogic ServerでJAAS認証を使用するJavaクライアントを実装するには、Java EE アプリケーション・プログラミング・インタフェース(API)とWebLogic APIを組み合せて使用します。
表4-1では、JAAS認証の実装に使用されるJava APIパッケージについて説明します。表4-1の情報はJava APIのドキュメントから取られており、WebLogic Server固有の情報がコメントで追加されています。Java APIの詳細は、http://download.oracle.com/javase/6/docs/api/index.htmlおよびhttp://download.oracle.com/javaee/6/api/のJavadocを参照してください。
表4-1では、JAAS認証の実装に使用されるWebLogic APIについて説明します。詳細については、WebLogicクラスのJavadocを参照してください。
表4-1 Java JAAS API
| Java JAAS API | 説明 | 
|---|---|
| javax.security.auth.Subject( | 
 | 
| javax.security.auth.login.LoginContext( | 
 呼出し側は、 
 
 このクラスの実装サンプルについては、例4-3を参照してください。 | 
| javax.security.auth.login.Configuration( | これは、アプリケーションにおけるLoginModuleの構成を表す抽象クラスです。 WebLogic Serverでは、このクラスのかわりにログイン構成ファイルを使用します。サンプルの構成ファイルについては、例4-2を参照してください。デフォルトでは、WebLogic Serverは構成ファイルから読取りを行う構成クラスを使用します。 | 
| javax.security.auth.spi.LoginModule( | 
 アプリケーション開発者は 注意: WebLogic Serverは、LoginModuleの実装( 
 | 
| javax.security.auth. callback.Callback( | このインタフェースの実装は 
 | 
| javax.security.auth. callback.CallbackHandler( | アプリケーションは、 
 基底のセキュリティ・サービスは、個々の | 
表4-2 WebLogic JAAS API
| WebLogic JAAS API | 説明 | 
|---|---|
| ユーザー資格証明の認証に使用される認証クラス。 LoginModuleのWebLogic実装( 
 | |
| 基底のセキュリティ・サービスでは、このクラスを使用して このコールバックによって、ContextHandlerがLoginModule.login()メソッドに渡されます。 | |
| 基底のセキュリティ・サービスでは、このクラスを使用して | |
| 基底のセキュリティ・サービスでは、このクラスを使用して 
 
 注意:アプリケーション開発者は、URL情報の取得にこのクラスを使用すべきではありません。かわりに、weblogic.security.URLCallbackHandlerを使用します。 | |
| このクラスはWebLogic Serverクライアントの サンプルの実装については、例4-5を参照してください。 | |
| アプリケーション開発者が | 
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認証クライアントについては、WebLogic Serverで提供されているSAMPLES_HOME\server\examples\src\examples\security\jaasディレクトリのJAASサンプル・アプリケーションを参照してください。
JAAS認証の基本の詳細は、Sunの「JAAS Authentication Tutorial」(http://download.oracle.com/javase/6/docs/technotes/guides/security/jaas/tutorials/GeneralAcnOnly.html)を参照してください。
LoginModuleクラス(UsernamePasswordLoginModule.class)のWebLogic実装は、WebLogic Server配布キットにおいて、WL_HOME\server\libディレクトリのweblogic.jarファイルで提供されています。
| 注意:WebLogic Serverは、JAASで定義されているすべてのコールバックのタイプだけではなく、JAAS仕様を拡張するコールバックのタイプもすべてサポートしています。 | 
WebLogic ServerのUsernamePasswordLoginModuleは、実行に先立ってシステム・ユーザーの認証定義が存在するかどうかを調べ、すでに定義されている場合は何も行いません。
JAAS LoginModuleの実装の詳細は、LoginModule開発者ガイド(http://download.oracle.com/javase/6/docs/technotes/guides/security/jaas/JAASLMDevGuide.html)を参照してください。
LoginModuleのWebLogic Server実装(weblogic.security.auth.login.UsernamePasswordLoginModule)を初めて使用してログインすると、指定されたユーザーがJVM (Java仮想マシン)に対するマシン全体のデフォルト・ユーザーとなります。weblogic.security.Security.runAs()メソッドを実行すると、このメソッドは指定されたSubjectと現在のスレッドのアクセス許可を関連付けてから、アクションを実行します。指定されたSubjectが権限を持たないユーザー(グループに割り当てられていないユーザーは権限を持たないと見なされる)を表している場合、JVM全体のデフォルト・ユーザーが使用されます。したがって、runAs()メソッドでは必要なSubjectを指定することが重要です。それには、以下のオプションがあります。
オプション1 :クライアントがmain()の制御を持つ場合は、例4-1で示されているラッパー・コードをクライアント・コードで実装します。
オプション2 :クライアントがmain()の制御を持たない場合、例4-1に示したラッパー・コードを各スレッドのrun()メソッドに実装します。
例4-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;
       }
    });
  }
}
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クラスは、表4-1で説明されているように初期コンテキストとしてJNDI Environmentオブジェクトを使用します。
LoginModuleがユーザーと対話し、ユーザー名、パスワード、URLなどのリクエストされた情報を取得するために使用するCallbackHandlerクラスを実装します。URLにはWebLogicクラスタのURLも指定でき、その場合クライアント側でサーバーのフェイルオーバーによるメリットを得られます。WebLogic Server配布キットには、JAASクライアント・サンプルで使用するSampleCallbackHandlerが含まれています。SampleCallbackHandler.javaコードは開発キットとしてSAMPLES_HOME\server\examples\src\examples\security\jaasディレクトリに含まれています。
| 注意:独自のCallbackHandlerクラスを実装するかわりに、WebLogic提供による2つのCallbackHandlerクラス、すなわちweblogic.security.SimpleCallbackHandlerまたはweblogic.security.URLCallbackHandlerのいずれかを使用できます。詳細については、WebLogicクラスのJavadocを参照してください。 | 
WebLogic Serverで使用するLoginModuleクラス、およびLoginModuleクラスを呼び出す順序を指定する構成ファイルを記述します。WebLogic Server配布キットで提供されるJAASクライアントのサンプルで使用されるサンプル構成ファイルについては、例4-2を参照してください。
例4-2 sample_jaas.configのサンプル・コード
/** 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のインスタンス化の例については、例4-3を参照してください。
| 注意:IDアサーション・プロバイダやWebLogic Serverのリモート・インスタンスなどの他の手段を使ってユーザーを認証する場合には、デフォルトLoginModuleはリモート・ソースによって決定されます。 | 
例4-3 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));
    }
LoginContextのlogin()メソッドを呼び出します。login()メソッドによって、ロードされたLoginModuleがすべて呼び出されます。各LoginModuleでサブジェクトの認証が試みられます。構成されているログイン条件が満たされない場合、LoginContextはLoginExceptionをスローします。login()メソッドの例については、例4-4を参照してください。
例4-4 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()メソッドの実装例については、例4-5を参照してください。
| 注意:WebLogic ServerアプリケーションでJAAS javax.security.auth.Subject.doAsメソッドを使用する場合、サブジェクトとクライアント・アクションは関連付けられません。doAsメソッドを使用してWebLogic ServerアプリケーションにJava EEセキュリティを実装することは可能ですが、この場合でもSecurity.runAs()メソッドを使用する必要があります。 | 
例4-5 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); ...
サブジェクトが必要な権限を持っている場合にアクションを実行するコードを記述します。株式取引用のEJBを実行するjavax.security.PrivilegedActionクラスの実装例SampleActionが用意されています。SampleAction.javaコードは開発キットとしてSAMPLES_HOME\server\examples\src\examples\security\jaasディレクトリに含まれています。
LoginContextインスタンスのlogout()メソッドを呼び出します。logout()メソッドは、ユーザーのセッションをクローズし、Subjectをクリアします。login()メソッドの例については、例4-6を参照してください。
例4-6 logout()メソッドのサンプル・コード
...
import javax.security.auth.login.LoginContext;
...
try
    {
      System.out.println("logging out...");
      loginContext.logout();
    }
| 注意:LoginModule.logout()メソッドはWebLogic認証プロバイダまたはカスタム認証プロバイダに対して呼び出されることはありません。これは、いったんプリンシパルが作成されサブジェクト内に入れられると、WebLogic Securityフレームワークはこのサブジェクトのライフサイクルを制御しなくなるからです。したがって、JAAS LoginContextを作成してログインおよびサブジェクトの取得を行うコードでも、ログアウトするためにLoginContextを呼び出す必要があります。LoginContext.logout()を呼び出すと、サブジェクトからプリンシパルがクリアされます。 | 
Javaクライアントは、Java Naming and Directory Interface (JNDI)を使用してWebLogic Serverに資格証明を渡します。Javaクライアントは、JNDI InitialContextを取得してWebLogic Serverとの通信を確立します。その後、InitialContextを使用して、WebLogic Server JNDIツリーで必要なリソースをルックアップします。
| 注意:JAASは認証方法として望ましい選択肢ですが、WebLogic認証プロバイダのLoginModuleはユーザー名とパスワードの認証しかサポートしていません。したがって、クライアントの証明書認証(双方向SSL認証ともいう)ではJNDIを使用します。クライアントの証明書認証にJAASを使用するには、LoginModuleで証明書の認証を行うカスタム認証プロバイダを記述する必要があります。LoginModuleの作成方法については、 http://download.oracle.com/javase/6/docs/technotes/guides/security/jaas/JAASLMDevGuide.htmlを参照してください。 | 
ユーザーとユーザーの資格証明を指定するには、表4-1で示されているJNDIプロパティを設定します。
表4-3 認証に使用されるJNDIプロパティ
| プロパティ | 意味 | 
|---|---|
| INITIAL_CONTEXT_FACTORY | エントリ・ポイントをWebLogic Server環境に提供します。クラスweblogic.jndi.WLInitialContextFactoryはWebLogic Server用のJNDI SPIです。 | 
| PROVIDER_URL | ネーム・サービスを提供するWebLogic Serverのホストとポートを指定します。例:  | 
| SECURITY_PRINCIPAL | ユーザーがデフォルトの(アクティブな)セキュリティ・レルムに対して認証されているときのユーザーのIDを指定します。 | 
| SECURITY_CREDENTIALS | ユーザーがデフォルトの(アクティブな)セキュリティ・レルムに対して認証されているときのユーザーの資格証明を指定します。 | 
これらのプロパティは、InitialContextコンストラクタに渡されるハッシュ表に格納されます。例4-7に、WebLogic Serverで実行されるJavaクライアントでのJNDI認証の使い方を示します。
例4-7 認証の例
...
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);
| 注意:JNDIコンテキストとスレッド、およびJNDIコンテキストの潜在的な問題を回避する方法の詳細は、『Oracle WebLogic Server JNDIのプログラミング』のJNDIコンテキストとスレッドに関する項およびJNDIコンテキストの問題の回避方法に関する項を参照してください。 WebLogic Server 9.0より前のバージョンでは、JNDIでIIOP以外のプロトコルを使用する場合、最初のユーザーは削除されず、他のユーザーが存在しない場合はデフォルト・ユーザーになります。これは適切な処理ではありません。ユーザー名と資格証明を指定しない以後のログインに対してデフォルト・ユーザーのIDが付与されるからです。 バージョン9.0以降では、このような動作は発生せず、デフォルト・ユーザーも存在しません。 以前の動作に戻すには、コマンド・ラインまたはweblogic.jndi.WLContext.ENABLE_DEFAULT_USERインタフェースでフィールドを設定する必要があります。 | 
WebLogic Serverソフトウェアには、完全な実践的JAAS認証サンプルが付属しています。そのサンプルは、SAMPLES_HOME\server\examples\src\examples\security\jaasディレクトリにあります。このサンプルの説明と、構築、構成、および実行の手順については、サンプル・ディレクトリのpackage.htmlファイルを参照してください。このサンプル・コードは、修正して再利用できます。