セキュリティ ガイド

     前  次    目次     
ここから内容

ポータル デプロイメントのセキュリティ

この章では、ポータル デプロイメントのセキュリティについてのベスト プラクティス、ヒント、および技法を説明します。このガイドの他の章は、資格の追加、セキュリティ プロバイダの管理、委託された管理の設定による、ポータル リソースへのアクセスのセキュリティについて説明していますが、この章では、プロダクション環境のポータルをセキュリティで保護するための追加の手順について説明します。これには、ファイアウォールの使用、データベース接続のセキュリティ、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 サーバ、ブラウザ、およびファイアウォール」を参照してください。

 


WebLogic Portal Administration Console のセキュリティ

最も簡単な対策の 1 つは、WebLogic Portal Administration Console をセキュリティで保護することです。

表 3-1 Administration Console のセキュリティ
セキュリティ アクション
説明
デフォルトのユーザ名とパスワードを変更する。
ポータル管理には、WebLogic Server の管理用ユーザ名とパスワードとは別のユーザ名とパスワードを使用することを推奨。
プロダクション環境にデプロイしない。
Administration Console をプロダクション環境に公式にデプロイする理由がなければ、アンデプロイするか、またはファイアウォールの後方に保護する。
認可されたアクセスを特定のネットワーク内からのみに制限するには、WebLogic 仮想ホストとネットワーク チャネルを使用する。
HTTPS と内部のネットワーク IP アドレスのみでリスンできるように、ネットワーク チャネルをコンフィグレーションする。ネットワーク チャネルを使用するように仮想ホストをコンフィグレーションする。内部のネットワーク IP アドレスにアクセスできるユーザにのみ見えるように、Administration Console を仮想ホストのみを対象とするように設定する。
WebLogic Server ドキュメントの「仮想ホスト」および「カスタム ネットワーク チャネルのコンフィグレーション」を参照。

 


データベース通信のセキュリティ

極端な場合、データベース通信をセキュリティで保護すると有効な場合があります。すべてのドライバがこのようなメカニズムをサポートしているわけではありませんが、多くのプロバイダがデータベースに暗号化された通信を提供しています。このように特別の暗号化を行うと、パフォーマンス上で重い負荷となりますが、セキュリティにきわめて関心の高いお客様にとっては選択肢の 1 つとなります。

 


ポリシーおよび訪問者の資格の確認

ポータルをプロダクション環境へデプロイする前に、委託管理および訪問者の資格のポリシーを確認することは重要です。委託管理は、ロールの階層構造内で WebLogic Portal Administration Console の特権を伝達するメカニズムです。訪問者の資格を使用すると、ポータル アプリケーション内のリソースにどのユーザがアクセスできるか、それらのリソースに対してユーザが何をできるかを定義できます。

表 3-2 ポリシーおよび訪問者の資格の確認
セキュリティ アクション
説明
委託管理ポリシーを確認する。
委託管理のポリシーが希望どおりの方法にコンフィグレーションされていることを確認する。デフォルトのグループを変更することを推奨。詳細については、「委託管理のコンフィグレーション」を参照。
訪問者の資格を確認する。
ライブラリに含まれる各ポートレットに必ず資格を定義する。資格は複雑な項目なので、ポータルをデプロイする前にドキュメントを読んでコンフィグレーションを理解することが重要となる。詳細については、「訪問者の資格のコンフィグレーション」を参照。

 


WSRP アプリケーションのセキュリティ

この節では、WSRP を使用する WebLogic Porta アプリケーションをセキュリティで保護するためのベスト プラクティスについて説明します。WSRP セキュリティの詳細については、『連合ポータル ガイド』を参照してください。

表 3-3 WSRP アプリケーションのセキュリティ
セキュリティ アクション
説明
プロデューサ アプリケーションについては、WSDL パスと WSDL ポートに対応するすべてのパスを保護する。
プロデューサの WSDL は、HTTPS (SSL) サービスのエントリ ポイントについてのみポートを宣言する必要がある。WSDL の詳細については、『連合ポータル ガイド』の章の「連合ポータルのアーキテクチャ」を参照。
常にセキュリティ トークンを要求するようにプロデューサとコンシューマをコンフィグレーションする。
デフォルトでは、トークンはユーザが認証されたときにのみ送信される。詳細については、『連合ポータル ガイド』の「SAML による WSRP セキュリティの確立」章を参照。
コンシューマをログアウトするとき、常に次の手順に従う。
  • セッションを終了する。
  • destroySessions のサポートを有効にする。
