[SOA, Security] Single Sign-On with Security Assertion Markup Language between Oracle and SAP

原文はこちら。
http://www.oracle.com/technetwork/articles/soa/fernandes-sso-saml-1965440.html

Security Assertion Markup Language (SAML)を実装し、Oracle Service Bus (OSB)のOracle Web Services Manager (OWSM)からSAP Enterprise Central Component (ECC)にIDを伝播する方法をご紹介します。

Enterprise Resource Planning (ERP)アプリケーションを使ってデータやプロセスにアクセスし、更新している場合、ユーザーのアクティビティ追跡は重要なことです。機密データ(例えば会計や売上の数値)をWebサービスで公開するため、様々なシステム間でユーザーIDを伝播させることが可能なセキュアな環境を提供する必要があります。
この記事では、Security Assertion Markup Language (SAML)を実装して、Oracle Service Bus (OSB)と組み合わせて構成されているOracle Web Services Manager (OWSM)からWebサービスを使ってSAP Enterprise Central Component(ECC)へIDを伝播する方法、必要な構成、Oracle環境の例をご紹介します。

シナリオ

このソリューションはOracle Web Services ManagerとOracle Service Bus 11g (11.1.1.6)、SAP ECC 6.06 SP2の環境で実施したものです。各々のシステムが様々な場所でユーザーを認証します。以前はSAP ERPはR/3として知られていました。
このシナリオでは、(アイデンティティプロバイダーとしての)Oracle Services Busが、(サービスプロバイダーとしての)SAP ECCが発行したSAML 1.1のsender-vouchesを使ってWebサービスにアクセスします。SAML 2.0ではなくSAML 1.1を使っているのは、お客様がアーキテクチャの変更を検討しているためです。
1964573.gif
Figure 1: Oracle Service Bus / ECC environment
ユーザーは自分の資格情報を使用してプロキシサービスにアクセスします。Oracle Service Busは認証し、フローを実行して、ビジネス·サービスを呼び出します。
ビジネス·サービスに適用されるOracle Web Services Managerのポリシーは、SAMLアサーションの生成が必要です。 Oracle Web Services Managerは、アサーションを含むセキュリティ情報を持つメッセージを生成し、署名されたメッセージ本体と共に、ECCを呼び出します。
ECCがSAMLアサーションとセキュリティ情報を検証し、メッセージが検証された場合は、ユーザストア内にユーザーが存在することを確認し、ECCは、Oracle Service Busにレスポンスを返します。
ECCで公開されたサービスは引数としてテキストを一つだけ受け取り、この同じパラメータとユーザー名(SAMLを使用して認証)を連結したものを返します。簡単なテストですが、プラットフォーム間でIDの伝播を確認するには十分です。

構成

WebLogic Server

Oracle WebLogic Serverの組み込みLDAPにユーザーを作成します(例: testsamlclient)。今回のテストでは、このユーザーはプロキシサービスでクライアントを認証します。この同じユーザーもしくは同等のユーザーがECCに存在する必要があります。

Oracle Web Services Manager

Oracle Web Services Managerが使うキーストアを構成し、通信に使う証明書をインポートします(Oracle Web Services Managerの秘密鍵、ECCの公開鍵、CA)。 このシナリオではお客様が生成した証明書を使うため、Enterprise CAが証明書発行者です。

Enterprise Manager Fusion Middleware Controlにアクセスします。
http://<host>:<port>/em
キーストアの設定画面で、キーストアと証明書を構成します。今回は、署名鍵でSAML AssertionとSOAPリクエストの本体に署名します。
<ファーム名>/Weblogicドメイン/<ドメイン名> を開き、[WebLogicドメイン] > [セキュリティ] > [セキュリティプロバイダの構成]へと移動し、 [キーストアの構成]に到達します。
Figure 2: Oracle Web Services Manager Keystore Configuration
サーバーを再起動します。
Enterprise Manager Fusion Middleware Controlに再度アクセスし、新しいセキュリティポリシーを構成します。
<ファーム名>/Weblogicドメイン/<ドメイン名> を開き、[WebLogicドメイン] > [Webサービス] > [ポリシー]へと移動します。
Webサービス・ポリシーの画面で、サービス・クライアントに的ようするポリシーを検索します。
[oracle/wss10_saml_token_with_message_integrity_client_policy]を選択し、[類似作成]をクリックします。
Figure 3: Creating a web service policy
ポリシーの名前を変更します(例:oracle/wss10_saml_token_with_message_integrity_client_policy_sap
Figure 4: Rename the policy
Because ECC SAML Webサービスは署名付きのタイムスタンプを必要とするため、[設定]タブの[タイムスタンプを含める]にチェックを入れておきます。
Figure 5: Include timestamp
それによって、Oracle Web Services Managerは署名付きのタイムスタンプをリクエストに追加し、署名済みのタイムスタンプがレスポンスにあることを期待します。しかしECCは、ECCは署名されていないタイムスタンプをレスポンスに含めて送信してくるため、Oracle Service Busでエラーが発生します。
oracle.wsm.security.policy.scenario.policycompliance.PolicyComplianceException: WSM-00036 : 
The signed message elements or parts do not comply with the policy. The following 
headers/elements () or attachments () must be signed:-
< http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd: Timestamp >
この問題を解決するため、[構成]タブに移動して、ignore.timestamp.in.responseというプロパティを追加し、その値としてtrueを設定します。この構成により、Oracle Web Services Managerはレスポンス中のタイムスタンプを検証しなくなります。
Figure 6: Add a property
saml.issuer.nameのフィールドはSAML Assertionの発行者を定義します(デフォルトではwww.oracle.comになっています)。この値を変更することができますが、Oracle Service Busから到着するSAML Assertionを受け付けるよう、SAP ECCで発行者が構成されている必要があります。
csf-keyプロパティはデフォルトでbasic.credentialsを使うよう定義されています。<FARM>/Weblogicドメイン/<ドメイン名>をクリックし、メニューから WebLogicドメイン] > [セキュリティ]> [資格証明]へと移動し、testsamlclientユーザーを通知するbasic.credentialsという名前を持つ新しいキーをoracle.wsm.security下に作成します。
Figure 7: Create Key
必要に応じて、新しい資格証明キーを定義したり、csf-keyプロパティの値を変更したりできます。

