Oracle Identity Cloud Serviceでのアプリケーションの構成

認証が正しく機能するには、Oracle Fusion Applications Cloud ServiceおよびOracle PaaS (Oracle Visual Builder)またはカスタムhtml 5アプリケーションを保護している同じOracle Identity Cloud Serviceインスタンスを使用する必要があります。Oracle Identity Cloud Service内で、クライアント認証に使用するアプリケーションを作成する必要があります。

このシナリオでは、Oracle FunctionsとOracle API Gatewayの重要性と、両方とも同じOracle Identity Cloud Service Applicationを使用するかわりにOracle Identity Cloud Serviceを別々のエンティティとして保護することによって、Oracle FunctionsとOracle Fusion Applications Cloud Serviceのエンティティ間の相互作用を分離します

通常、Oracleの顧客が作成するOracle SaaS拡張アプリケーションは、複雑なロジックを実行します。たとえば、一般的なシナリオは、Oracle Fusion Applications Cloud Serviceからデータを取得してなんらかの方法で処理し、データをOracle Fusion Applications Cloud Serviceにプッシュしてデータベースなどの別のターゲットに戻すことです。

このため、ここでは2つのOracle Identity Cloud Serviceアプリケーションを持つアーキテクチャになっています。

  • Oracle Functionsを、リソースおよびOracle Fusion Applications Cloud Serviceの信頼できるクライアントとして保護するアプリケーション。
  • Oracle Fusion Applications Cloud Serviceインスタンスをリソースとして保護するアプリケーション。

この記事の手順では、これらのアプリケーションの最初の作成と構成のプロセスを段階的に実行し、Oracle Functionsを保護します。これら2つのアプリケーションのうち2番目はすでに存在している必要があります。Oracle Fusion Applications Cloud ServiceとOracle PaaS間でのフェデレーションを有効にするために、アプリケーションを作成および構成する必要がありました。

この設定により、Oracle Fusion Applications Cloud Serviceにアクセスする信頼できるクライアントのルールまたはポリシーとは異なるルールまたはポリシーにアクセスするように構成できます。この構成では、API Gatewayへの着信アクセス・トークンが必要になるのは、機能を起動するためにOracle Functionsへのアクセス権が認可されているだけですが、Oracle Fusion Applications Cloud Serviceインスタンスにアクセスするために必要な権限と同じ権限が必ずしも付与されている必要はありません。Oracle Visual Builderアプリケーションには、API Gatewayに到達するためのアクセス・トークンを生成するOracle Identity Cloud Service Applicationが関連付けられている必要があります。このOracle Identity Cloud Serviceアプリケーションは、関数/APIゲートウェイ・リソースのクライアントになります。

アーキテクチャ・ダイアグラムに表示されるトークンの交換により、Oracle Fusion Applications Cloud Service Resourceのクライアントである関数の場合のアイデンティティを伝播する追加の保護レイヤーが提供されます。これは、Oracle WebLogic OAuthアサーション・プロセスに類似しており、Oracle Java Cloud Serviceを使用するものなど、古いサポートされるSaaS拡張機能で使用されるOracle Identity Cloud Serviceがあります。

これは、一部のユースケースでは、Oracle Functions用のトークンを生成するために使用されるOracle Identity Cloud Serviceアプリケーションに、Oracle Fusion Applications Cloud Service用ではなく関数用のリソース・スコープのみを含めることができるということを意味します。この場合、Oracle FunctionsにはOracle Fusion Applications Cloud Serviceを起動するためにトークンを再利用する機能はありませんが、Oracle Functionsに到達することは有効です。したがって、ビジネス・ロジック、ユーザー・ロールと権限またはその他の基準に基づいて、一部のユーザーまたは機能保証にアクセスできない論理フローを実装できます。

別のユースケースでは、Oracle Functionsは、APIゲートウェイからのリクエストで渡された証明書およびユーザーを使用して、Oracle Fusion Applications Cloud Serviceのアクセス・トークンをリクエストするコードを含めることができます。

