![]() ![]() ![]() ![]() |
これらの節で参照するサンプル コードは、BEA の dev2dev Web サイト、または WebLogic Server 配布キットの次の場所から入手できます。
SAMPLES_HOME\server\examples\src\examples\security\jaas
jaas
ディレクトリには、instructions.html
ファイル、ant
ビルド ファイル、sample_jaas.config
ファイル、および以下の 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/javaee/5/docs/api/ の Javadoc を参照してください。
表 4-2 では、JAAS 認証の実装に使用される WebLogic API について説明します。詳細については、WebLogic クラスの Javadoc を参照してください。
LoginContext クラスは、Subject の認証に使用される基本メソッドを記述し、基底の認証テクノロジから独立したアプリケーションを開発する方法を提供する。Configuration では、特定のアプリケーションで使用する認証テクノロジまたは LoginModule を指定する。したがって、アプリケーション自体を変更せずに、異なる LoginModule をアプリケーションに組み込むことができる。
LoginContext をインスタンス化した後、login メソッドを呼び出して Subject を認証する。この login メソッドは、呼び出し側で指定した名前についてコンフィグレーションされた LoginModule の各々からの login メソッドを呼び出す。
login メソッドが例外を送出することなく返れば、認証は総合的に成功したことになる。呼び出し側はその後、getSubject メソッドを呼び出すことによって、新しく認証された Subject を取得できる。Subject と関連付けられたプリンシパルおよび資格は、Subject の getPrincipals 、getPublicCredentials 、および getPrivateCredentials メソッドをそれぞれ呼び出すことで取得できる。
Subject をログアウトさせるには、呼び出し側から logout メソッドを呼び出すだけでよい。login メソッドの場合と同じく、この logout メソッドはこの LoginContext についてコンフィグレーションされた各 LoginModule に対し logout メソッドを呼び出す。
|
|||
Configuration では、特定のアプリケーションについて、使用する LoginModule、および LoginModule を呼び出す順番を指定する。この抽象クラスは、実際のコンフィグレーションを読み取ってロードする実装を提供するようサブクラス化する必要がある。
|
|||
LoginContext API に書き込み、API 認証テクノロジ プロバイダは LoginModule インタフェースを実装する。Configuration では、特定のログイン アプリケーションで使用する LoginModule を指定する。したがって、アプリケーション自体を変更せずに、異なる LoginModule をアプリケーションに組み込むことができる。
|
|||
CallbackHandler を実装し、それを基底のセキュリティ サービスに渡すことで、それらのサービスがアプリケーションと対話してユーザ名やパスワードなど特定の認証データを取得したり、エラーや警告メッセージなど特定の情報を表示したりできるようにする。
Callbacks を CallbackHandler に渡すことによってさまざまなタイプの情報に対するリクエストを行う。CallbackHandler 実装は、渡された Callbacks に応じて情報を取得したり表示したりする方法を決定する。たとえば、基底のサービスがユーザを認証するためにユーザ名とパスワードを必要としていれば、NameCallback および PasswordCallback を使用する。その後、CallbackHandler は逐次的にユーザ名およびパスワードの入力を求めるか、または単一のウィンドウで両方の入力を求めるかを選択できる。
|
URLCallback をインスタンス化し、CallbackHandler の invokeCallback メソッドに渡して、URL 情報を取得する。
LoginModule の WebLogic Server 実装 (weblogic.security.auth.login.UsernamePasswordLoginModule ) ではこのクラスを使用する。
|
|||
runAs メソッドを実装する。クライアント アプリケーションは、実行する PrivilegedAction または PrivilegedExceptionAction と Subject ID を、runAs メソッドを使用して関連付ける。
|
|||
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
)
このスクリプトは、アプリケーションに必要なすべてのファイルをコンパイルし、それらを WebLogic Server のアプリケーション ディレクトリにデプロイします。
ここで説明しているコンポーネントを実装する完全な実践的 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()
メソッドに実装します。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 クラスを実装する代わりに、WebLogic 提供による 2 つの CallbackHandler クラス、すなわち weblogic.security.SimpleCallbackHandler または weblogic.security.URLCallbackHandler のいずれかを使用できます。詳細については、WebLogic クラスの Javadoc を参照してください。 |
/** 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 はリモート ソースによって決定されます。 |
...
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 を参照してください。...
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() メソッドを使用する必要があります。 |
...
/**
* 認証されたサブジェクトを取得し、サブジェクトとして 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 を参照してください。...
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
ファイルを参照してください。このサンプル コードは、修正して再利用できます。
![]() ![]() ![]() |