実装

Oracle Enterprise Pack for Eclipse (OEPE) を開き、ビジネスサービスをECCのWSDLから生成し、名前を付けます(例:TestSamlClient)。

以下はECCのWSDLのサンプルです。
<?xml version="1.0" encoding="utf-8"?>
<wsdl:definitions targetNamespace="urn:sap-com:document:sap:soap:functions:mc-style"
                  xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
                  xmlns:xsd="http://www.w3.org/2001/XMLSchema"
                  xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
                  xmlns:wsoap12="http://schemas.xmlsoap.org/wsdl/soap12/"
                  xmlns:http="http://schemas.xmlsoap.org/wsdl/http/"
                  xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/"
                  xmlns:tns="urn:sap-com:document:sap:soap:functions:mc-style"
                  xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy"
                  xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"
                  xmlns:n1="urn:sap-com:document:sap:rfc:functions">
  <wsdl:documentation>
    <sidl:sidl xmlns:sidl="http://www.sap.com/2007/03/sidl"/>
  </wsdl:documentation>
  <wsp:UsingPolicy wsdl:required="true"/>
  <wsp:Policy wsu:Id="BN_BN_YS_SAMLTEST">
    <saptrnbnd:OptimizedXMLTransfer uri="http://xml.sap.com/2006/11/esi/esp/binxml"
                                    xmlns:saptrnbnd="http://www.sap.com/webas/710/soap/features/transportbinding/"
                                    wsp:Optional="true"/>
    <saptrnbnd:OptimizedMimeSerialization xmlns:saptrnbnd="http://schemas.xmlsoap.org/ws/2004/09/policy/optimizedmimeserialization"
                                          wsp:Optional="true"/>
    <wsp:ExactlyOne xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy">
      <wsp:All>
        <sp:AsymmetricBinding xmlns:sp="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702"
                              xmlns:sapsp="http://www.sap.com/webas/630/soap/features/security/policy"
                              xmlns:wsa="http://www.w3.org/2005/08/addressing"
                              xmlns:wst="http://docs.oasis-open.org/ws-sx/ws-trust/200512"
                              xmlns:wsu="http://schemas.xmlsoap.org/ws/2002/07/utility"
                              xmlns:wsx="http://schemas.xmlsoap.org/ws/2004/09/mex">
          <wsp:Policy>
            <sp:InitiatorSignatureToken>
              <wsp:Policy>
                <sp:X509Token sp:IncludeToken="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702/IncludeToken/AlwaysToRecipient">
                  <wsp:Policy>
                    <sp:WssX509V3Token10/>
                  </wsp:Policy>
                </sp:X509Token>
              </wsp:Policy>
            </sp:InitiatorSignatureToken>
            <sp:AlgorithmSuite>
              <wsp:Policy>
                <sp:Basic128Rsa15/>
              </wsp:Policy>
            </sp:AlgorithmSuite>
            <sp:Layout>
              <wsp:Policy>
                <sp:Strict/>
              </wsp:Policy>
            </sp:Layout>
            <sp:IncludeTimestamp/>
            <sp:OnlySignEntireHeadersAndBody/>
          </wsp:Policy>
        </sp:AsymmetricBinding>
        <sp:Wss10 xmlns:sp="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702"
                  xmlns:sapsp="http://www.sap.com/webas/630/soap/features/security/policy"
                  xmlns:wsa="http://www.w3.org/2005/08/addressing"
                  xmlns:wst="http://docs.oasis-open.org/ws-sx/ws-trust/200512"
                  xmlns:wsu="http://schemas.xmlsoap.org/ws/2002/07/utility"
                  xmlns:wsx="http://schemas.xmlsoap.org/ws/2004/09/mex">
          <wsp:Policy>
            <sp:MustSupportRefKeyIdentifier/>
            <sp:MustSupportRefIssuerSerial/>
          </wsp:Policy>
        </sp:Wss10>
        <sp:SignedParts xmlns:sp="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702"
                        xmlns:sapsp="http://www.sap.com/webas/630/soap/features/security/policy"
                        xmlns:wsa="http://www.w3.org/2005/08/addressing"
                        xmlns:wst="http://docs.oasis-open.org/ws-sx/ws-trust/200512"
                        xmlns:wsu="http://schemas.xmlsoap.org/ws/2002/07/utility"
                        xmlns:wsx="http://schemas.xmlsoap.org/ws/2004/09/mex">
          <sp:Body/>
          <sp:Header Name="Trace"
                     Namespace="http://www.sap.com/webas/630/soap/features/runtime/tracing/"/>
          <sp:Header Name="messageId"
                     Namespace="http://www.sap.com/webas/640/soap/features/messageId/"/>
          <sp:Header Name="CallerInformation"
                     Namespace="http://www.sap.com/webas/712/soap/features/runtime/metering/"/>
          <sp:Header Name="Session"
                     Namespace="http://www.sap.com/webas/630/soap/features/session/"/>
          <sp:Header Name="To"
                     Namespace="http://schemas.xmlsoap.org/ws/2004/08/addressing"/>
          <sp:Header Name="From"
                     Namespace="http://schemas.xmlsoap.org/ws/2004/08/addressing"/>
          <sp:Header Name="FaultTo"
                     Namespace="http://schemas.xmlsoap.org/ws/2004/08/addressing"/>
          <sp:Header Name="ReplyTo"
                     Namespace="http://schemas.xmlsoap.org/ws/2004/08/addressing"/>
          <sp:Header Name="MessageID"
                     Namespace="http://schemas.xmlsoap.org/ws/2004/08/addressing"/>
          <sp:Header Name="RelatesTo"
                     Namespace="http://schemas.xmlsoap.org/ws/2004/08/addressing"/>
          <sp:Header Name="Action"
                     Namespace="http://schemas.xmlsoap.org/ws/2004/08/addressing"/>
          <sp:Header Name="To"
                     Namespace="http://www.w3.org/2005/08/addressing"/>
          <sp:Header Name="From"
                     Namespace="http://www.w3.org/2005/08/addressing"/>
          <sp:Header Name="FaultTo"
                     Namespace="http://www.w3.org/2005/08/addressing"/>
          <sp:Header Name="ReplyTo"
                     Namespace="http://www.w3.org/2005/08/addressing"/>
          <sp:Header Name="MessageID"
                     Namespace="http://www.w3.org/2005/08/addressing"/>
          <sp:Header Name="RelatesTo"
                     Namespace="http://www.w3.org/2005/08/addressing"/>
          <sp:Header Name="Action"
                     Namespace="http://www.w3.org/2005/08/addressing"/>
          <sp:Header Name="ReferenceParameters"
                     Namespace="http://www.w3.org/2005/08/addressing"/>
          <sp:Header Name="Sequence"
                     Namespace="http://schemas.xmlsoap.org/ws/2005/02/rm"/>
          <sp:Header Name="SequenceAcknowledgement"
                     Namespace="http://schemas.xmlsoap.org/ws/2005/02/rm"/>
          <sp:Header Name="AckRequested"
                     Namespace="http://schemas.xmlsoap.org/ws/2005/02/rm"/>
          <sp:Header Name="SequenceFault"
                     Namespace="http://schemas.xmlsoap.org/ws/2005/02/rm"/>
          <sp:Header Name="Sequence"
                     Namespace="http://docs.oasis-open.org/ws-rx/wsrm/200702"/>
          <sp:Header Name="AckRequested"
                     Namespace="http://docs.oasis-open.org/ws-rx/wsrm/200702"/>
          <sp:Header Name="SequenceAcknowledgement"
                     Namespace="http://docs.oasis-open.org/ws-rx/wsrm/200702"/>
          <sp:Header Name="SequenceFault"
                     Namespace="http://docs.oasis-open.org/ws-rx/wsrm/200702"/>
          <sp:Header Name="UsesSequenceSTR"
                     Namespace="http://docs.oasis-open.org/ws-rx/wsrm/200702"/>
          <sp:Header Name="UsesSequenceSSL"
                     Namespace="http://docs.oasis-open.org/ws-rx/wsrm/200702"/>
        </sp:SignedParts>
        <sp:SignedSupportingTokens xmlns:sp="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702"
                                   xmlns:sapsp="http://www.sap.com/webas/630/soap/features/security/policy"
                                   xmlns:wsa="http://www.w3.org/2005/08/addressing"
                                   xmlns:wst="http://docs.oasis-open.org/ws-sx/ws-trust/200512"
                                   xmlns:wsu="http://schemas.xmlsoap.org/ws/2002/07/utility"
                                   xmlns:wsx="http://schemas.xmlsoap.org/ws/2004/09/mex">
          <wsp:Policy>
            <sp:SamlToken sp:IncludeToken="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702/IncludeToken/AlwaysToRecipient">
              <wsp:Policy>
                <sp:WssSamlV11Token10/>
              </wsp:Policy>
            </sp:SamlToken>
          </wsp:Policy>
        </sp:SignedSupportingTokens>
      </wsp:All>
    </wsp:ExactlyOne>
    <wsaw:UsingAddressing xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl"
                          wsp:Optional="true"/>
  </wsp:Policy>
  <wsp:Policy wsu:Id="BN_BN_YS_SAMLTEST_SOAP12">
    <saptrnbnd:OptimizedXMLTransfer uri="http://xml.sap.com/2006/11/esi/esp/binxml"
                                    xmlns:saptrnbnd="http://www.sap.com/webas/710/soap/features/transportbinding/"
                                    wsp:Optional="true"/>
    <saptrnbnd:OptimizedMimeSerialization xmlns:saptrnbnd="http://schemas.xmlsoap.org/ws/2004/09/policy/optimizedmimeserialization"
                                          wsp:Optional="true"/>
    <wsp:ExactlyOne xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy">
      <wsp:All>
        <sp:AsymmetricBinding xmlns:sp="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702"
                              xmlns:sapsp="http://www.sap.com/webas/630/soap/features/security/policy"
                              xmlns:wsa="http://www.w3.org/2005/08/addressing"
                              xmlns:wst="http://docs.oasis-open.org/ws-sx/ws-trust/200512"
                              xmlns:wsu="http://schemas.xmlsoap.org/ws/2002/07/utility"
                              xmlns:wsx="http://schemas.xmlsoap.org/ws/2004/09/mex">
          <wsp:Policy>
            <sp:InitiatorSignatureToken>
              <wsp:Policy>
                <sp:X509Token sp:IncludeToken="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702/IncludeToken/AlwaysToRecipient">
                  <wsp:Policy>
                    <sp:WssX509V3Token10/>
                  </wsp:Policy>
                </sp:X509Token>
              </wsp:Policy>
            </sp:InitiatorSignatureToken>
            <sp:AlgorithmSuite>
              <wsp:Policy>
                <sp:Basic128Rsa15/>
              </wsp:Policy>
            </sp:AlgorithmSuite>
            <sp:Layout>
              <wsp:Policy>
                <sp:Strict/>
              </wsp:Policy>
            </sp:Layout>
            <sp:IncludeTimestamp/>
            <sp:OnlySignEntireHeadersAndBody/>
          </wsp:Policy>
        </sp:AsymmetricBinding>
        <sp:Wss10 xmlns:sp="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702"
                  xmlns:sapsp="http://www.sap.com/webas/630/soap/features/security/policy"
                  xmlns:wst="http://docs.oasis-open.org/ws-sx/ws-trust/200512"
                  xmlns:wsu="http://schemas.xmlsoap.org/ws/2002/07/utility"
                  xmlns:wsx="http://schemas.xmlsoap.org/ws/2004/09/mex">
          <wsp:Policy>
            <sp:MustSupportRefKeyIdentifier/>
            <sp:MustSupportRefIssuerSerial/>
          </wsp:Policy>
        </sp:Wss10>
        <sp:SignedParts xmlns:sp="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702"
                        xmlns:sapsp="http://www.sap.com/webas/630/soap/features/security/policy"
                        xmlns:wsa="http://www.w3.org/2005/08/addressing"
                        xmlns:wst="http://docs.oasis-open.org/ws-sx/ws-trust/200512"
                        xmlns:wsu="http://schemas.xmlsoap.org/ws/2002/07/utility"
                        xmlns:wsx="http://schemas.xmlsoap.org/ws/2004/09/mex">
          <sp:Body/>
          <sp:Header Name="Trace"
                     Namespace="http://www.sap.com/webas/630/soap/features/runtime/tracing/"/>
          <sp:Header Name="messageId"
                     Namespace="http://www.sap.com/webas/640/soap/features/messageId/"/>
          <sp:Header Name="CallerInformation"
                     Namespace="http://www.sap.com/webas/712/soap/features/runtime/metering/"/>
          <sp:Header Name="Session"
                     Namespace="http://www.sap.com/webas/630/soap/features/session/"/>
          <sp:Header Name="To"
                     Namespace="http://schemas.xmlsoap.org/ws/2004/08/addressing"/>
          <sp:Header Name="From"
                     Namespace="http://schemas.xmlsoap.org/ws/2004/08/addressing"/>
          <sp:Header Name="FaultTo"
                     Namespace="http://schemas.xmlsoap.org/ws/2004/08/addressing"/>
          <sp:Header Name="ReplyTo"
                     Namespace="http://schemas.xmlsoap.org/ws/2004/08/addressing"/>
          <sp:Header Name="MessageID"
                     Namespace="http://schemas.xmlsoap.org/ws/2004/08/addressing"/>
          <sp:Header Name="RelatesTo"
                     Namespace="http://schemas.xmlsoap.org/ws/2004/08/addressing"/>
          <sp:Header Name="Action"
                     Namespace="http://schemas.xmlsoap.org/ws/2004/08/addressing"/>
          <sp:Header Name="To"
                     Namespace="http://www.w3.org/2005/08/addressing"/>
          <sp:Header Name="From"
                     Namespace="http://www.w3.org/2005/08/addressing"/>
          <sp:Header Name="FaultTo"
                     Namespace="http://www.w3.org/2005/08/addressing"/>
          <sp:Header Name="ReplyTo"
                     Namespace="http://www.w3.org/2005/08/addressing"/>
          <sp:Header Name="MessageID"
                     Namespace="http://www.w3.org/2005/08/addressing"/>
          <sp:Header Name="RelatesTo"
                     Namespace="http://www.w3.org/2005/08/addressing"/>
          <sp:Header Name="Action"
                     Namespace="http://www.w3.org/2005/08/addressing"/>
          <sp:Header Name="ReferenceParameters"
                     Namespace="http://www.w3.org/2005/08/addressing"/>
          <sp:Header Name="Sequence"
                     Namespace="http://schemas.xmlsoap.org/ws/2005/02/rm"/>
          <sp:Header Name="SequenceAcknowledgement"
                     Namespace="http://schemas.xmlsoap.org/ws/2005/02/rm"/>
          <sp:Header Name="AckRequested"
                     Namespace="http://schemas.xmlsoap.org/ws/2005/02/rm"/>
          <sp:Header Name="SequenceFault"
                     Namespace="http://schemas.xmlsoap.org/ws/2005/02/rm"/>
          <sp:Header Name="Sequence"
                     Namespace="http://docs.oasis-open.org/ws-rx/wsrm/200702"/>
          <sp:Header Name="AckRequested"
                     Namespace="http://docs.oasis-open.org/ws-rx/wsrm/200702"/>
          <sp:Header Name="SequenceAcknowledgement"
                     Namespace="http://docs.oasis-open.org/ws-rx/wsrm/200702"/>
          <sp:Header Name="SequenceFault"
                     Namespace="http://docs.oasis-open.org/ws-rx/wsrm/200702"/>
          <sp:Header Name="UsesSequenceSTR"
                     Namespace="http://docs.oasis-open.org/ws-rx/wsrm/200702"/>
          <sp:Header Name="UsesSequenceSSL"
                     Namespace="http://docs.oasis-open.org/ws-rx/wsrm/200702"/>
        </sp:SignedParts>
        <sp:SignedSupportingTokens xmlns:sp="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702"
                                   xmlns:sapsp="http://www.sap.com/webas/630/soap/features/security/policy"
                                   xmlns:wsa="http://www.w3.org/2005/08/addressing"
                                   xmlns:wst="http://docs.oasis-open.org/ws-sx/ws-trust/200512"
                                   xmlns:wsu="http://schemas.xmlsoap.org/ws/2002/07/utility"
                                   xmlns:wsx="http://schemas.xmlsoap.org/ws/2004/09/mex">
          <wsp:Policy>
            <sp:SamlToken sp:IncludeToken="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702/IncludeToken/AlwaysToRecipient">
              <wsp:Policy>
                <sp:WssSamlV11Token10/>
              </wsp:Policy>
            </sp:SamlToken>
          </wsp:Policy>
        </sp:SignedSupportingTokens>
      </wsp:All>
    </wsp:ExactlyOne>
    <wsaw:UsingAddressing xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl"
                          wsp:Optional="true"/>
  </wsp:Policy>
  <wsp:Policy wsu:Id="IF_IF_YS_SAMLTEST">
    <sapsession:Session xmlns:sapsession="http://www.sap.com/webas/630/soap/features/session/">
      <sapsession:enableSession>false</sapsession:enableSession>
    </sapsession:Session>
    <sapcentraladmin:CentralAdministration xmlns:sapcentraladmin="http://www.sap.com/webas/700/soap/features/CentralAdministration/"
                                           wsp:Optional="true">
      <sapcentraladmin:BusinessApplicationID>4FF6C4A0570F00E9E10000000A1D140F</sapcentraladmin:BusinessApplicationID>
    </sapcentraladmin:CentralAdministration>
  </wsp:Policy>
  <wsp:Policy wsu:Id="OP_IF_OP_YsSamltest">
    <sapcomhnd:enableCommit xmlns:sapcomhnd="http://www.sap.com/NW05/soap/features/commit/">false</sapcomhnd:enableCommit>
    <sapblock:enableBlocking xmlns:sapblock="http://www.sap.com/NW05/soap/features/blocking/">true</sapblock:enableBlocking>
    <saptrhnw05:required xmlns:saptrhnw05="http://www.sap.com/NW05/soap/features/transaction/">no</saptrhnw05:required>
    <saprmnw05:enableWSRM xmlns:saprmnw05="http://www.sap.com/NW05/soap/features/wsrm/">false</saprmnw05:enableWSRM>
  </wsp:Policy>
  <wsdl:types>
    <xsd:schema attributeFormDefault="qualified"
                targetNamespace="urn:sap-com:document:sap:rfc:functions">
      <xsd:simpleType name="char10">
        <xsd:restriction base="xsd:string">
          <xsd:maxLength value="10"/>
        </xsd:restriction>
      </xsd:simpleType>
      <xsd:simpleType name="char40">
        <xsd:restriction base="xsd:string">
          <xsd:maxLength value="40"/>
        </xsd:restriction>
      </xsd:simpleType>
    </xsd:schema>
    <xsd:schema attributeFormDefault="qualified"
                targetNamespace="urn:sap-com:document:sap:soap:functions:mc-style"
                xmlns:n0="urn:sap-com:document:sap:rfc:functions">
      <xsd:import namespace="urn:sap-com:document:sap:rfc:functions"/>
      <xsd:element name="YsSamltest">
        <xsd:complexType>
          <xsd:sequence>
            <xsd:element name="Text" type="n0:char10" minOccurs="0"/>
          </xsd:sequence>
        </xsd:complexType>
      </xsd:element>
      <xsd:element name="YsSamltestResponse">
        <xsd:complexType>
          <xsd:sequence>
            <xsd:element name="Result" type="n0:char40"/>
          </xsd:sequence>
        </xsd:complexType>
      </xsd:element>
    </xsd:schema>
  </wsdl:types>
  <wsdl:message name="YsSamltest">
    <wsdl:part name="parameters" element="tns:YsSamltest"/>
  </wsdl:message>
  <wsdl:message name="YsSamltestResponse">
    <wsdl:part name="parameter" element="tns:YsSamltestResponse"/>
  </wsdl:message>
  <wsdl:portType name="YS_SAMLTEST">
    <wsp:Policy>
      <wsp:PolicyReference URI="#IF_IF_YS_SAMLTEST"/>
    </wsp:Policy>
    <wsdl:operation name="YsSamltest">
      <wsp:Policy>
        <wsp:PolicyReference URI="#OP_IF_OP_YsSamltest"/>
      </wsp:Policy>
      <wsdl:input message="tns:YsSamltest"/>
      <wsdl:output message="tns:YsSamltestResponse"/>
    </wsdl:operation>
  </wsdl:portType>
  <wsdl:binding name="YS_SAMLTEST" type="tns:YS_SAMLTEST">
    <wsp:Policy>
      <wsp:PolicyReference URI="#BN_BN_YS_SAMLTEST"/>
    </wsp:Policy>
    <soap:binding transport="http://schemas.xmlsoap.org/soap/http"
                  style="document"/>
    <wsdl:operation name="YsSamltest">
      <soap:operation style="document"/>
      <wsdl:input>
        <soap:body use="literal"/>
      </wsdl:input>
      <wsdl:output>
        <soap:body use="literal"/>
      </wsdl:output>
    </wsdl:operation>
  </wsdl:binding>
  <wsdl:binding name="YS_SAMLTEST_SOAP12" type="tns:YS_SAMLTEST">
    <wsp:Policy>
      <wsp:PolicyReference URI="#BN_BN_YS_SAMLTEST_SOAP12"/>
    </wsp:Policy>
    <wsoap12:binding transport="http://schemas.xmlsoap.org/soap/http"
                     style="document"/>
    <wsdl:operation name="YsSamltest">
      <wsoap12:operation style="document"/>
      <wsdl:input>
        <wsoap12:body use="literal"/>
      </wsdl:input>
      <wsdl:output>
        <wsoap12:body use="literal"/>
      </wsdl:output>
    </wsdl:operation>
  </wsdl:binding>
  <wsdl:service name="YS_SAMLTEST">
    <wsdl:port name="YS_SAMLTEST" binding="tns:YS_SAMLTEST">
      <soap:address location="http://poc-sap:8021/sap/bc/srt/rfc/sap/ys_samltest/200/ys_samltest/ys_samltest"/>
    </wsdl:port>
    <wsdl:port name="YS_SAMLTEST_SOAP12" binding="tns:YS_SAMLTEST_SOAP12">
      <wsoap12:address location="http://poc-sap:8021/sap/bc/srt/rfc/sap/ys_samltest/200/ys_samltest/ys_samltest"/>
    </wsdl:port>
  </wsdl:service>