Oracle Identity Cloud ServiceでのOracle Functionsアプリケーションの作成

Oracle Identity Cloud Service内で、Oracle Functionsクライアント認証に使用する機密アプリケーションを作成する必要があります。

Oracle Fusion Applications Cloud Serviceインスタンスと統合した同じOracle Identity Cloud Serviceインスタンス内で、機密アプリケーションを作成し、クライアント構成が設定され、クライアント資格証明、JWTアサーションおよびリソース所有者の権限付与が有効になるようにします。

  1. Oracle Cloud My Servicesにサインインし、「ユーザー」をクリックし、「Identity Console」をクリックします。
  2. アプリケーション」タブを選択し、「追加」をクリックします。その後「機密アプリケーション」をクリックします。
  3. 機密アプリケーションの追加」ウィザードの「詳細」ページで、新規アプリケーションの名前を指定します。必要に応じて、説明、アイコン、表示設定、タグなど、その他の値を設定できます。「次へ」をクリックします。
  4. クライアント・ページで、「このアプリケーションをクライアントとして今すぐ構成」を選択します。
    ページに追加のオプションが表示されます。次のように設定します。
    • 許可される権限付与タイプ:「リソース所有者クライアント資格証明およびJWTアサーション」を選択します。
    • HTTPS以外のurlを許可」を有効にします。
    • このユースケースのリダイレクトURLは必要ありません。
    • クライアント・タイプ:「機密」オプションを選択したままにします。
  5. 「リソース」セクション内で、「リソースの登録」を選択します。API Gatwayインスタンスを作成したときに、Oracle Cloud Infrastructureコンソールで生成されたAPI Gatewayインスタンスのホスト名に「プライマリ・オーディエンス」の値を設定します。
    Oracle Cloud Infrastructureでは、ゲートウェイを選択し、「ゲートウェイ情報」タブを選択すると、インスタンスの「ホスト名」がタブに表示されます。
  6. スコープ」で、スコープを追加して、APIゲートウェイJWT認可ポリシーを使用するデプロイメントのベースurlの値を追加するには、をクリックします。たとえば、/saxtensionのようになります。
    このスコープを使用して、アプリケーションによるOracle Functionsリソースへのアクセスを許可します。必要に応じて、追加リソースのスコープを追加できます。
  7. 管理Apiへのアクセス権を付与する必要はありません。
  8. 」をクリックして「リソース」ページに移動し、再度「次へ」をクリックして認可ページに移動します。
  9. 認可」ページで、「終了」をクリックします。
    クライアントIDおよびクライアント・シークレットのあるアプリケーション追加の通知が表示されます。これらを後で使用するために書き留めます。通知を閉じると、アプリケーションが表示されます。
  10. アプリケーション名の右側にある「アクティブ化」ボタンをクリックします。

Oracle Identity Cloud Serviceアプリケーションの準備およびテスト

Oracle Fusion Applications Cloud Serviceインスタンスに対応するアプリケーションに接続するようOracle Identity Cloud Service機密アプリケーションを構成して、アプリケーションをテストしてください。

