4 複数のテナントに対するサービスの保護

OWSMは、マルチテナント・システムのポリシー強制をサポートしています。OWSMは、テナントに固有の複数のデータ・ソースを処理できます。OWSMでは、GPAによって、テナント固有のセキュリティが強制されます。

この章の構成は、次のとおりです。

4.1 ユース・ケース: 複数のテナント向けのRESTful Webサービスの保護

RESTful Webサービスを開発し、テナントのプロビジョニングとテナント固有のGPAの強制により、複数のテナントに対してそのRESTful Webサービスを保護できます。

ユース・ケース

複数のテナント向けのRESTful Webサービスを保護します。

実装サマリー

RESTful Webサービスを開発し、テナントのプロビジョニングとテナント固有のGPAの強制により、2つのテナント(tenant1およびtenant2)に対してそのRESTful Webサービスを保護します。

コンポーネント
  • Oracle WebLogic Server

  • Oracle Fusion Middleware

  • Oracle Web Services Manager(OWSM)

必須ドキュメント

このユース・ケースを完了するには、次のドキュメント・リソースを参照してください。

このユース・ケースには、次のステップが含まれています。

  • WebLogicドメインを作成して、テンプレートをインストールします。

  • テナントのプロビジョニング: テナントに対するデータベース・スキーマとデータ・ソースを作成します。

  • テナントに対するGPAを作成します。

  • 実行時に特定のテナントに対するポリシーを強制します。

4.2 複数のテナント向けのWebサービスの実装 - 前提条件

複数のテナント向けのWebサービスを実装する前に、製品コンポーネントのダウンロードとインストールを行い、WebLogicドメインを構成して、管理サーバーを起動し、Oracle Enterprise Manager Fusion Middleware ControlおよびOracle WebLogic Server管理コンソールへのアクセス権を取得します。

始める前に、次のことを確認してください。

  • Oracle Fusion Middleware (OWSMを含む)をダウンロードしてインストールします。

詳細は、Oracle Fusion MiddlewareのインストールのプランニングOracle Fusion Middlewareインストールの準備に関する項を参照してください。

Oracle Fusion Middlewareソフトウェアの入手先とダウンロードの詳細は、OTNでOracle Fusion Middlewareダウンロード、インストール、構成のReadmeファイルを参照してください。

4.3 WebLogicドメインの作成およびテンプレートのインストール

OWSMテンプレートoracle.wsmpm_cloud_template.jarまたはoracle.wsmpm_cloud_file_template.jarを使用して、WebLogicドメインを作成します。

  • oracle.wsmpm_cloud_template.jar: このテンプレートでは、ドメインの作成中にMDS dbスキーマが必要になります。

  • oracle.wsmpm_cloud_file_template.jar: これは、ファイル・ベースのテンプレートで、ドメインの作成中にMDS dbスキーマは必要ありません。この場合、ドメイン・ホーム内にOWSMシード・ドキュメントが作成されます。このテンプレートを推奨します。

完全な手順は、『構成ウィザードによるWebLogicドメインの作成』WebLogicドメインの作成に関する項を参照してください。

前述のドメイン・テンプレートを作成する手順の詳細は、『WebLogic Scripting Toolの理解』「ドメイン・テンプレートの作成および使用(オフライン)」を参照してください

4.4 テナントのプロビジョニング

特定のテナントのdbまたはpdbにMDSスキーマをインストールします。次に、作成したMDSスキーマのWebLogicドメインに、テナント固有のデータ・ソースを作成します。

この章の構成は、次のとおりです。

4.4.1 RCUを使用したデータベース・スキーマの作成

RCUを使用してデータベース・スキーマを作成します。RCUは、LinuxおよびWindowsプラットフォームでのみ使用できます。UNIXでサポートされるデータベースの場合はインストールにLinux RCUを使用し、Windowsでサポートされるデータベースの場合はWindows RCUを使用します。

注意:

操作を最小限にするためにコマンド・ラインから—silentモードでRCUを実行するには、『リポジトリ作成ユーティリティによるスキーマの作成』-silentコマンドの使用に関する項を参照してください。

