WebLogic Security プログラマーズ ガイド
![]() |
![]() |
![]() |
![]() |
これらの節で参照するサンプル コードは、BEA の dev2dev Web サイト、または 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) は、J2SE Development Kit 5.0 のセキュリティに対する標準拡張です。JAAS では、ユーザの ID に基づいてアクセス制御を実行できます。JAAS は、JNDI 認証メカニズムの代わりとして WebLogic Server で提供されています。
WebLogic Server クライアントは、標準の JAAS の認証部分だけを利用します。JAAS LoginContext は、コンフィグレーションされているすべての認証プロバイダの LoginModule インスタンスを順番どおりに実行し、コンフィグレーションされている各プロバイダの完了ステータスの管理を行います。
Java クライアントに対して JAAS 認証を使用する場合は、次のことに注意してください。
weblogic.security.auth.login.UsernamePasswordLoginModule
) はユーザ名とパスワードの認証しかサポートしていません。したがって、クライアントの証明書認証 (双方向 SSL 認証ともいう) では JNDI を使用します。クライアントの証明書認証に JAAS を使用するには、証明書の認証を行うカスタム LoginModule を記述する必要があります。 注意 : WebLogic Server クライアントで使用する LoginModule を自分で作成する場合は、weblogic.security.auth.Authenticate.authenticate()
を呼び出してログインを実行するように記述します。
weblogic.security.auth.Authenticate.authenticate()
メソッドを呼び出してログインを実行するように記述する必要があります。weblogic.security.auth.Authenticate.authenticate()
を呼び出す必要はありません。WebLogic Server を使用してログインを実行する場合は、authenticate()
メソッドを呼び出すだけで済みます。注意 : WebLogic Server は、JAAS 認証に対して完全なコンテナ サポートを提供し、アプリケーション コードにおける JAAS の認証と認可の完全な使用をサポートしています。
weblogic.security.auth.Authentication.authenticate()
です。認証クラスを使用する場合、ヘルパー クラスとしては weblogic.security.SimpleCallbackHandler
が有用であると考えられます。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 クライアントを実装するには、J2SE 5.0 アプリケーション プログラミング インタフェース (API) と WebLogic API を組み合わせて使用します。
表 4-1 では、JAAS 認証の実装に使用される Java API パッケージについて説明します。表 4-1 の情報は Java API のマニュアルから取られており、WebLogic Server 固有の情報がコメントで追加されています。Java API の詳細については、http://java.sun.com/j2se/1.5.0/docs/api/index.html および http://java.sun.com/j2ee/1.4/docs/api/index.html の Javadoc を参照してください。
表 4-2 では、JAAS 認証の実装に使用される WebLogic API について説明します。詳細については、WebLogic クラスの Javadoc を参照してください。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
JAAS 認証クライアント アプリケーションには、少なくとも以下のコンポーネントが含まれます。
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 は CallbackHandler
を使用して、ユーザ名およびパスワードを取得し、そのユーザ名とパスワードが要求どおりのものであるかどうかを判別します。
認証に成功すると、LoginModule は、ユーザを表すプリンシパルをサブジェクトに格納します。LoginModule がサブジェクトに格納するプリンシパルは Principal
のインスタンスであり、java.security.Principal
インタフェースを実装するクラスです。
LoginModule ファイルは、ユーザ名およびパスワードの認証や証明書の認証など、さまざまなタイプの認証を実行するように記述できます。クライアント アプリケーションに含める LoginMdule は、1 つ (最低要件) でも複数でもかまいません。
注意 : WebLogic Server アプリケーションで JAAS javax.security.auth.Subject.doAs
メソッドを使用する場合、サブジェクトとクライアント アクションは関連付けられません。doAs
メソッドを使用して WebLogic Server アプリケーションに J2SE セキュリティを実装することは可能ですが、この場合でも Security.runAs()
メソッドを使用する必要があります。
CallbackHandler
は、javax.security.auth.callback.CallbackHandler
インタフェースを実装します。LoginModule は、CallbackHandler
を使って、ユーザと対話し、ユーザ名やパスワードなどの要求された情報を取得します。
このファイルでは、アプリケーションで使用する LoginModule をコンフィグレーションします。LoginModule の場所と、複数の LoginModule がある場合は、実行する順番を指定します。このファイルを使うと、Java アプリケーションは LoginModule を使って定義および実装される認証テクノロジから独立を保つことができます。
ant
構築スクリプト (build.xml
)ここで説明しているコンポーネントを実装する完全な実践的 JAAS 認証クライアントについては、WebLogic Server で提供されている SAMPLES_HOME\server\examples\src\examples\security\jaas
ディレクトリの JAAS サンプル アプリケーションを参照してください。このサンプルは、BEA の dev2dev サイトでも入手できます。
JAAS 認証の基本の詳細については、Sun の『JAAS Authentication Tutorial』(http://java.sun.com/j2se/1.5.0/docs/guide/security/jaas/tutorials/GeneralAcnOnly.html) を参照してください。
LoginModule
クラスの 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/j2se/1.5.0/docs/guide/security/jaas/JAASLMDevGuide.html) を参照してください。
LoginModule の WebLogic Server 実装 (weblogic.security.auth.login.UsernamePasswordLoginModule
) を初めて使用してログインすると、指定されたユーザが JVM (Java 仮想マシン) に対するマシン全体のデフォルト ユーザとなります。weblogic.security.Security.runAs()
メソッドを実行すると、このメソッドは指定された Subject
と現在のスレッドのアクセス パーミッションを関連付けてから、アクションを実行します。指定された Subject
が特権を持たないユーザ (グループに割り当てられていないユーザは特権を持たないと見なされる) を表している場合、JVM 全体のデフォルト ユーザが使用されます。したがって、runAs()
メソッドでは必要な Subject
を指定することが重要です。それには、以下のオプションがあります。
main()
の制御を持つ場合は、コード リスト 4-1 で示されているラッパー コードをクライアント コードで実装します。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 を使ってサブジェクトを認証するには、以下の手順を実行します。
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-3 で説明されているように初期コンテキストとして JNDI Environment オブジェクトを使用します。
CallbackHandler
クラスを実装します。URL には WebLogic クラスタの URL も指定でき、その場合クライアント側でサーバのフェイルオーバによるメリットを得られます。WebLogic Server 配布キットには、JAAS クライアント サンプルで使用する SampleCallbackHandler
が含まれています。SampleCallbackHandler.java
コードは開発キットに含まれていますが、オンラインでも入手できます。\server\examples\src\examples\security\jaas
ディレクトリにあります。注意 : 独自の CallbackHandler
クラスを実装する代わりに、2 つの WebLogic 提供による CallbackHandler
クラス、すなわち weblogic.security.SimpleCallbackHandler
または weblogic.security.URLCallbackHandler
のいずれかを使用できます。これらのクラスの詳細については、WebLogic クラスの Javadoc を参照してください。
コード リスト 4-2 sample_jaas.config のコード例
/** JAAS サンプル アプリケーション用のログイン コンフィグレーション **/
Sample {
weblogic.security.auth.login.UsernamePasswordLoginModule
required debug=false;
};
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);
}
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 アプリケーションに J2SE セキュリティを実装することは可能ですが、この場合でも Security.runAs()
メソッドを使用する必要があります。
コード リスト 4-5 getSubject メソッドと runAs メソッドのコードの一部分
...
/**
* 認証されたサブジェクトを取得し、サブジェクトとして SampleAction を実行する
*/
Subject subject = loginContext.getSubject();
SampleAction sampleAction = new SampleAction(url);
Security.runAs(subject, sampleAction);
System.exit(0);
...
javax.security.PrivilegedAction
クラスの実装例 SampleAction
が用意されています。SampleAction.java
コードは開発キットに含まれていますが、オンラインでも入手できます。\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/j2se/1.5.0/docs/guide/security/jaas/JAASLMDevGuide.html を参照してください。
ユーザとユーザの資格を指定するには、表 4-3 で示されている JNDI プロパティを設定します。
|
|
|
|
これらのプロパティは、InitialContext
コンストラクタに渡されるハッシュ テーブルに格納されます。コード リスト 4-7 に、WebLogic Server で実行される Java クライアントでの JNDI 認証の使い方を示します。
...
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 コンテキストの潜在的な問題を回避する方法については、『WebLogic JNDI プログラマーズ ガイド』の「JNDI コンテキストとスレッド」および「JNDI コンテキストの問題の回避方法」を参照してください。
注意 : WebLogic Server 9.0 より前のバージョンでは、JNDI で IIOP 以外のプロトコルを使用する場合、最初のユーザは削除されず、他のユーザが存在しない場合はデフォルト ユーザになります。これは適切な処理ではありません。ユーザ名と資格を指定しない以後のログインに対してデフォルト ユーザの ID が付与されるからです。
バージョン 9.0 以降では、このような動作は発生せず、デフォルト ユーザも存在しません。
以前の動作に戻すには、コマンドラインまたは InitialContext
インタフェースで weblogic.jndi.WLContext.ENABLE_DEFAULT_USER
フィールドを設定する必要があります。
WebLogic Server ソフトウェアには、完全な実践的 JAAS 認証サンプルが付属しています。そのサンプルは、SAMPLES_HOME\server\examples\src\examples\security\jaas
ディレクトリにあります。このサンプルの説明と、構築、コンフィグレーション、および実行の手順については、サンプル ディレクトリの package.html
ファイルを参照してください。このコード例は、修正して再利用できます。
![]() ![]() |
![]() |
![]() |