この手順では、新しく作成したOracle Identity Cloud Serviceアプリケーションのリソースを構成してOracle Fusion Applications Cloud Serviceアプリケーションのスコープを追加し、Oracle PaaSシステムの認可ユーザー・アカウントがOracle Fusion Applications Cloud Serviceインスタンスのトークンを取得できることを確認します。
  1. Oracle Cloud My Servicesにサインインし、「ユーザー」をクリックし、「Identity Console」をクリックします。
  2. アプリケーション」タブを選択し、Oracle Functionsに対して作成したアプリケーションを検索して選択します。
  3. トークン発行ポリシーを編集します。承認済リソースを「すべて」に設定します。
  4. Fusionアプリケーションのスコープが設定されたOracle Applications Cloud (Fusion)のリソースを追加します(保護する必要はありません)。
  5. Oracle PaaSとOracle Fusion Applications Cloud Serviceの両方に存在するユーザー・アカウントがあり、REST APIコールを使用して問い合せたいデータにアクセスできる十分な権限があることを確認します。たとえば、営業管理者ロールで十分な場合があります。
  6. これらのユーザー資格証明を使用してアクセス・トークンを生成することで、アプリケーションをテストします。スコープ、Oracle Identity Cloud Service Oracle Fusion Applications Cloud Service Application OAuthで保護されるリソースのプライマリ・オーディエンスの値を指定することで、Postmanリクエスト・トークン機能を使用してアクセス・トークンを生成できます。この簡易テストでは、ユーザー名を生成されたトークンのサブジェクトとして使用するために、権限付与タイプとしてパスワード資格証明を使用します。(本番環境では、クライアントがユーザー情報を提供するクライアント資格証明を使用します。)アクセス・トークンURLは、Oracle Identity Cloud ServiceホストURLを取得して/oauth2/v1/tokenを付加することで形成されます。例: https ://<アイデンティティ・クラウドhostname.identity.oraclecloud.com >/oauth2/v1/token。
すべて正常に動作している場合は、レスポンスとしてJWTトークンを受信する必要があります。この場合、Oracle Fusion Applications Cloud Service REST APIエンドポイントの呼出しでこのトークンを使用して、同じ出力を受信できます。次に例を示します。
curl --location --request GET 'https://<your fusion instance>.<domain>.com/fscmRestApi/resources/11.13.18.05/expenses' \
--header 'Content-Type: application/json' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer <JWT_TOKEN>'
このカーソル問合せは、Expensesデータを戻す必要があります。

Oracle Functions Oracle Identity Cloud Serviceアプリケーションを信頼できるクライアントとして構成

Oracle FunctionsにOAuthリクエストを作成するには、Oracle Identity Cloud Serviceアプリケーションが信頼できるクライアントとして使用する証明書が必要です。使用できる証明書がない場合は、開発時に使用するための自己署名証明書を生成できます。

指定されたスクリプトgenSelfSignedKeypair.shでは、キーを生成できません(まだ生成していない場合)。テナントおよびキーの別名値を指定してスクリプトを実行します。この例では、mytenantをテナントとして、fnassertionkeyをキー別名として指定しました。

  1. 必要に応じて、このソリューション・プレイブックのコード・サンプルとともに提供されるスクリプトを使用して、証明書を生成します。
    $ ./genSelfSignedKeypair.sh --tenant mytenant  --keyalias fnassertionkey
    ==============================================
    Generating Self Signed Certificates in Kesytore
     
     
    General Properties:
    -------------------------------
    ==> Workdir: ./genCertsDir
    ==> Tenant Name: mytenant
    ==> Key Alias: fnassertionkey
     
    Keystore Properties:
    -------------------------------
    ==> Store Type: PKCS12
    ==> Key Algorithm: RSA
    ==> Key Size: 2048
    ==> Validity time(days): 1825
    ==> Sign Algorithm: SHA256withRSA
    ==> dname: CN=mytenant FN Assertion, O=mycompany, L=mylocation, ST=mystate, C=mycountry
     
    Passwords:
    [*] Keystore Password:
    [*] PrivateKey Password:
     
    Generate keypair in keystore ./genCertsDir/mytenant-keystore.p12 ...
    Generating 2,048 bit RSA key pair and self-signed certificate (SHA256withRSA) with a validity of 1,825 days
        for: CN=mytenant FN Assertion, O=mycompany, L=mylocation, ST=mystate, C=mycountry
    [Storing ./genCertsDir/mytenant-keystore.p12]
    Export public certificate with alias fnassertionkey from generated keystore (openssl) ...
    Certificate stored in file <./genCertsDir/mytenant-fnassertionkey-cert.pem>
    Extract Private Key in PKCS8 format from generated keystore (openssl) ...
    Self Signed certificate generated successfully
    ==============================================
    Files generated:
    ==> ./genCertsDir/mytenant-keystore.p12
    ==> ./genCertsDir/mytenant-fnassertionkey-cert.pem [Stored in Keystore]
    ==> ./genCertsDir/mytenant-fnassertionkey-pkcs8-key.pem [Stored in Keystore]
    ==============================================

    生成されたファイルは、関数コードおよびOracle Identity Cloud Service Application構成で使用されます。

    • mytenant-keystore.p12:アサーション・プロセスで使用されている証明書を抽出するために、コードで使用するキーストアを生成します。
    • mytenant-fnassertionkey-cert.pem: Oracle Identity Cloud Service Application構成で使用する公開証明書。

    3番目のpemファイルはすぐには必要ありませんが、同様のバージョンがコード内のmytenant-keystore.p12キーストアから抽出され、参照用にエクスポートされます。

    • mytenant-fnassertionkey-pkcs8-key.pem: PKCS 8形式の秘密キー
  2. Oracle Functions Oracle Identity Cloud Serviceアプリケーションを、信頼できるクライアント・タイプを使用して構成し、証明書のキー別名を使用して証明書を追加します。Oracle Cloud My Servicesにサインインし、「ユーザー」をクリックし、「Identity Console」をクリックします。
  3. アプリケーション」タブを選択し、Oracle Functionsにアクセスするために以前作成したOracle Identity Cloud Serviceアプリケーションを選択します。
  4. クライアント構成」セクションで「証明書」フィールドを見つけ、証明書に使用した別名(上の例ではfnassertionkey)を入力し、「インポート」ボタンをクリックしてmytenant-fnassertionkey-cert.pemファイルをインポートします。

