| Oracle® Fusion Middleware Oracle WebLogic Server Security プログラマーズ ガイド 11g リリース 1 (10.3.1) B55520-01 |
|
![]() 戻る |
![]() 次へ |
この節では、以下の内容について説明します。
これらの節で参照するサンプル コードは、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://java.sun.com/products/jaas/reference/docs/index.html) を参照してください。
クライアントがアプリケーション、アプレット、エンタープライズ JavaBean (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://java.sun.com/javase/6/docs/api/index.html および http://java.sun.com/javaee/5/docs/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 はコンフィグレーション ファイルから読み取りを行う、Sun Microsystems, Inc. によるコンフィグレーション クラスを使用する。 |
|
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 Server 実装 (
|
|
|
基底のセキュリティ サービスでは、このクラスを使用して このコールバックによって、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 ファイルは、ユーザ名およびパスワードの認証や証明書の認証など、さまざまなタイプの認証を実行するように記述できます。クライアント アプリケーションに含める LoginMdule は、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 Tutoria』(http://java.sun.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 Developer's Guide』(http://java.sun.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() {
//
//クライアント コードに実装する場合、main() はここに記述する
//
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 のサンプル コード
/**JAAS サンプル アプリケーション用のログイン コンフィグレーション**/
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
{
//LoginContext を作成する。ユーザ名/パスワード ログイン モジュールを指定する
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;
...
/**
* 認証を試みる
*/
try
{
// 例外が発生せずに復帰した場合は、認証に成功
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() メソッドのコードの一部分
... /** * 認証されたサブジェクトを取得し、サブジェクトとして SampleAction を実行する */ 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 認証プロバイダまたはカスタム認証プロバイダに対して呼び出されることはありません。これは、いったん Principals が作成され Subject 内に入れられると、WebLogic Security フレームワークはこの Subject のライフサイクルを制御しなくなるからです。したがって、JAAS LoginContext を作成してログインおよび Subject の取得を行うコードでも、ログアウトするために LoginContext を呼び出す必要があります。LoginContext.logout() を呼び出すと、Subject から Principals がクリアされます。 |
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://java.sun.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, "t3s://weblogic:7001"); env.put(Context.SECURITY_PRINCIPAL, "javaclient"); env.put(Context.SECURITY_CREDENTIALS, "javaclientpassword"); ctx = new InitialContext(env);
|
注意 : JNDI コンテキストとスレッドの詳細と、JNDI コンテキストの潜在的な問題を回避する方法については、『Oracle Fusion Middleware 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 ファイルを参照してください。このサンプル コードは、修正して再利用できます。