</wsdl:definitions>
ビジネスサービス作成後、以下のエラーを確認するかと思います。
"[OSB Kernel:398133]The service is based on WSDL with Web Services Security Policies that are not natively supported by Oracle Service Bus. Please select OWSM Policies - From OWSM Policy Store option and attach equivalent OWSM security policy." (See Figure 8参照)
1964583.gif
Figure 8: Policy Error
このエラーはOracle WebLogic ServerがOracle Web Services Managerとは異なり、ECCのWSDLにあるポリシーをサポートしていないために発生します。現時点では、このエラーを避けるためには、サービスポリシー構成を「From OWSM Policy Store」に変更しましょう。ポリシーをOracle Service Bus管理コンソールからのみ設定します。Oracle Service Busサーバーが立ち上がっていれば、必要に応じて、Oracle Web Services ManagerポリシーをOEPEから追加することができます。
プロキシサービスをビジネスサービスから作成すると、同じポリシーエラーが出てきます。[Policy]タブで Service Policy Configuration[From Pre-defined Policy or WS-Policy Resource]に変更します。Figure 9では、プロキシサービスにはポリシーは不要です。
1964584.gif
Figure 9: Create proxy service
HTTP Transport]タブで、[Authentication]を[Basic]に変更します。これが必要なのは、ビジネスサービスで、Oracle Web Services Managerが認証済みユーザー名を使ってSAML Assertionを生成するためです。