Oracle Cloud Infrastructure Vaultへのキーストア情報のインポート

Oracle Functionsを使用したアサーション・プロセスでは、インポートされたキーストアおよびパスワードの使用が必要になります。セキュリティを最適化し、ハードコードされたパスワードおよびシークレットを使用しないようにするには、Oracle Cloud Infrastructure Vaultを利用できます。

Oracle Cloud Infrastructure Vaultサービスでは、機密データを安全に暗号化および格納できます。キー・ストアおよび公開キー・パスワードをVaultに格納し、Oracle FunctionsバックエンドのOracle Cloud Infrastructure SDKを使用してそれを参照してユーザーの認証を実行できます。JKSファイルを安全に暗号化して保存することもできます。

このソリューション・プレイブックの「始める前に」セクションで、クイック・スタート・ガイドの使用など、Oracle Functions環境を設定する必要がありました。クイック・スタート・ガイドの設定では、ルート・コンパートメント・レベルの関数のポリシーを作成するように要求されます。次の例では、ポリシーはFnTenancyPolicyという名前です。ポリシーに追加の文を追加して、Oracle Functionsがそのポリシーに関連付けられているVaultにアクセスできるようにする必要があります。使用するOracle Functionsのグループの名前は、クイック・スタート・ガイドのテナンシを構成するときに作成した名前にする必要があります。この例では、fnGroup1はOracle Functionsを使用できるユーザーのグループです。

  1. Oracle Cloud Infrastructureコンソールの「Governance and Administration」で、「Identity」に移動して「ポリシー」をクリックします。
    表示しているコンパートメント内のポリシーのリストが表示されます。
  2. 左側のリストからルート・コンパートメントを選択してください。
  3. Oracle Functionsポリシーの名前(FnTenancyPolicyなど)を選択し、「ポリシー文の編集」をクリックします。次の文を追加します。
    allow group fnGroup1 to manage secret-family in tenancy
    allow group fnGroup1 to manage vaults in tenancy
    allow group fnGroup1 to manage keys in tenancy
  4. 変更の保存」を選択します。
  5. コンパートメントにVaultインスタンスを作成します。
    1. ガバナンスおよび管理」グループで、「セキュリティ」に移動して「Vault」を選択します。
    2. リスト・スコープ」のコンパートメント ・リストで、ボールトを作成するコンパートメントの名前を選択して、「Vaultの作成」をクリックします。
    3. 「Vaultの作成」ダイアログ・ボックスで、「名前」をクリックして、ボールトの表示名を入力します。このフィールドに機密情報を入力しないでください。
    4. 必要に応じて、「仮想プライベート・ボールトにする」チェック・ボックスを選択して、ボールトを仮想プライベート・ボールトにします。
    5. 「作成」を選択します。
  6. シークレットに関連付けられたキー・インスタンスを作成します。
    1. リスト・スコープ」のコンパートメント ・リストで、キーを作成するコンパートメントの名前を選択し、作成したボールトの名前をクリックします。
    2. キー」、「キーの作成」の順に選択します。
    3. 「キーの作成」ダイアログ・ボックスで、コンパートメントの作成リストからコンパートメントを選択します。(キーは、ボールトが存在するコンパートメントの外部に存在できます。)
    4. 名前」を選択し、キーを識別するための名前を入力します。このフィールドに機密情報を入力しないでください。
    5. 「キーの形状:長」リストから長さを選択して、キーの長さをビット単位で指定します。
    6. 終了したら、「キーの作成」をクリックします。
  7. アサーション・ケースに必要なシークレットを作成します。
    1. キーストア・パスワード
    2. PKパスワード
    3. キーストア・ファイル
    キーストア・ファイルの内容について、Base64でエンコードされた表現を追加する必要があります。Opensslコマンドを使用して生成します。
    openssl base64 -in <YourKeystoreName>.p12 -out ksBase64Encoded.txt | cat ksBase64Encoded.txt

    コンテンツを機密のキーの値にコピーします。新しいシークレットを作成するには:

    1. リスト・スコープ」のコンパートメント ・リストで、シークレットを作成するコンパートメントの名前を選択します。
    2. コンパートメント内のボールトのリストから、作成したボールトの名前を選択します。
    3. シークレット」、「シークレットの作成」の順に選択します。
    4. 「シークレットの作成」ダイアログ・ボックスで、コンパートメントの作成リストからコンパートメントを選択します。(シークレットは、ボールトが存在するコンパートメントの外部に存在できます。)
    5. 名前」を選択し、シークレットを識別する名前を入力します。このフィールドに機密情報を入力しないでください。
    6. 説明」を選択し、シークレットの簡単な説明を入力して識別します。このフィールドに機密情報を入力しないでください。
    7. ボールトにインポートしながら、秘密のコンテンツの暗号化に使用するマスター暗号化キーを選択します。(このキーは、同じボールトに属する必要があります。)
    8. 機密タイプ・テンプレート」リストからテンプレート・タイプを選択して、提供している秘密のコンテンツの形式を指定します。(コンソールを使用してシークレットまたはシークレットのバージョンを作成する場合は、プレーン・テキストの秘密のコンテンツを提供できますが、秘密のコンテンツは、サービスに送信する前にbase64でエンコードする必要があります。コンソールは、この形式を選択した場合、プレーン・テキスト・シークレットの内容を自動的にエンコードします。)
    9. 秘密のコンテンツ」を選択して、秘密のコンテンツを入力します。(シークレットのバンドルで許容される最大サイズは25 KBです。)
    10. オプションで、ルールを適用してシークレットの使用方法を管理できます。シークレットのバージョン間でのシークレットのコンテンツの再利用に関するルールを作成することも、シークレットのコンテンツがいつ期限切れになるかを指定するルールを作成することもできます。
    11. 終了したら、「シークレットの作成」を選択します。
    12. 作成する必要があるシークレットごとにこれらの手順を繰り返します。
  8. 動的グループの作成:
    1. コンソールで、「アイデンティティ」を選択し、「動的グループ」を選択します。
      テナンシの動的グループのリストが表示されます。
    2. 動的グループの作成」を選択します。
    3. 動的グループの名前を入力します。今後使用するための名前を記録します。名前は、テナンシ内のすべてのグループで一意である必要があります。この名前は後で変更できません。
    4. 説明を入力します。後でコンソールを使用して説明を変更することはできませんが、APIを使用して変更できます。
    5. 一致ルール」セクションで、次のルールを入力します(区分のOCIDを使用します)。
      ALL { resource.type = 'fnfunc', resource.compartment.id = 'ocid1.compartment.oc1..xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'}
    6. 動的グループの作成」を選択します。
      一致ルールの構文は検証されますが、OCIDsは検証されません。入力したOCIDsが正しいことを確認します。
  9. Oracle Functionsクイック・スタート・ガイドの一部としてOracle Functions用に作成したポリシーに文を追加して、作成した動的グループがシークレットにアクセスできるようにします。
    1. ガバナンスと管理」で、「アイデンティティ」に移動して「ポリシー」をクリックします。
      表示しているコンパートメント内のポリシーのリストが表示されます。
    2. リストからルート・コンパートメントを選択します。
    3. Oracle Functionsポリシーの名前(FnTenancyPolicyなど)を選択し、「ポリシー文の編集」をクリックします。次の文を追加します。
      allow dynamic-group your_fn_group to read secret-family in tenancy
