こんにちは、亀井です。

最近はコロナ対策で社外から接続するために、ゼロトラスト(社内社外のネットワークにかかわらず信用しない構成)の対応を行う会社が増えているのではないでしょうか。
Oracle APEXでは、アプリケーションのSSO(シングルサインオン)連携が可能ですが、開発環境(アプリケーション・ビルダー等の画面)についてもシングルサインオン化することが出来ます。

本記事ではAzure AD(Active Directory)のSSO環境につなぐことで、Oracle APEXをよりセキュアに使いましょうという内容です。
説明で利用している環境は、Oracle APEX 20.1.0.00.13 です。また、Azure ADの操作が可能の想定です。

接続条件設定やMicrosoft Intuneによる端末制限などについてはここでは触れません。別の記事などで探してみてください。

更新履歴

日付更新概要
2020/11/25記事公開

対応バージョン

製品名バージョン
Oracle APEX20.1.0.00.13
Oracle Database12.2 – 19.6

設定の流れ

  • Azure ADでログイン先のアプリの登録を行います。
  • Azure AD上でOracle APEX のURLなどを登録します。
  • Azure AD上で生成された値を利用して、Oracle APEXの管理者画面(INTERNALワークスペース)でログインの設定を変更します。
  • ログインのテストでうまく動けば開発環境のSSO化の完了です!

Azure ADの設定

アプリケーションの登録

  1. まずはAzure Portalにログインし、Azure ADを選択します。
    Azure ADの選択
  2. 次に左側のメニューから「アプリの登録」を選択します。
    アプリの登録
  3. 「新規登録」をボタンを押し、新規登録します。
    新規登録
  4. アプリケーションの登録画面で、任意の名前を設定し、「この組織ディレクトリのみに含まれるアカウント」を選択します。自社ドメインのみ開発権限を与える想定です。
    アプリの登録設定_名前
  5. すぐ下にあるリダイレクトURIにはOracle APEXのベースURLに「apex_authentication.callback」を指定して登録します。(こちらの指定は後からでもできます)
    アプリの登録設定_リダイレクトURI

「apex_authentication.callback」ですが、こちらを指定することで、データ受け取り用の処理が実行されます。

apex_authentication.callback について

マニュアルを参考にするとなんとなくわかると思いますが、apex_authentication.callbackを指定することでPL/SQLの関数が呼ばれます。この場合、Azure ADの認証後、このURL(PL/SQL関数)がコールバックされます。OAuth2.0のコールバックに渡される引数に合わせてパラメータが準備されており、こちらの関数によりデータベースで認証結果を受け取ることが出来ます。

Oracle Application ExpressRelease 19.1 APIリファレンス

4.3 CALLBACK 1プロシージャ

余談ですがどこをみても説明が全然なく、理解するのに苦労しました・・。