これらの手順によって、すべてのプロデューサ セッションも終了する。
ポートレット、ブック、およびページを選択的にリモートとして提供する。
デフォルトでは、WebLogic Portal プロデューサ アプリケーションにデプロイされているすべてのポートレットを、コンシューマはリモート ポートレットとして使用できます。ただし、Workshop for WebLogic のポートレットの [プロパティ] ビューで [リモートとして提供] プロパティを設定することにより、コンシューマが実際に使用できるポートレットを指定できる。同じアクションをリモートで使用可能なブックとページに適用する。詳細については、『連合ポータル ガイド』の「コンシューマに対するブック、ページ、およびポートレットの提供」章を参照。
コンシューマの資格を使用する。
コンシューマの資格によって、プロデューサはコンシューマに提供するポートレットを登録プロパティに基づいて判断できます。詳細については、『連合ポータル ガイド』の「コンシューマの資格」章を参照。
ポートレット、ブック、またはページを UDDI レジストリに公開するときに、ユーザ名とパスワードではなく資格エリアスを使用する。
UDDI レジストリの公開に関する詳細については、『連合ポータル ガイド』での「UDDI レジストリへの公開」章を参照。
User Name Token (UNT) を使用しない。どうしても必要な場合、パスワード ダイジェストを有効にして UNT を使用する。
Username Token、すなわち UNT は、SAML に代わる方法として、SAML が提供するのと同じ基本のシングル サインオン機能を提供する。Username Token を使用すると、コンシューマのローカル ユーザをプロデューサのユーザへマッピングできる。詳細については、『連合ポータル ガイド』の「Username Token セキュリティのコンフィグレーション」章を参照。
SAML を使用するときには署名を要求する。
プロデューサでアサーティング パーティのプロパティをコンフィグレーションする場合、[Signatures Required] プロパティを有効にする。このアクションでは、すべてのアサーションが署名されている必要がある。詳細については、『連合ポータル ガイド』での「SAML による WSRP セキュリティの確立」章を参照。
キーストアを慎重に管理する。
キーストアで独自のキーを生成し、キーストアからデフォルト キーを削除する。詳細については、『連合ポータル ガイド』での「SAML による WSRP セキュリティの確立」章を参照。
WSRP SOAP モニタを無効にする。
Workshop for WebLogic と共にインストールされるメッセージ モニタ サーブレットを使用することにより、プロデューサとコンシューマの間のアクティビティをモニタすることができる。モニタの詳細については、『連合ポータル ガイド』での「その他のトピックおよびベスト プラクティス」章を参照。
カスタムのリソース接続フィルタを使用して有効な既知のリソースのみを取得する。
デフォルトでは、保護されていないリソースは既知のプロデューサ サーバから取得できる。詳細については、WebLogic Server の「接続フィルタの使用」節を参照。

 


非 HTTP プロトコルのブロッキング

すべての非 HTTP プロトコルがブロックされるように、サーバにファイアウォールを使用します。これには JNDI、EJB、RMI、T3 のようなプロトコルが含まれます。

 


コンテンツ管理システムのセキュリティ

この節では、コンテンツ管理システムをセキュリティで保護するためのヒントを説明します。

表 3-4 コンテンツ管理システムのセキュリティ
セキュリティ アクション
説明
機密データが含まれる可能性のあるすべてのコンテンツ ノード上に資格を配置する。
コンテンツ ノードの資格の詳細については、「コンテンツ管理リソースに関する訪問者の資格の設定」を参照。
コンテンツ管理リソースの委託管理ポリシーを確認する。
コンテンツ管理リソースの委託管理のポリシーが希望どおりにコンフィグレーションされていることを確認する。詳細については、「コンテンツ管理リソースへの委託管理の設定」を参照。
WebDAV API を保護する。

 


UUP データのセキュリティ