Oracle Service Busの構成jarファイルをエクスポートします。

Oracle Service Busの構成


Oracle Service Bus管理コンソールにアクセスし、OSB構成jarファイルをサーバーにインポートします。
ビジネスサービスを構成し、Oracle Web Services Managerで作成したカスタムポリシーを追加します。
Figure 10:  Service Policy Configuration
ポリシーを適用後、[セキュリティ]タブでプロパティの値を変更できます。
Figure 11: Policy Overrides
(注意)ビジネスサービスで振る舞いを変更する必要があれば、ここでポリシーのプロパティ値を変更することができます(例:異なる署名の証明書)。

テストの前に


テストの前に検証ポイントをご紹介します。
OracleとSAPのマシンの時計が同期されていることを確認し、ECCで適切なクロックスキューを設定します。未来の時刻、もしくは定義したクロックスキューよりも大きなタイムスタンプを持つメッセージをOracle Service Busが送信すると、ECCは呼びだしを拒否します。SAML Assertionに含まれているユーザーは、ECCでユーザー·ストアの既存のユーザーとマッピングする必要があります。ECCではユーザー名の大文字と小文字を区別します。
ECCがOracle Web Services Managerが使うSAML Issuerを受け入れるように設定しておきましょう。
すべての必要な証明書がキーストアにOracle Web Services ManagerおよびECCにインポートされていることを確認しましょう。