Oracle APEX 連携設定

  1. アプリケーションの登録が出来たら、一度Oracle APEXの管理者画面(INTERNALワークスペース)にログインします。
    「インスタンスの管理」 > 「セキュリティ」を選択します。
    APEX連携設定_セキュリティ
  2. 下の方にある「開発環境認証スキーム」から「Socail Sign-In」の鉛筆マークを選択します。
    APEX連携設定_Socail_Sign-In
  3. 開いた画面の「OAuth2資格証明」にAzure ADの設定値を入力します。
    まずはクライアントIDです。(Azureの画面を閉じてしまった方は、Azure Portalから、Azure Active Directoryを選んで、アプリの登録から今回作成した設定を開いてください。)
    「概要」を選択しアプリケーション(クライアント)IDをコピーします。(表示はIDが入りきらず…となっています)
    APEX連携設定_Client_ID
  4. Oracle APEXの画面にあるクライアントIDに貼り付けます。
    APEX連携設定_Client_ID_toAPEX
  5. 続けて「クライアント・シークレット」の作成と貼り付けを行います。
    Azure ADの概要画面から「証明書とシークレット」の画面へ移動します。
    APEX連携設定_証明書
  6. 「新しいクライアントシークレット」押して新規の証明書を生成します。
    APEX連携設定_証明書生成画面
  7. 適当な名前を付けて、期限を指定したら証明書が生成されます。(2020/11/24現在で1年/2年/なしの3種類が選択できました)
    作成されたクライアントシークレット(値の列)をコピーします。
    APEX連携設定_証明書生成後
  8. Oracle APEXの画面の「クライアントシークレット」と「クライアントシークレットの確認」に貼り付けます。
    APEX連携設定_証明書生成後
  9. 次にOracle APEXの画面「OAuth2資格証明」の少し下にある、「認証スキーム属性」の設定を行います。
    Azure ADの画面に戻り、「概要」を選択します。「エンドポイント」というリンクがあるので、こちらをクリックします。
    APEX連携設定_エンドポイント
  10. いくつかの構成用の設定が出てきますので、その中から「OpenID Connect メタデータ ドキュメント」を選んでコピーします。
    APEX連携設定_OpenIDメタデータ
  11. Oracle APEXの「認証スキーム属性」にある「Authentication Provider」で「OpenID Connect Provider」を選択し、コピーした文字列を「Discovery URL」に貼り付けます。
    APEX連携設定_Discovery_URL
  12. 「Scope」にAzure認証後にOracle APEX側で取得したい対象を入力します。こちらの値についてはAzureのマニュアルを参照してください。
    例として「profile,email,offline_access」を設定します。
    APEX連携設定_Scope
    ユーザーのログインはemail(emailで取得)を利用するのでそのままとしていますが、必要に応じてpreferred_username(profileで取得)等に変更してください。 profileの取得については、Microsoft ID プラットフォーム エンドポイントでのアクセス許可と同意が参考になります。
    取得したデータはMicrosoft ID プラットフォームの ID トークンが参考になります。
    • 検証などしていないのでここでは割愛しますが、取得した値での細かい制御を行いたい場合、認証後のプロシージャ名を指定することで出来るかと思います。プラグイン作成などもそうですが、そのような管理でのコード追加や高度な開発によるカスタマイズはマニュアルに方法が載っていないことが殆どなので、Oracle社ブログ、動作確認、サポートへの確認を駆使して実装する必要があります。
  13. 最後に保存してこの設定を利用しますが、ここでログインが切り替わった時に、emailと同じユーザー名がOracle APEX上(INTERNALワークスペース)に存在しない場合ログインができなくなるので注意してください。
    不安な場合、設定保存する際に「カレント・スキームにする」ではなく、一度「変更の適用」でデータを保存して、ユーザーの登録状況を確認してください。
    APEX連携設定_変更の適用
    「カレント・スキームにする」を選択した時に、元に戻すためのプロシージャについての警告が出ます。
    APEX連携設定_変更時注意
    一応実行方法について書いておきます。以下でAPEX管理のユーザーログインに戻せます。
ALTER SESSION SET CURRENT_SCHEMA = APEX_XXXXXX; -- apexの現行バージョンのユーザ
begin
  apex_instance_admin.set_parameter('APEX_BUILDER_AUTHENTICATION', 'APEX');
  commit;
end;

ログイン

  1. この時点で動作するかと思います。ログインしてみてください。ログインしたままのブラウザをそのままに、別のブラウザを立ち上げてログインするといいと思います。
    試行した環境では最初に同意の画面が出ましたが、「組織の代理として同意する」にチェックを入れて「承諾」を押せば、ログイン出来るようになります。
    APEX連携設定_ログイン時同意の確認
  2. ログイン画面では、登録されているユーザがログイン出来るワークスペースが選択できるようになります。便利ですね。
    ログイン画面
  3. 最後に追加の構成についてですが、Azure AD側でログイン時のロゴ等設定出来る場所がありますので、そちらにアプリケーションの最初の移動先のデフォルトを入力します。
    Azure ADのトップから、「ブランド」を選択してください。「ホームページURL」にOracle APEXのベースURLを入力します。
    APEX連携設定_ホームページURL