次の手順を実行して、tenant1およびtenant2にデータベース・スキーマを作成します。

たとえば、tenant1のテナントにデータベース・スキーマを作成するには、次のようにします:

  1. RCUがインストールされたディレクトリに移動します。次に例を示します。

    UNIX: $rcuHome/bin/rcu

    Windows: <rcuHome>\BIN

  2. アプリケーションを起動します。

    UNIX: ./rcu

    Windows: rcu.bat

    リポジトリ作成ユーティリティのようこそ画面が表示されます。

  3. 「次へ」をクリックします。「リポジトリの作成」ページが表示されます。
  4. 「リポジトリの作成」が選択されていることを確認し、「次へ」をクリックします。「データベース接続の詳細」ページが表示されます。わかりやすくするため、ここには、自分のシステム名を使用するユーザーが多いです。表示されているフィールド(「データベース・タイプ」、「ホスト名」、「ポート」、「サービス名」、「ユーザー名」、「パスワード」、「ロール」)にデータベースの詳細を入力します。
    データベース・タイプ
    データベース・タイプには「Oracle Database」を選択します。
    ホスト名
    データベースが実行されるサーバーの名前を、host.example.comという形式で指定します。
    ポート
    データベースのポート番号を指定します。
    サービス名
    データベースのサービス名を指定します。たとえば、rdbms.host.example.comです。
    ユーザー名
    データベースのユーザー名を入力します。デフォルトのユーザー名はSYSです。
    パスワード
    データベース・ユーザーのパスワードを入力します。
    ロール
    ドロップダウン・リストからデータベース・ユーザーのロール(「標準」または「SYSDBA」)を選択します。
  5. 「次へ」をクリックします。インストーラにより、前提条件がチェックされます。前提条件チェックが完了したら、「OK」をクリックします。「次へ」をクリックします。「コンポーネント」画面が表示されます。
  6. 「新規接頭辞の作成」オプションをクリックして、スキーマの接頭辞(例: tenant1)を選択します。
  7. デフォルトで選択されているコンポーネントに加えて、付随するコンポーネント「Metadata Services」および「Oracle Platform Security Services」を選択します。「OK」をクリックします。
  8. 「次へ」をクリックします。「スキーマ・パスワード」ページが表示されます。
  9. 「すべてのスキーマに同じパスワードを使用」を選択します。
  10. 表示されているフィールドにパスワードを入力して、確認します。
  11. 「次へ」をクリックします。「表領域のマップ」ページが表示されます。既存の表領域を変更する場合は、「表領域の管理」をクリックします。
  12. このインストールの場合は、「次へ」をクリックします。リポジトリの作成通知が表示されます。「OK」をクリックします。表領域が作成され、ポップアップ通知に進捗状況が表示されます。操作が完了したら、「OK」をクリックします。「サマリー」ページが表示されます。
  13. 「作成」をクリックします。スキーマが作成されます。「完了サマリー」画面が表示されます。
  14. 「閉じる」をクリックします。
これにより、tenant1のデータベース・スキーマが作成されます。前述の手順を繰り返して、tenant2のデータベース・スキーマを作成します。

4.4.2 テナントのデータ・ソースの作成

Oracle WebLogic Server管理コンソールを使用して、使用しているアプリケーションのWebLogic Serverインスタンス内にJDBCデータ・ソースを設定します。

次の手順を実行して、tenant1およびtenant2の2つのテナントにデータ・ソースを作成します