テスト


プロキシサービスのWSDL URLを取得し、サービスをテストします。例えば以下のような具合です。
http://<host>:<port>/TestSecSap/ProxyServices/TestSamlClient?WSDL
任意のWebサービスクライアントツール(例えばSoapUIなど)を使ってサービスをテストできます。
WebLogic Serverに作成したユーザーの資格証明を設定することをお忘れなく。

以下はリクエストメッセージのサンプルです。
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
                  xmlns:urn="urn:sap-com:document:sap:soap:functions:mc-style">
   <soapenv:Header/>
   <soapenv:Body>
      <urn:YsSamltest>
         <Text>test</Text>
      </urn:YsSamltest>
   </soapenv:Body>
</soapenv:Envelope>
Oracle Web Services Managerがポリシーを適用すると、ECCに送付されるリクエストは次のように変わります。
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
                  xmlns:urn="urn:sap-com:document:sap:soap:functions:mc-style">
  <soapenv:Header>
    <wsse:Security soapenv:mustUnderstand="1"
                   xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
      <wsse:SecurityTokenReference wsu:Id="STR-SAML-bCgQ6C7G7d3xvJEZ0Ap9Ag22"
                                   xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
        <wsse:KeyIdentifier ValueType="http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.0#SAMLAssertionID">SAML-l0sKvVtSFWBxVSfO8DOYOQ22</wsse:KeyIdentifier>
      </wsse:SecurityTokenReference>
      <wsu:Timestamp wsu:Id="Timestamp-B8oMUcneIEM0FBP1WSzqiw22"
                     xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
        <wsu:Created>2013-04-15T20:04:41Z</wsu:Created>
        <wsu:Expires>2013-04-15T20:09:41Z</wsu:Expires>
      </wsu:Timestamp>
      <wsse:BinarySecurityToken ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3"
                                EncodingType="http://docs.oasis-open.org/wss/2004/01/ oasis-200401-wss-soap-message-security-1.0#Base64Binary"
                                wsu:Id="BST-umEAXBVw2Neuu90Yk43M6A22"
                                xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">MIIG1jCCBb6gAwI...CreDzVTHZz/xXtD2Vl8JsTN/QaKkZ1n88=</wsse:BinarySecurityToken>
      <saml:Assertion MajorVersion="1" MinorVersion="1"
                      AssertionID="SAML-l0sKvVtSFWBxVSfO8DOYOQ22"
                      IssueInstant="2013-04-15T20:04:41Z"
                      Issuer="www.oracle.com"
                      xmlns:saml="urn:oasis:names:tc:SAML:1.0:assertion">
        <saml:Conditions NotBefore="2013-04-15T20:04:41Z"
                         NotOnOrAfter="2013-04-15T20:09:41Z"/>
        <saml:AuthenticationStatement AuthenticationInstant="2013-04-15T20:04:41Z"
                                      AuthenticationMethod="urn:oasis:names:tc:SAML:1.0:am:password">
          <saml:Subject>
            <saml:NameIdentifier Format="urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified">testsamlclient</saml:NameIdentifier>
            <saml:SubjectConfirmation>
              <saml:ConfirmationMethod>urn:oasis:names:tc:SAML:1.0:cm:sender-vouches</saml:ConfirmationMethod>
            </saml:SubjectConfirmation>
          </saml:Subject>
        </saml:AuthenticationStatement>
      </saml:Assertion>
      <dsig:Signature xmlns:dsig="http://www.w3.org/2000/09/xmldsig#">
        <dsig:SignedInfo>
          <dsig:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
          <dsig:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
          <dsig:Reference URI="#BST-umEAXBVw2Neuu90Yk43M6A22">
            <dsig:Transforms>
              <dsig:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
            </dsig:Transforms>
            <dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
            <dsig:DigestValue>buSz7W4V5OQ4FTBZKf8YBIpBC1Y=</dsig:DigestValue>
          </dsig:Reference>
          <dsig:Reference URI="#Timestamp-B8oMUcneIEM0FBP1WSzqiw22">
            <dsig:Transforms>
              <dsig:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
            </dsig:Transforms>
            <dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
            <dsig:DigestValue>psj9Sjk+bPTxUbqu1h8xUahVkrA=</dsig:DigestValue>
          </dsig:Reference>
          <dsig:Reference URI="#STR-SAML-bCgQ6C7G7d3xvJEZ0Ap9Ag22">
            <dsig:Transforms>
              <dsig:Transform Algorithm="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#STR-Transform">
                <wsse:TransformationParameters>
                  <dsig:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
                </wsse:TransformationParameters>
              </dsig:Transform>
            </dsig:Transforms>
            <dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
            <dsig:DigestValue>gMV488pINPLCAhWMzF6YGmBXySc=</dsig:DigestValue>
          </dsig:Reference>
          <dsig:Reference URI="#Body-qp7LuhCcRiNgYpIFe3OIyA22">
            <dsig:Transforms>
              <dsig:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
            </dsig:Transforms>
            <dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
            <dsig:DigestValue>n6fRqeZ5AOg7GUSST0Y23bIftSg=</dsig:DigestValue>
          </dsig:Reference>
        </dsig:SignedInfo>
        <dsig:SignatureValue>f6TPUUzWLbpPCnpbBBNeIhmy8vp+03V7YWLxCPcSbbPeN1AcUBijFPsH35V90IBmhgbPX366S9Ouu52lYiKNTgWn8UPIEVeKHYKp742dHBSlqyxxVagJ7ddHjHgNbNn5QFuu/re6gcDAOVYwcGRDwpNPg+RnywQKkOfpgxtSdkLWz5ok7TjQcfApnur5gCQvmRsBJwuQcaI3WTuFfWLg5gCj+yazOgUkwb+l7Vbssl8LdTQ1WiQdBKmoAbWci2GL+VFfkaq0dGcYd2/oJLJtrehPiTW6GY/o7TmWY9L8cJOCJo86YPbKjfjn8WHuANe/AQRMAMkKnymUd424xS+C8g==</dsig:SignatureValue>
        <dsig:KeyInfo Id="KeyInfo-KYpO2OdhC7Q6fmBL1fonww22">
          <wsse:SecurityTokenReference>
            <wsse:Reference URI="#BST-umEAXBVw2Neuu90Yk43M6A22"
                            ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3"/>
          </wsse:SecurityTokenReference>
        </dsig:KeyInfo>
      </dsig:Signature>
    </wsse:Security>
  </soapenv:Header>
  <soapenv:Body wsu:Id="Body-qp7LuhCcRiNgYpIFe3OIyA22"
                xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
    <urn:YsSamltest>
      <!--Optional: -->
      <Text>test</Text>
    </urn:YsSamltest>
  </soapenv:Body>
