|
この章では、ポータル デプロイメントのセキュリティについてのベスト プラクティス、ヒント、および技法を説明します。このガイドの他の章は、資格の追加、セキュリティ プロバイダの管理、委託された管理の設定による、ポータル リソースへのアクセスのセキュリティについて説明していますが、この章では、プロダクション環境のポータルをセキュリティで保護するための追加の手順について説明します。これには、ファイアウォールの使用、データベース接続のセキュリティ、WSRP プロデューサのセキュリティ、RMI、EJB JNDI など非 HTTP プロトコルを使用するアクセスのブロッキングなどが含まれます。
| ヒント : | この章では WebLogic Portal 固有の情報が説明されています。次に進む前に、WebLogic Server インストールのセキュリティの詳細について、WebLogic Server ドキュメントの「プロダクション環境の保護」を読むことをお勧めします。 |
この章では、以下のセキュリティのトピックについて説明します。
簡単なセキュリティ対策として、パスワードやクレジット カード番号などの機密データを決してクリア テキストに保管しないようにします。
ポータル ソフトウェアをセキュリティで保護するには、ファイアウォールを使用します。IP プロトコル フィルタ処理からコンテンツ フィルタ処理まで、ファイアウォールには多くの選択肢があります。どのファイアウォールも、ポータル ソフトウェアのセキュリティを保護するための第一歩として適しています。
最適な保護を得るは 2 つのファイアウォール ソリューションを使用します。WebLogic Server (または WebLogic でサポートされる認定サーバ) の前にファイアウォールを配置し、WebLogic でサポートされるサーバ プラグインを使用します。このプラグインが、もう 1 つのファイアウォールを介してポータル ソフトウェアと通信します。これらのファイアウォールは、HTTP と HTTPS 以外のすべてのトラフィックをフィルタで除外するようにコンフィグレーションできます。さらに、プラグインと WebLogic でサポートされているサーバは、プラグインと WebLogic でサポートされているサーバ間で双方向の SSL を実行するようにコンフィグレーションできます。
ファイアウォールに応じて、状況 (非暗号化) によっては、プラグインと Web サーバの間を通るパケットのコンテンツをフィルタ処理できます。
この方法の欠点は、両方のファイアウォールが同じプロトコルをフィルタ処理することです。そのため、攻撃者は最初のファイアウォールに通り抜けられると、2 つ目のファイアウォールも通り抜けられることになります。このセキュリティーホールによる危険を軽減するために、サポートされている WebLogic Web サーバの認定された安全なバージョンを使用できます。
ファイアウォールの詳細については、「サポート対象の Web サーバ、ブラウザ、およびファイアウォール」を参照してください。
最も簡単な対策の 1 つは、WebLogic Portal Administration Console をセキュリティで保護することです。
極端な場合、データベース通信をセキュリティで保護すると有効な場合があります。すべてのドライバがこのようなメカニズムをサポートしているわけではありませんが、多くのプロバイダがデータベースに暗号化された通信を提供しています。このように特別の暗号化を行うと、パフォーマンス上で重い負荷となりますが、セキュリティにきわめて関心の高いお客様にとっては選択肢の 1 つとなります。
ポータルをプロダクション環境へデプロイする前に、委託管理および訪問者の資格のポリシーを確認することは重要です。委託管理は、ロールの階層構造内で WebLogic Portal Administration Console の特権を伝達するメカニズムです。訪問者の資格を使用すると、ポータル アプリケーション内のリソースにどのユーザがアクセスできるか、それらのリソースに対してユーザが何をできるかを定義できます。
この節では、WSRP を使用する WebLogic Porta アプリケーションをセキュリティで保護するためのベスト プラクティスについて説明します。WSRP セキュリティの詳細については、『連合ポータル ガイド』を参照してください。
この節では、コンテンツ管理システムをセキュリティで保護するためのヒントを説明します。
UUP (統合ユーザ プロファイル) には、ユーザ固有の情報を格納することができます。UUP および WebLogic Portal の詳細については、『ユーザの対話管理ガイド』の「UUP のコンフィグレーション」章を参照してください。
ポータル システムをさらに保護するために、アプリケーション スコープのリソースをコンフィグレーションします。これを行うには、ポータル アプリケーションに JDBC プールの定義を作成して、weblogic-application.xml コンフィグレーション ファイルからそれを参照する必要があります。JDBC プールに加えて、すべての JMS リソースにも同じ方法でアプリケーション スコープを設定できます。
詳細については、「JDBC アプリケーション モジュールのデプロイメントのコンフィグーション」および「JMS アプリケーション モジュールのデプロイメントのコンフィグレーション」を参照してください。
この節では、ユーザが GroupSpace 内から新しい GroupSpaces を作成しないようにする方法について説明します。メンバーが GroupSpace 内から新しい GroupSpace を作成できるかどうかは、コミュニティ ロール (管理者が指定したコミュニティの機能) によって管理されます。コミュニティ ロールと機能の詳細については、『コミュニティ ガイド』を参照してください。
communities-config.xml ファイルで指定されているため、次の種類のメンバーは、別の GroupSpace 内から新しい GroupSpace を作成すために管理ツールにアクセスできます。
<capability>
<name>manager</name>
<display-name>Manager</display-name>
<admin>true</admin>
</capability>
<capability>
<name>memberuser</name>
<display-name>Member User</display-name>
</capability>
コード リスト 3-1 のコードを使用して、すべてのメンバーの管理機能をチェックすることができます。
CommunityContext cc = CommunityContext.getCommunityContext(request);
CommunityUserContext userContext = communityContext.getCommunityUserContext();
CommunityMember thisMember = userContext.getMember();
CommunityMembership membership = userContext.getMembership(thisMember.getId(), cc.getCommunity().getCommunityDefinitionId());
if(membership.hasAdminCapability())
{
...
}
この節では、WebDAV Web アプリケーションをセキュリティで保護する方法について説明します。WebDAV は、WebLogic Portal アプリケーションと共に自動的にデプロイされます。
コード リスト 3-2 には、web.xml にある WebDAV Web アプリケーション WAR ファイル <WLPORTAL_HOME>\content-mgmt\lib\j2ee-modules\webdav-web-lib.war 用のデフォルトのセキュリティ制約スタンザを示します。WebDAV のデフォルトのセキュリティ設定を変更するには、デフォルトの <auth-constraint> 要素の <role-name> 属性を変更して特定の管理ロールのメンバーのみが WebDAV Web アプリケーションへのアクセス権を持つようにすることができます。
| ヒント : | web.xml 設定のデフォルトのセキュリティ制約を変更するには、デプロイメント計画を使用することをお勧めします。デプロイメント計画の使用の詳細については、『プロダクション業務ガイド』を参照してください。 |
<security-constraint id="securityconstraint">
<web-resource-collection>
<web-resource-name>webdav</web-resource-name>
<description>Security constraint for webdav</description>
<url-pattern>/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>AllAuthenticatedUsers</role-name>
</auth-constraint>
</security-constraint>
この節では、ログインとログアウトの機能をプログラミングにより実装するためのベスト プラクティスおよび技術について説明します。この節では、JSP ポートレットでログインとログアウトを処理するサンプル コードが含まれています。
ログインとログアウトの後に、リダイレクトすると、以下のような特定で深刻なセキュリティ問題が防止されます。
一般に使用されるポートレットのタイプのために推奨されるリダイレクト技術は以下のとおりです。
| 注意 : | JSP および Struts ポートレットでは、リダイレクトを実行するには HttpResponse.sendRedirect() を呼び出すのを防ぐ。常に、適切な WLP メカニズムを使用することがベスト プラクティスです。「ログインとログアウトのために JSP タグ使用の防止」も参照してください。 |
<auth:login> タグは、現在のセキュリティ レルムに対して (ユーザ名とパスワードの組み合わせの) 弱い認証を行い、認証されたユーザを現在の WebLogic ユーザとして設定します。<auth:logout> タグは現在のユーザの WebLogic Server セッションを終了します。
| 警告 : | これらのタグは表示の開始後に呼び出されたため、使用すると特定のセキュリティ問題を引き起こすことがあります。「ログインとログアウトの後に、必ずリダイレクト」で説明するように、ポートレットのライフサイクルの表示段階で、ポータルへのリダイレクトのベスト プラクティスを適用することは不可能です。ライフサイクルの handlePostbackData 段階ではリダイレクトを呼び出す必要があります。 |
これらのタグの詳細については、「JSP Tag Javadoc」を参照してください。
この節で説明されるサンプル コードは、JSP ポートレットにログインとログアウトを実行する方法を示しています。コード リスト 3-3 では、バッキング ファイルを一覧表示します。このバッキング ファイルは、ログインとログアウト操作を実行するために com.bea.p13n.security.Authentication ヘルパー クラスを使用しています。このコードは、ログインまたはログアウトした後、JspContentContext.sendRedirect() の呼び出しのベスト プラクティスを示しています。「ログインとログアウトの後に、必ずリダイレクト」も参照してください。
コード リスト 3-4 では、ユーザ名とパスワードをサーバに送信する JSP の例を示します。この JSP を使用するには、ポートレットを作成して、コード リスト 3-3 内のバッキング ファイルをポートレットに追加します。
| 注意 : | ポータル フレームワークはライフサイクルの handlePostbackData 段階でのみリダイレクトを実行します。したがって、コード リスト 3-3 に示すように、認証コードをバッキング ファイルの handlePostbackData() メソッドに配置されます。 |
package examples.login;
import com.bea.netuix.servlets.controls.content.JspContentContext;
import com.bea.netuix.servlets.controls.content.backing.AbstractJspBacking;
import com.bea.p13n.security.Authentication;
import com.bea.portlet.GenericURL;
import com.bea.portlet.PostbackURL;
import javax.security.auth.login.LoginException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class LoginBacking extends AbstractJspBacking {
private static final long serialVersionUID = 1L;
public static final String REDIRECT_ACTION = "redirect";
public boolean handlePostbackData(HttpServletRequest request, HttpServletResponse response) {
if (isRequestTargeted(request)) {
if (request.getParameter(GenericURL.STATE_PARAM) == null) {
String username = request.getParameter("username");
String password = request.getParameter("password");
PostbackURL url = PostbackURL.createPostbackURL(request, response);
if (username != null && password != null) {
try {
Authentication.login(username, password, request, response);
}
catch (LoginException le) {
request.setAttribute("loginErrorMessage3", new String("true"));
return false;
}
}
else if (request.getParameter("logout") != null) {
Authentication.logout(request);
}
url.addParameter(GenericURL.LOADSTATE_PARAM, "false");
url.addParameter(GenericURL.PAGE_LABEL_PARAM, "login");
try {
JspContentContext jspContext = JspContentContext.getJspContentContext(request);
jspContext.sendRedirect(url.toString());
}
catch (Exception ie) {
ie.printStackTrace();
}
}
}
return true;
}
}
<%@ page import="com.bea.portlet.WindowURL" %>
<h3 align="center">WebLogic Portal Login/Logout</h3>
<%
WindowURL url = WindowURL.createWindowURL(request, response);
if (request.getUserPrincipal() == null)
{
String errorMessage = (String) request.getAttribute("loginErrorMessage3");
%>
<form method="post" id="backingFileLoginForm" action="<%=url.toString()%>" type="POST">
<table border="0" width="100%">
<tr>
<td align="center" colspan="2">
<% if (errorMessage != null) { %>
<font color="red">Login failed. Please try again.</font><br>
<% } %>
Please enter your username and password below.<br>
</td>
</tr>
<tr>
<td align="right">
Username:
</td>
<td align="left">
<input type="text" size=15 name="username" >
</td>
</tr>
<tr>
<td align="right">
Password:
</td>
<td align="left">
<input type="password" size=15 name="password" >
</td>
</tr>
<tr>
<td colspan="2" align="center">
<input type="submit" value="Login">
</td>
</tr>
</table>
</form>
<%
}
else
{
%>
<form method="post" id="backingFileLoginForm" action="<%=url.toString()%>" type="POST">
<table border="0" width="100%">
<tr>
<td align="center">
<b><%=request.getUserPrincipal().getName()%></b>, Welcome to WebLogic Portal!
</td>
</tr>
<tr>
<td align="center">
<input type="hidden" name="logout" value="1">
<input type="submit" value="Logout">
</td>
</tr>
</table>
</form>
<%
}
%>
|