tenant1など、特定のテナントのデータ・ソースを構成するには、次のようにします:

  1. Oracle WebLogic Server管理コンソールにログインします
  2. 「WebLogic Server管理コンソール」ページで、「JDBC」「データ・ソース」を選択します。「新規」をクリックします。
  3. JDBCデータ・ソースのプロパティ・ページで、次の作業を行います。
    • 「名前」フィールドに、一意のJDBCデータ・ソースの名前を入力します。たとえば、mds-owsm-tenant1です。
    • 「JNDI」フィールドで、接続の名前を入力します。たとえば、mds/owsm/tenant1です。
    • 「データベースのタイプ」には、「Oracle」を選択します。
    • 「データベース・ドライバ」に、Oracleドライバ(thin)を選択します
  4. 「次へ」をクリックします。
  5. 「トランザクション・オプション」ページで、デフォルトのオプションをそのまま使用し、「次へ」をクリックします。
  6. 「接続プロパティ」ページで次の作業を行います:
    • データベース名にOracle SIDを入力します。たとえば、rdbms.example.comです。
    • ホスト名にデータベースのマシン名を入力します。たとえば、host.example.comです
    • データベースにアクセスするために使用するポート番号を入力します。
    • TENANT1_MDSなど、先ほど作成したスキーマ名を、ユーザー名として入力します。データベースのスキーマ・パスワードを入力します。「次へ」をクリックします。
  7. 「データベース接続のテスト」ページで、「構成のテスト」をクリックして接続をテストします。
  8. 「ターゲットの選択」ページで、JDBCデータ・ソースをデプロイするサーバーを選択します。
  9. 「終了」をクリックします。
これにより、tenant1のデータ・ソースが作成されます。前述の手順を繰り返して、tenant2のデータ・ソースを作成します。データ・ソースがOracle WebLogic Serverで作成されたら、アプリケーション・モジュールで使用できます。

4.4.3 テナントのデータ・ソースの設定

汎用データ・ソースは、実際のデータベース接続を、その基礎となる接続プールとともに管理するデータ・ソースです。サービス・インスタンスのプロビジョニングの一環として、PODで新しいサービス・インスタンスが作成される場合は、汎用データ・ソースが作成されます。すべての汎用データ・ソースが作成されたら、プロキシ・データソースの切替えプロパティを更新します。

切替えプロパティでは、次の形式を使用します。

serviceInstanceId1=datasourceJNDIName1;serviceInstanceId2=datasourceJNDIName2;

例: serviceInstance1=mds/owsm/tenant1;serviceInstance2=mds/owsm/tenant2;

WebLogic Serverの切替えプロパティの更新

汎用データ・ソースは、WLSTスクリプト・シェルまたはJMXを使用して作成できます。データ・ソースが作成されたら、次のステップに従い、WLSTを使用してプロキシ・データ・ソースの切替えプロパティを更新します。

  1. 新しいスクリプトUpdateSwitchingPropertiesProxyDatasource.pyをローカル・サービス・インスタンス・プロビジョニングに追加します。

  2. 次のコード・ブロックに記述されているスクリプトをコピーして、次の変更を行います:

    • ユーザー名とパスワードを、自分のWebLogic Server資格証明に置き換えて、WebLogic管理サーバー資格証明を更新します: connect("weblogic","password","t3://"+example+":7001")。

    • updatePropsによって指定されるサービス・インスタンスIDと基礎となるデータ・ソースのJNDI名を変更して、プロキシ・データソースの切替えプロパティを更新します。

      updatedProps = switchingProps + ';serviceInstance1=jdbc/instancejndi'

    """
    Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved.
    This script updates Switching Properties of a Proxy JDBC Datasource.
    """
     
    import sys, socket
    import os
    hostname = socket.gethostname()
    connect("weblogic","password","t3://"+hostname+":7001")
    edit()
    startEdit()
    cd ('/JDBCSystemResources/ProxyDS')
    jdbcResource = cmo.getJDBCResource()
    jdbcDataSourceParams = jdbcResource.getJDBCDataSourceParams()
    switchingProps = jdbcDataSourceParams.getProxySwitchingProperties()
    if (switchingProps != None):
            updatedProps = switchingProps + ';serviceInstance1=jdbc/instancejndi'
    else:
            updatedProps = 'serviceInstance1=jdbc/instancejndi'
    jdbcDataSourceParams.setProxySwitchingProperties(updatedProps)
    save()
    activate()
  3. 次のコマンドを実行します。

    java weblogic.WLST -i UpdateSwitchingPropertiesProxyDatasource .py

JavaSEアプリケーションの切替えプロパティの更新

