Oracle Identity Cloud Serviceを使って、Oracle APEXのアプリケーションをSAMLで認証させてみました。
最初に無料で利用できる範囲を確認します。IDCSのドキュメントの以下のセクションを参照します。
About Oracle Identity Cloud Service Pricing Models
無償の範疇について、以下のように説明されています。
Oracle Identity Cloud Service Foundation: Oracleは、Oracle Software-as-a-Service (SaaS)、Oracle Platform-as-a-Service (PaaS)およびOracle Cloud Infrastructureのみをサブスクライブするお客様に、この無料バージョンのOracle Identity Cloud Serviceを提供します。
顧客は、このバージョンを使用して、ユーザー管理、グループ管理、パスワード管理、基本的なレポートなどの基本的なアイデンティティ管理機能を提供できます。 次の表に示すように、追加機能にはOracle Identity Cloud Service Standardのサブスクリプションが必要です。
サードパーティのSaaS、PaaS、カスタムWebまたはモバイル・アプリケーション、プログラムによるクライアントまたはオンプレミス・アプリケーションがOracle Cloud Infrastructureでホストされている場合でも、これらのアプリケーションとの統合にこのバージョンを使用することはできません。 これらのユースケースでは、Oracle Identity Cloud Service Standardが必要です。
Oracle APEXではPaaSのAutonomous Databaseを利用している場合でも、SAML認証を使うにはORDSを別立てし独自ドメインを割り当てる必要があります。そのため、どのようにサードパーティの環境とOracle Cloudの環境を見分けるのか、正直なところ分かりません。クライアントはブラウザですから、ネットワークとしてもOracle Cloudの外にあります。
技術的にどのような方法で範囲を限定するのか分かりませんが、ドキュメントの記述に依るとOracle CloudでOracle APEXを動かしている限り、Oracle Identity Cloud Service Foundationの範疇のようです。他のクラウドやオンプレミスで稼働しているOracle APEXの環境も(Oracle APEXはサードパーティの製品ではないため)、無償利用の範疇に入るようにも読めます。後者については、公式なパスを通して確認する必要があるかもしれません。
とりあえず、今回はOracle Cloudで稼働しているOracle APEXのインスタンスを使用するため、無償利用の範囲と判断して作業を行います。
アップグレードしていないFree Tierアカウントで、Oracle Identity Cloud Serivce側の作業を行います。
OCIコンソールよりアイデンティティとセキュリティのフェデレーションを開きます。
Oracle Cloudのアカウントを作成すると、アイデンティティ・プロバイダとしてOracleIdentityCloudServiceがあらかじめ作成されます。
このリンクをクリックして開きます。
Oracle Identity Cloud Service Consoleのリンクをクリックし、Oracle Identity Cloud Serviceのコンソールを開きます。
以下のような形式のURLです。apex_authentication.saml_callbackの部分は、どのインスタンスでも同じです。ベースとなるURLはOracle APEXが稼働している環境に合わせて変更します。
https://test.mydomain.dev/ords/xepdb1/apex_authentication.saml_callback
https://test.mydomain.dev/ords/apex_authentication.saml_callback
NameID形式とNameID値はそれぞれデフォルトの、電子メール・アドレス、プライマリ電子メールのままとします。ここで指定された値をOracle APEX側で読み取るために、内部およびワークスペース・アプリケーション用のSAML: APEX属性の名前IDフォーマットとして、以下を指定します。NameID形式やNameID値をデフォルトから変更した場合、APEX属性の名前IDフォーマットも変更が必要です。
openssl genrsa -out private.pem 2048
openssl req -new -key private.pem -out test.csr
openssl x509 -req -days 3650 -signkey private.pem -in test.csr -sha256 -extfile v3.ext -out cert-test.pem
keyUsage = digitalSignature,keyEncipherment
% openssl genrsa -out private.pem 2048
Generating RSA private key, 2048 bit long modulus
............................................+++
......................................+++
e is 65537 (0x10001)
% openssl req -new -key private.pem -out test.csr
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) []:
State or Province Name (full name) []:
Locality Name (eg, city) []:
Organization Name (eg, company) []:
Organizational Unit Name (eg, section) []:
Common Name (eg, fully qualified host name) []:test.mydomain.dev
Email Address []:
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
% openssl x509 -req -days 3650 -signkey private.pem -in test.csr -sha256 -extfile v3.ext -out cert-test.pem
Signature ok
subject=/CN=test.apexugj.dev
Getting Private key
%
<md:SingleSignOnService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" Location="https://idcs-********.identity.oraclecloud.com/fed/v1/idp/sso"/>
<md:SingleLogoutService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" Location="https://idcs-***************.identity.oraclecloud.com/fed/v1/idp/slo"
ResponseLocation="https://idcs-************.identity.oraclecloud.com/fed/v1/idp/slo"/>
java -jar ords.war set-property security.externalSessionTrustedOrigins https://idcs-**********************.identity.oraclecloud.com
変更を反映するには、ORDSの再起動が必要です。
以上でOracle APEX側の設定は完了です。
https://ホスト名/ords/PDB名/r/ワークスペース名/samltest/home
今回の例では、以下のURLにアクセスします。
https://test.mydomain.dev/ords/xepdb1/r/apexdev/samltest/home