UUP (統合ユーザ プロファイル) には、ユーザ固有の情報を格納することができます。UUP および WebLogic Portal の詳細については、『ユーザの対話管理ガイド』の「UUP のコンフィグレーション」章を参照してください。

表 3-5 UUP データのセキュリティ
セキュリティ アクション
説明
UUP データとして格納される機密情報を暗号化する。
クレジット カード番号のような機密情報を UUP データとして格納する場合、そのデータの暗号化対策を取る。一般的には次のようなものになる。
ヒント : パスワードまたは機密情報 (クレジット カードなど) は決してクリア テキストに格納しない。
機密ユーザ プロファイル情報を、デフォルトプロファイル ストアに格納しない。代わりに UUP を使用する。
UUP を使用すると、データをネットワーク スタックのより後方に格納できる。保護されたリポジトリに既に存在する機密顧客データは、カスタム UUP 実装を使用して、必要な場合にのみアクセスすることができる。
UUP アクセス メソッドを保護する。
UUP アクセス メソッドは、ejb-jar.xml の EJB メソッド保護宣言を通じて保護されるロールにすることもできる。

 


アプリケーション スコープのリソース

ポータル システムをさらに保護するために、アプリケーション スコープのリソースをコンフィグレーションします。これを行うには、ポータル アプリケーションに JDBC プールの定義を作成して、weblogic-application.xml コンフィグレーション ファイルからそれを参照する必要があります。JDBC プールに加えて、すべての JMS リソースにも同じ方法でアプリケーション スコープを設定できます。

詳細については、「JDBC アプリケーション モジュールのデプロイメントのコンフィグーション」および「JMS アプリケーション モジュールのデプロイメントのコンフィグレーション」を参照してください。

 


GroupSpace アプリケーションのセキュリティ

この節では、ユーザが 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 のコードを使用して、すべてのメンバーの管理機能をチェックすることができます。

コード リスト 3-1 GroupSpace メンバーの管理機能のチェック
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 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 設定のデフォルトのセキュリティ制約を変更するには、デプロイメント計画を使用することをお勧めします。デプロイメント計画の使用の詳細については、『プロダクション業務ガイド』を参照してください。
コード リスト 3-2 web.xml での WebDAV コンフィグレーション
     <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 タグ使用の防止

<auth:login> タグは、現在のセキュリティ レルムに対して (ユーザ名とパスワードの組み合わせの) 弱い認証を行い、認証されたユーザを現在の WebLogic ユーザとして設定します。<auth:logout> タグは現在のユーザの WebLogic Server セッションを終了します。

警告 : これらのタグは表示の開始後に呼び出されたため、使用すると特定のセキュリティ問題を引き起こすことがあります。「ログインとログアウトの後に、必ずリダイレクト」で説明するように、ポートレットのライフサイクルの表示段階で、ポータルへのリダイレクトのベスト プラクティスを適用することは不可能です。ライフサイクルの handlePostbackData 段階ではリダイレクトを呼び出す必要があります。

これらのタグの詳細については、「JSP Tag Javadoc」を参照してください。

JSP のログインとログアウトコードの例

この節で説明されるサンプル コードは、JSP ポートレットにログインとログアウトを実行する方法を示しています。コード リスト 3-3 では、バッキング ファイルを一覧表示します。このバッキング ファイルは、ログインとログアウト操作を実行するために com.bea.p13n.security.Authentication ヘルパー クラスを使用しています。このコードは、ログインまたはログアウトした後、JspContentContext.sendRedirect() の呼び出しのベスト プラクティスを示しています。「ログインとログアウトの後に、必ずリダイレクト」も参照してください。

コード リスト 3-4 では、ユーザ名とパスワードをサーバに送信する JSP の例を示します。この JSP を使用するには、ポートレットを作成して、コード リスト 3-3 内のバッキング ファイルをポートレットに追加します。

注意 : ポータル フレームワークはライフサイクルの handlePostbackData 段階でのみリダイレクトを実行します。したがって、コード リスト 3-3 に示すように、認証コードをバッキング ファイルの handlePostbackData() メソッドに配置されます。
コード リスト 3-3 認証を実行するバッキング ファイル
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;
   }
}
コード リスト 3-4 JSP ログインの例
<%@ 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>
<%
}
%>

  ページの先頭       前  次