Vaultシークレットを構成した状態で、Oracle Cloud Infrastructure SDKを使用して、各シークレットに対するOCIDsを使用してそれらにアクセスできます。このソリューションで後述する例の機能では、V_KEYSTORE、V_KS_PASSおよびV_PK_PASSプロパティが使用されます。

Oracle Identity Cloud ServiceでのOracle Visual Builderアプリケーションの構成

Oracle Visual Builderアプリケーションには、信頼できるクライアントとして自動的に構成されるOracle Identity Cloud Serviceアプリケーションが関連付けられています。そのアプリケーションをOracle Functionsリソースのクライアントとして使用できるように構成する必要があります。

提案されたアーキテクチャで示されている相互作用の一部として、Oracle Identity Cloud Serviceインスタンスに関連付けられたOracle Visual Builderアプリケーションは、Oracle Fusion Applications Cloud Serviceとフェデレートされ、Oracle Functionsに接続されたOracle Visual Builderアプリケーションは、APIゲートウェイおよびOracle Functionsリソースに到達可能なアクセス・トークンを生成できる必要があります(スコープ別に設定)。Oracle Identity Cloud ServiceOracle Visual Builderアプリケーションを構成し、新しく作成したOracle Functionsアプリケーションのスコープを追加して、SaaSの機能を拡張するリソースのクライアントとして設定する必要があります。