データ・ソースが作成されたら、次のステップに従って、プロキシ・データ・ソースの切替えプロパティを更新します。

  • context.xmlに対応するアプリケーション・サーバーを編集し、既存の値に';serviceInstanceId=jdbc/instancejndi'を追加して、switchingPropertiesの値を更新します。

    例: switchingProperties="1e8b59b2=jdbc/mds/owsm/tenant1;2efba34c=jdbc/mds/owsm/tenant2"

4.5 OWSMセキュリティ・アーティファクトの作成

オンラインのWLSTコマンドまたはREST APIを使用して、OWSMセキュリティ・アーティファクトを作成できます。

次の項を参照してください。

4.5.1 WLSTを使用したOWSMセキュリティ・アーティファクトの作成

オンラインのWLSTコマンドを使用して、OWSMセキュリティ・アーティファクトを作成できます。

tenant1およびtenant2のセキュリティ・アーティファクトを作成します。

oracle/multi_token_rest_service_policyポリシーを使用してtenant1のセキュリティ・アーティファクトを作成するには、次のWLSTコマンドを順に実行します:

connectWSMRest('weblogic','password','example.com:22001')
startWSMTenantContext('tenant1')
beginWSMSession()
createWSMPolicySet('myPolicySet','rest-resource','Domain("*")')
attachWSMPolicy("oracle/multi_token_rest_service_policy")
commitWSMSession()
listWSMPolicySets()
endWSMTenantContext()

注意:

グローバル・ポリシー・セット、トークン発行者信頼、構成カスタマイズなどのようなOWSMセキュリティ・アーティファクトを作成する場合は、まずconnectWSMRest()コマンドを実行して、次にstartWSMTenantContext()コマンドとendWSMTenantContext()コマンドの間に対応するOWSMコマンドをラップします。

注意:

コマンドに関する詳細は、『インフラストラクチャ・コンポーネントWLSTコマンド・リファレンス』「WebサービスのカスタムWLSTコマンド」を参照してください。

oracle/http_jwt_token_service_policyポリシーを使用してtenant2のセキュリティ・アーティファクトを作成するには、次のWLSTコマンドを順に実行します:

connectWSMRest('weblogic','password','example.com:22001')
startWSMTenantContext('tenant2')
beginWSMSession()
createWSMPolicySet('myPolicySet','rest-resource','Domain("*")')
attachWSMPolicy("oracle/http_jwt_token_service_policy")
commitWSMSession()
listWSMPolicySets()
endWSMTenantContext()

4.5.2 REST APIを使用したOWSMセキュリティ・アーティファクトの作成

OWSMアーティファクトを作成するためにRESTコマンドを実行しているときに、X-RESOURCE-IDENTITY-SERVICE-GUIDヘッダーにテナントIDの値を渡します。

tenant1のOWSMポリシー・セットを作成するREST API:

curl -i -H "X-RESOURCE-IDENTITY-SERVICE-GUID:tenant1" -H "Content-Type:application/json" -u username:password -X POST -d @- http://example.com:22001/wsm-pmrest/v2/policyset
[{
  "name": "myPolicySet",
  "type": "rest-resource",
  "scope": "Domain('*')",
  "policyReferences":[{
                     "uri":"oracle/multi_token_rest_service_policy",
                      "status":"enabled"
                      }
                      ] 
}]

tenant2のOWSMポリシー・セットを作成するREST API:

curl -i -H "X-RESOURCE-IDENTITY-SERVICE-GUID:tenant2" -H "Content-Type:application/json" -u username:password -X POST -d @- http://example.com:22001/wsm-pmrest/v2/policyset
[{
  "name": "myPolicySet",
  "type": "rest-resource",
  "scope": "Domain('*')",
  "policyReferences":[{
                        "uri":"oracle/http_jwt_token_service_policy",
                        "status":"enabled"
                        }
                        ] 
}]

4.6 実行時におけるテナント固有のポリシーの強制

httpヘッダーにテナントIDを使用して、実行時にテナント固有のセキュリティ・ポリシーを強制します。

実行時に、OWSMによって、httpヘッダー(X-RESOURCE-IDENTITY-SERVICE-GUID)を介して受け取ったテナントIDの値が読み取られて、特定のテナントに対してポリシーが強制されます。