ノート:
- このチュートリアルでは、Oracle Cloudへのアクセスが必要です。無料アカウントにサインアップするには、Oracle Cloud Infrastructure Free Tierの開始を参照してください。
- Oracle Cloud Infrastructureの資格証明、テナンシおよびコンパートメントの値の例を使用します。演習を完了するときに、これらの値をクラウド環境に固有の値に置き換えます。
OCI IAMドメインによって発行されたJWTトークンを使用した、ORDSの保護されたリソースへのアクセス
イントロダクション
Oracle Cloud Infrastructure Identity and Access Management (OCI IAM) uses identity domains to provide identity and access management features such as authentication, Single Sign-On (SSO), and identity lifecycle management for OCI as well as for Oracle and non-Oracle applications, whether SaaS, cloud hosted, or on-premises.
Oracle REST Data Services (ORDS)は、HTTPSとOracle Databaseをブリッジします。中間層JavaアプリケーションであるORDSは、データベース管理REST API、SQL Developer Web、PL/SQL Gateway、Simple Oracle Document Access (SODA) for REST、およびOracle Databaseのデータおよびストアド・プロシージャと対話するためのRESTful Webサービスを公開する機能を提供します。
ORDSリリース23.3では、JSON Web Token (JWT)のサポートが導入されています。これらのベアラー・トークンを使用すると、ORDS開発者は、認証および認可をOAuth2準拠のアイデンティティ・プロバイダ(IdP)に委任してJWTアクセス・トークン(ORDSによって、ORDSで保護されたリソースへのアクセスを提供するために検証できる)を発行できます。
このチュートリアルでは、OCI IAMドメインによって発行されたJWTトークンを使用して、ORDS内の保護されたリソースにアクセスする方法を示します。このデモンストレーションでは、OCIでOracle Autonomous Databaseを使用します。OCIには、事前構成済でフルマネージドのORDSアプリケーションが付属しています。
次の図は、ソリューション・アーキテクチャの概要を示しています。
目的
- OCI IAMドメインによって発行されたJWTトークンを使用して、ORDS内の保護されたリソースにアクセスします。
前提条件
-
OCIのユーザーは、Oracle Autonomous DatabasesおよびOCI IAMドメインを管理するために必要なポリシーを持っている必要があります。すべてのサービスのポリシー参照の詳細は、ポリシー・リファレンスを参照してください。
-
Oracle Autonomous Databaseが使用可能である必要があります。詳細は、Autonomous Databaseインスタンスのプロビジョニングを参照してください。
-
JWTを使用した認証および認可がORDSで受け入れられるようにするには:
-
OAuth2準拠のIdP (アイデンティティ・ドメインを使用するOCI IAM、Auth0など)が、ORDSリソースへのアクセスが許可されているユーザーに対してJWTを発行するように設定されている必要があります。
-
認可ポリシーでカスタム・クレームを使用する場合は、IdPが、発行するJWTにカスタム・クレームを追加するように設定されている必要があります。
-
-
発行元のIdPによって提供される対応する公開検証キーを使用してJWTを検証するには:
-
署名アルゴリズムは、
RS256
、RS384
またはRS512
である必要があります。 -
公開検証キーは2048ビット以上、4096ビット以下である必要があります。
-
公開検証キーは、JSON Webキー(JWK)形式で指定し、認証なしでORDSからアクセスできる必要があります。
-
-
JWK URIの要件:
-
JWK URIはORDSからアクセスできる必要があります。
-
JWT署名を検証するには、JWKSにキー・パラメータが存在する必要があります。
-
デフォルトでは、JWKSのサイズは10,000バイトまでです。
-
ノート: OCI IAMドメインおよびそれによって発行されたJWTトークンは、前述のすべての要件を満たします。
タスク1: データベース・スキーマのORDSの設定、APIエンドポイントの定義およびアクセス制御の構成
-
OCIコンソールにログインし、「Oracle Database」に移動して「Autonomous Database」をクリックします。
-
「プロビジョニングされたAutonomous Databaseインスタンス」、「データベース・アクション」、「SQL」の順にクリックします。
-
次の問合せを実行して、JWTをサポートするORDSバージョン23.3以上があることを確認します。
SELECT * FROM ORDS_METADATA.ORDS_VERSION;
-
次の問合せを実行してユーザー(
ordstest
)を作成し、必要な権限を割り当てます。CREATE USER ordstest IDENTIFIED BY "<Password>"; GRANT CONNECT, RESOURCE TO ordstest; ALTER USER ordstest DEFAULT ROLE CONNECT, RESOURCE;
-
次の問合せを実行して、スキーマのORDSを有効にし、REST API機能を許可します。
BEGIN ORDS_ADMIN.ENABLE_SCHEMA( p_enabled => TRUE, p_schema => 'ordstest', p_url_mapping_type => 'BASE_PATH', p_url_mapping_pattern => 'ordstest', p_auto_rest_auth=> FALSE ); commit; END; /
-
次の問合せを実行して、
ordstest
スキーマにemp
という名前の表を作成し、サンプル・データを挿入します。CREATE TABLE ordstest.emp ( EMPNO NUMBER(4,0), ENAME VARCHAR2(10 BYTE), JOB VARCHAR2(9 BYTE), MGR NUMBER(4,0), HIREDATE DATE, SAL NUMBER(7,2), COMM NUMBER(7,2), DEPTNO NUMBER(2,0), CONSTRAINT PK_EMP PRIMARY KEY (EMPNO) );
Insert into ordstest.EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7369,'SMITH','CLERK',7902,to_date('17-DEC-80','DD-MON-RR'),800,null,20); Insert into ordstest.EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7499,'ALLEN','SALESMAN',7698,to_date('20-FEB-81','DD-MON-RR'),1600,300,30); Insert into ordstest.EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7521,'WARD','SALESMAN',7698,to_date('22-FEB-81','DD-MON-RR'),1250,500,30); Insert into ordstest.EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7566,'JONES','MANAGER',7839,to_date('02-APR-81','DD-MON-RR'),2975,null,20); Insert into ordstest.EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7654,'MARTIN','SALESMAN',7698,to_date('28-SEP-81','DD-MON-RR'),1250,1400,30);
-
次の問合せを実行して、APIエンドポイントを含むORDSモジュール(
demo
)を定義します。BEGIN ORDS_ADMIN.DEFINE_MODULE( p_schema => 'ordstest', p_module_name => 'demo', p_base_path => '/demo/', p_items_per_page=> 1000, p_status => 'PUBLISHED', p_comments=> '' ); COMMIT; END; /
-
次の問合せを実行して、特定のRESTリソースにマップするテンプレート
emp
を定義します。BEGIN ORDS_ADMIN.DEFINE_TEMPLATE( p_schema => 'ordstest', p_module_name => 'demo', p_pattern => 'emp', p_priority => 0, p_etag_type => 'HASH', p_comments => '' ); COMMIT; END; /
-
次の問合せを実行して、
emp
のGETリクエスト・ハンドラを作成します。これにより、表emp
からデータを返す単純なSQL問合せが実行されます。BEGIN ORDS_ADMIN.DEFINE_HANDLER( p_schema => 'ordstest', p_module_name => 'demo', p_pattern => 'emp', p_method => 'GET', p_source_type => ords.source_type_collection_feed, p_source => 'select * from emp', p_items_per_page => 25, p_comments => '' ); COMMIT; END; /
emp
表は、「ツール構成」で使用可能なOracle Autonomous DatabasesのORDSパブリック・アクセスURLに/ordstest/demo/emp
を追加することで、認証なしで表示できます。Postmanはこのチュートリアルで使用されます。 -
次の問合せを実行して、
demo
モジュールを保護するための権限(privilegetest
)を定義します。DECLARE L_PRIV_ROLES owa.vc_arr; L_PRIV_PATTERNS owa.vc_arr; L_PRIV_MODULES owa.vc_arr; BEGIN L_PRIV_MODULES( 1 ) := 'demo'; ORDS_ADMIN.DEFINE_PRIVILEGE( P_Schema=> 'ordstest', P_PRIVILEGE_NAME => 'privilegetest', P_ROLES => L_PRIV_ROLES, P_PATTERNS => L_PRIV_PATTERNS, P_MODULES => L_PRIV_MODULES, P_LABEL => 'privilegetest', P_DESCRIPTION => 'Demonstrate controlling access with priviliges', P_COMMENTS=> '' ); COMMIT; END; /
demo
モジュールはprivilegetest
権限によって保護されているため、適切な認可がないとアクセスできません。アクセスを有効にするには、ordstest
スキーマのJWTプロファイルを作成する必要があります。これにより、ORDSはJWTベアラー・トークンを検証し、デモ・モジュールなどの保護されたリソースへのアクセス権を付与できます。
タスク2: ORDS JWTプロファイルの作成
JWTプロファイルは、OAUTH.CREATE_JWT_PROFILE
プロシージャを使用してREST対応スキーマ内に作成できます。ただし、定義できるJWTプロファイルはスキーマごとに1つのみです。既存のJWTプロファイルを更新するには、新しいJWTプロファイルを作成する前に削除する必要があります。
BEGIN
OAUTH_ADMIN.DELETE_JWT_PROFILE(p_schema=>'ordstest');
OAUTH_ADMIN.CREATE_JWT_PROFILE(
p_schema => 'ordstest',
p_issuer => 'https://idcs-123456789abcdefghijklmnopqrstuvw.identity.oraclecloud.com',
p_audience => 'ords/ordstest/',
p_jwk_url =>'https://idcs-123456789abcdefghijklmnopqrstuvw.identity.oraclecloud.com:443/admin/v1/SigningCert/jwk'
);
COMMIT;
END;
/
このJWTプロファイルでは、発行者、オーディエンスおよびJWK URLを指定します。
p_issuer
はnull以外の値である必要があります。また、JWTベアラー・トークンでのiss
クレームと一致している必要があります。p_audience
はnull以外の値である必要があります。また、JWTベアラー・トークンでのaud
クレームと一致している必要があります。p_jwk_url
は、nullでないhttps://
で始まる値である必要があり、この値により、認可サーバーによって提供された公開検証キーをJSON Web Key (JWK)形式で指定します。
OCI IAMドメインのIssuer
およびJWK URI
を取得するには、次のイメージに示すように、GETリクエストをOCI IAMドメインURLに送信し、/.well-known/openid-configuration
を追加します。
JWTプロファイル構成を確認するには、ordstest
ユーザーとしてログインし、次のSQL問合せを実行します。
SELECT * FROM ORDS_METADATA.USER_ORDS_JWT_PROFILE;
この問合せでは、JWTプロファイル詳細が取得され、発行者、オーディエンスおよびJWK URLが正しく構成されていることを確認します。
JWTプロファイルを構成すると、エンド・ユーザーは、JWTプロファイルで指定されたOCI IAMドメインなどのOAuth 2.0準拠のIdPによって発行されたJWTトークンを表示することで、ORDS保護リソースにアクセスできます。JWTベアラー・トークンが正常に検証されると、ORDSは次のものを受け入れます。
-
そのリクエストを発行した認証済ユーザーとしてのJWTサブジェクト・クレーム。
-
REST対応スキーマORDS権限としてのJWTスコープ・クレーム。そのユーザーがそのユーザーにかわってその権限を使用してそのアプリケーションに同意したものです。
タスク3: 認証なしでのOCI IAMドメイン署名証明書へのORDSアクセスの有効化
-
OCIコンソールに移動し、「アイデンティティとセキュリティ」、「アイデンティティ」に移動して、「ドメイン」をクリックします。
-
作業するアイデンティティ・ドメインの名前をクリックします。必要なドメインを見つけるには、コンパートメントの変更が必要になる場合があります。「設定」および「ドメイン設定」をクリックします。
-
「署名証明書へのアクセス」セクションで、「クライアント・アクセスの構成」を選択し、「変更の保存」をクリックします。これにより、ORDSは認証なしでアイデンティティ・ドメインの署名証明にアクセスできます。
タスク4: リソース・サーバーとクライアント、JWTスコープおよびORDS権限の構成
必要なORDS権限に一致するスコープでJWTを発行するようにIdPを構成する必要があります。ORDS内のリソースが権限によって保護されている場合は、その権限名をスコープとして定義する必要があります。このスコープにより、アプリケーションはユーザーのかわりにアクセスをリクエストできます。発行されたJWTには、要求としてスコープを含める必要があります。OCI IAM OAuth2サービスを使用して認可を適用するため、いくつかのリソース・サーバーおよびクライアントを設定する必要があります。
タスク4.1: 目的のオーディエンスおよびスコープを持つリソース・サーバー・タイプの機密アプリケーションの作成
-
作業中のアイデンティティ・ドメインに移動し、「統合アプリケーション」をクリックします。
-
「アプリケーションの追加」、「機密アプリケーション」を選択し、「ワークフローの起動」をクリックします。
-
アプリケーションの「名前」(
ORDS-SERVER
など)を入力し、「次へ」をクリックします。 -
「リソース・サーバー構成」セクションで、「このアプリケーションをリソース・サーバーとして今すぐ構成します」を選択します。
-
JWTプロファイルに一致するプライマリ・オーディエンスおよびORDS権限に一致するスコープを使用してリソース・サーバーを構成します。
-
「次へ」→「終了」をクリックします。
-
アプリケーションの概要ページで、「アクティブ化」を選択し、アプリケーションのアクティブ化を確認します。機密アプリケーションがアクティブ化されます。
タスク4.2: 目的のスコープが割り当てられているクライアント・タイプの機密アプリケーションの作成
-
作業中のアイデンティティ・ドメインに移動し、「統合アプリケーション」をクリックします。
-
「アプリケーションの追加」、「機密アプリケーション」を選択し、「ワークフローの起動」をクリックします。
-
アプリケーションの「名前」(
ORDS-CLIENT
など)を入力し、「次へ」をクリックします。 -
「Client configuration」セクションで、「Configure this application as a client now」を選択します。
-
「認可」セクションで、「クライアント資格証明」を選択します。
ノート:このチュートリアルでは、「クライアント資格証明」を「付与タイプ」として使用しています。ユーザー対応クライアントの認可コード・フローなど、要件に基づいて別の付与タイプを選択できます。
-
「クライアント・タイプ」で、「機密」を選択します。
-
「トークン発行ポリシー」セクションで、「認可済リソース」として「特定」を選択します。
-
「リソースの追加」をクリックし、「リソース」で「スコープの追加」を選択します。タスク4.1で作成したリソース・サーバーに必要なスコープを選択します。たとえば、
privilegetest
です。 -
「次へ」→「終了」をクリックします。
-
「アプリケーションの概要」ページで、「アクティブ化」を選択し、アプリケーションのアクティブ化を確認します。機密アプリケーションがアクティブ化されます。
-
このクライアント・アプリケーションの「クライアントID」と「クライアント・シークレット」をコピーします。認証にはこれらの資格証明が必要です。
タスク5: JWTベアラー・トークンを使用したORDSへのリクエストの送信
次の図に示すように、「付与タイプ」がclient_credentials
で、「スコープ」がprivilegetest
のポスト・リクエストをOCI IAMドメイン・トークン・エンドポイントに送信します(Postmanを使用)。
ノート: OCI IAMドメインからベアラー・トークンをリクエストする場合は、オーディエンスおよびスコープをスコープ・フィールドに含める必要があります。
スコープ、発行者およびオーディエンスのJWTトークンを検証します。
これで、ordstest
スキーマの保護されたORDSリソース(デモ・モジュール)にアクセスするには、次の図に示すように、有効なJWTベアラー・トークンを取得リクエストとともに指定します。
ORDSは、JWK URLから公開キーを取得し、トークンの署名を検証して、トークンを検証します。署名が有効な場合、ORDSは、iss
(発行者)およびaud
(オーディエンス)クレームがJWTプロファイルで定義されたクレームと一致するかどうかをチェックします。また、スコープ要求がリソースを保護する権限に対応していることも検証します。すべての条件が満たされた場合、ユーザーには保護されたリソースへのアクセス権が付与されます。
関連リンク
承認
- 作成者 - Chaitanya Chintala (クラウド・セキュリティ・アドバイザ)
その他の学習リソース
docs.oracle.com/learnの他のラボを確認するか、Oracle Learning YouTubeチャネルで無料のラーニング・コンテンツにアクセスしてください。また、education.oracle.com/learning-explorerにアクセスしてOracle Learning Explorerになります。
製品ドキュメントについては、Oracle Help Centerを参照してください。
Access Protected Resources in ORDS using a JWT Token Issued by OCI IAM Domains
G28850-01
Copyright ©2025, Oracle and/or its affiliates.