Oracle Visual Builderで新しいアプリケーションを作成すると、Oracle Identity Cloud Serviceアプリケーションが自動的に作成されます。たとえば、TestSaaSExtensionFNというアプリケーションを作成する場合、Oracle Identity Cloud Serviceコンソールおよびリスト・アプリケーションに移動できます。この場合、TestSaaSExtensionFNというアプリケーションを検索する必要があります。

  1. Oracle Visual Builderアプリケーションを作成します。
  2. Oracle Identity Cloud Serviceで、新しいOracle Visual Builderアプリケーションに対応するアプリケーションにナビゲートします。
  3. 「トークン発行ポリシー」セクションで、「認可リソース」を「特定」に設定し、「スコープの追加」ボタンを使用してOracle Functions API Gatewayインスタンスのスコープを持つリソースを追加します。
    「VBCS IDCSアプリケーション」で「リダイレクトURL」が必須とマークされている場合は、「クライアント構成」で「許可される権限付与タイプ」の「暗黙的」チェック・ボックスが選択されているためです。その場合は、入力でOracle Visual Builder WebアプリケーションのURLを指定する必要があります。これらの値は、必要に応じて後で更新できます。
このプロセスを繰り返して、API Gateway Oracle Functionsアプリケーションに到達する必要のあるOracle Identity Cloud Serviceの追加のOracle Visual Builderアプリケーションごとにスコープを追加します。