</soapenv:Envelope>
ECCはリクエストを検証し、レスポンスをOracle Service Busに返します。
<soap-env:Envelope xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/">
  <soap-env:Header xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
    <wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
      <wsu:Timestamp wsu:Id="ts-516B5F24AE9D1010E10080000A1D123D">
        <wsu:Created>2013-04-15T20:04:41Z</wsu:Created>
        <wsu:Expires>2013-04-15T20:06:11Z</wsu:Expires>
      </wsu:Timestamp>
    </wsse:Security>
  </soap-env:Header>
  <soap-env:Body>
    <n0:YsSamltestResponse xmlns:n0="urn:sap-com:document:sap:soap:functions:mc-style">
      <Result>Hello testsamlclient - PARAM: test</Result>
    </n0:YsSamltestResponse>
  </soap-env:Body>
</soap-env:Envelope>
Oracle Service Busはレスポンスをクライアントに返します。
<soap-env:Envelope xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/">
   <soap-env:Header xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"/>
   <soap-env:Body>
      <n0:YsSamltestResponse xmlns:n0="urn:sap-com:document:sap:soap:functions:mc-style">
         <Result>Hello testsamlclient - PARAM: test</Result>
      </n0:YsSamltestResponse>
   </soap-env:Body>
</soap-env:Envelope>

まとめ

IDの伝播はセキュアな統合において非常に重要ですが、SAMLのようなテクノロジーを適用する方法は常に明快であるとは限りません。この記事が皆様の類似のシナリオにおいてお役に立つことを願っています。

著者について

Ronaldo FernandesはブラジルのOracle Consultingチームのprincipal consultantです。専門はOracle Fusion Middleware、SOA、セキュリティで、1996年からJavaテクノロジーを使って業務をしています。アーキテクチャ定義、問題解決、テクニカルリーダーシップおよびソフトウェア開発において15年以上の経験を有しています。

0 件のコメント:

コメントを投稿