2026年6月3日水曜日

開発者サービスの接続で設定できるプロキシ認証タイプの挙動を確認する

以前の記事「Database Tools MCP Serverを構成する - 認証済プリンシパルとトークン編」でスキップした接続のプロキシ認証タイプについて、それぞれのオプションの設定方法を確認します。元記事からの継続作業とし、作業環境もそのまま踏襲します。

トークン・ベースの認証の使用有効にした場合、以下のプロキシ認証タイプを選択できます。なしの確認は除きます。
  1. 単一セッション
  2. 二重セッション(パスワード・ロール)
  3. 二重セッション(ユーザー、ロールの自動検出)
これらの設定は、以下のドキュメントでオプションとして説明されています。

Use Proxy Authentication with IAM Authentication
https://docs.oracle.com/en-us/iaas/database-tools/doc/use-proxy-authentication-iam-authentication.html
  • Option 1: Specify the proxy client user
  • Option 2: Provide proxy client credentials and control roles
  • Option 3: Auto-detect the proxy client (double session)

事前準備



Oracle Cloudのコンソールにサインインしているユーザーで接続の検証を実施します。そのため、とりあえずは現在サインインしているユーザーでグローバル・ユーザーを作成します。


作業を行なうデータベースはAutonomous Database 19cのdbtoolsmcpです。すでに管理者ユーザーADMINによる接続はadmin@dbtoolsmcpとして作成されています。

この接続を開き、アクションからSQLclを起動します。


SQLclより、以前に作成したユーザーTOKEN_TESTが残っていたら削除します。

drop user token_test cascade;

続いて、グローバル・ユーザーとしてproxy_clientを作成します。IAM_PRINCIPAL_NAMEに、Oracle Cloudのコンソールにサインインしている管理者ユーザーのメール・アドレスを指定します。

create user proxy_client identified globally as 'IAM_PRINCIPAL_NAME=<管理者のメール・アドレス>’
grant create session to proxy_client;

続けて、設定の確認に使用するロール、PROXY_ROLE1PROXY_ROLE2を作成します。

create role proxy_role1;
create role proxy_role2;


これから、それぞれのプロキシ認証タイプ接続を作成し、検証していきます。


単一セッション



実際にデータベースを操作するユーザーとしてPROXY_USER1を作成します。ユーザー認証はグローバル・ユーザーPROXY_CLIENTとして実施します。データベースに接続するに当たって、PROXY_USER1はユーザー認証をしません。

そのため、ユーザーPROXY_USER1は以下のコマンドで作成します。

create user proxy_user1 no authentication account unlock;
grant create session, create view to proxy_user1;


グローバル・ユーザーPROXY_CLIENTでユーザー認証し、データベース・ユーザーPROXY_USER1としてデータベースに接続できるように、PROXY_USER1を設定します。

alter user proxy_user1 grant connect through proxy_client;


以上でデータベース側の準備は完了です。Oracle Cloudのコンソールより接続を作成します。

接続の名前はtest-proxy-option-1とします。それ以外の設定は、以前の記事で作成した接続dbtoolsmcp-tokenと同じです。




認証プロキシ認証タイプ単一セッションを選択します。

プロキシ・クライアント・ユーザー名には、データベース・ユーザーであるPROXY_USER1を指定します。グローバル・ユーザー(IAMで認証されているユーザー)は、ユーザー認証のみに使用します。

以上で接続test-proxy-option-1を作成します。


接続が作成されたら、アクションから検証を実行します。


プロキシ・ユーザーPROXY_CLIENT(このユーザーがIAMで認証されたユーザー)で、それ以外のセッション・ユーザー現在のスキーマPROXY_USER1であることを確認します。


SQLワークシートを開きます。以下のDDLを実行し、3つのビューCUSTOMERSCUSTOMERS_ROLE1CUSTOMERS_ROLE2を作成します。スキーマSHにある表CUSTOMERSを検索するビューです。

ビューCUSTOMERS_ROLE1は接続ユーザーがロールPROXY_ROLE1を持つときに限り、検索結果を返します。ビューCUSTOMERS_ROLE2は接続ユーザーがロールPROXY_ROLE2を持つときに限り、検索結果を返します。
create or replace view customers as
select * from sh.customers;

create or replace view customers_role1 as
select * from sh.customers
where
sys_context('SYS_SESSION_ROLES','PROXY_ROLE1') = 'TRUE';

create or replace view customers_role2 as
select * from sh.customers
where
sys_context('SYS_SESSION_ROLES','PROXY_ROLE2') = 'TRUE';

ビューCUSTOMERSを検索してみます。SH.CUSTOMERSの内容が返されます。

select * from customers


ユーザーPROXY_USER1はロールPROXY_ROLE1、PROXY_ROLE2ともに付与されていないため、CUSTOMERS_ROLE1、CUSTOMERS_ROLE2ともに、検索しても行は返されません。

select * from customers_role1


データベースを操作するユーザーPROXY_USER1はパスワードを持たないため、パスワードが漏洩することはありません。


二重セッション(パスワード、ロール)



データベース・ユーザーとしてPROXY_USER2を作成します。グローバル・ユーザーPROXY_CLIENTを通してPROXY_USER2としてデータベースに接続する際に、(PROXY_USER2の)パスワードを要求します。また、データベースに接続時にロールPROXY_ROLE2をセッションに割り当てます。

以下のコマンドを実行し、データベース側を準備します。

create user proxy_user2 identified by "パスワード";
grant proxy_role2 to proxy_user2;
grant create session, create view to proxy_user2;

作成したデータベース・ユーザーPROXY_USER2に、グローバル・ユーザーPROXY_CLIENTを通して接続できるようにします。

authentication required句を付与しているため、接続時にPROXY_USER2のパスワードを要求されます。

alter user proxy_user2 grant connect through proxy_client with role proxy_role2 authentication required;


このユーザーを使用する接続としてtest-proxy-option-2を作成します。

プロキシ認証タイプとして二重セッション(パスワード、ロール)を選択します。プロキシ・クライアント・ユーザー名PROXY_USER2を指定します。

接続にあたってユーザーPROXY_USER2に設定したパスワードを要求されるため、パスワード・シークレットを作成して、プロキシ・クライアント・ユーザーのパスワード・シークレットに割り当てます。

プロキシ・クライアント・データベース・ロールとしてPROXY_ROLE2を設定します。

以上の設定で接続test-proxy-option-2を作成します。


接続が作成されたら、先ほどと同様にアクション検証を実行します。セッション・ユーザーがデータベース・ユーザーのPROXY_USER2であることを確認します。


SQLワークシートを開き先ほどと同じスクリプトを実行し、ビューCUSTOMERSCUSTOMERS_ROLE1CUSTOMERS_ROLE2を作成します。

その後、ビューCUSTOMERS_ROLE2を検索します。ユーザーPROXY_USER2にはセッション・ロールとしてPROXY_ROLE2が割り当てられているため、表SH.CUSTOMERSの内容が検索されます。

select * from customers_role2


すでにパスワード付きのデータベース・ユーザーが作成済みで、そのユーザーでデータベース・ベースを操作したい場合に使用できる設定です。


二重セッション(ユーザー、ロールの自動検出)



作成済みのデータベース・ユーザーPROXY_USER1にロールPROXY_ROLE1を割り当て、そのロールを検出してデータベースへの接続ユーザーとなるように設定を変更します。

grant proxy_role1 to proxy_user1;
alter user proxy_user1 grant connect through proxy_client with role proxy_role1;


このユーザーを使用する接続としてtest-proxy-option-3を作成します。

プロキシ認証タイプとして二重セッション(ユーザー、ロールの自動検出)を選択します。クライアントのデータベース・ロールとしてPROXY_ROLE1を設定します。

以上の設定で接続test-proxy-option-3を作成します。


接続が作成されたら、先ほどと同様にアクション検証を実行します。セッション・ユーザーがデータベース・ユーザーのPROXY_USER1であることを確認します。


SQLワークシートを開きます。データベース・ユーザーはPROXY_USER1なので、ビューCUSTOMERS、CUSTOMERS_ROLE1、CUSTOMERS_ROLE2は作成済みです。

ビューCUSTOMERS_ROLE1を検索します。

ユーザーPROXY_USER1にはセッション・ロールとしてPROXY_ROLE1が割り当てられているため、表SH.CUSTOMERSの内容が検索されます。

select * from customers_role1


ユーザー、ロールの自動検出では、ビューDBA_PROXIESから確認できるプロキシ設定より、接続対象のデータベース・ユーザーを特定しています。

select client, proxy, role from dba_proxies where proxy = 'PROXY_CLIENT' and role = 'PROXY_ROLE1';

SQL> select client, proxy, role from dba_proxies where proxy = 'PROXY_CLIENT' and role = 'PROXY_ROLE1';

CLIENT         PROXY           ROLE           
______________ _______________ ______________ 
PROXY_USER1    PROXY_CLIENT    PROXY_ROLE1    

SQL> 
接続test-proxy-option-1認証で設定しているのはロールであり、グローバル・ユーザーとデータベース・ユーザーは設定していません。alter user ... grant connect through ...でのグローバル・ユーザーとデータベース・ユーザーの割り当てによって、同じ接続であっても認証されているグローバル・ユーザーが異なれば、異なるデータベース・ユーザーでデータベースに接続することができます。

アイデンティティ・ドメインDefaultに作成済みのユーザーで、異なるグローバル・ユーザーでの接続を確認してみます。

グループAdministratorsに所属するユーザーが接続を操作できるように、あらかじめ以下の2行のポリシー・ステートメントを持つポリシーを、ルート・コンパートメントに作成しておきます。

allow group 'Default'/'Administrators' to manage database-connections in compartment dbtools-mcp
allow group 'Default'/'Administrators' to manage database-tools-connections in compartment dbtools-mcp

グローバル・ユーザーとしてPROXY_CLIENT2を作成し、そのユーザーを通してデータベース・ユーザーPROXY_USER1でデータベースに接続するようにします。データベース・ユーザーPROXY_USER1にロールPROXY_ROLE1を割り当てることにより、先ほど作成した接続test-proxy-option-3を使えるようにします。

create user proxy_client2 identified globally as 'IAM_PRINCIPAL_NAME=<ユーザーのメール・アドレス>';
grant create session to proxy_client2;
grant proxy_role1 to proxy_user2;
alter user proxy_user2 grant connect through proxy_client2 with role proxy_role1;


ビューDBA_PROXIESを確認します。

select client, proxy, role from dba_proxies where role = 'PROXY_ROLE1';
SQL> select client, proxy, role from dba_proxies where role = 'PROXY_ROLE1';

CLIENT         PROXY            ROLE           
______________ ________________ ______________ 
PROXY_USER1    PROXY_CLIENT     PROXY_ROLE1    
PROXY_USER2    PROXY_CLIENT2    PROXY_ROLE1    

SQL>
接続test-proxy-option-3はロールPROXY_ROLE1で接続先を判断します。認証されたグローバル・ユーザーがPROXY_CLIENT2(列PROXY)の場合、実際にデータベースに接続するユーザーはPROXY_USER2(列CLIENT)になります。

一旦、Oracle Cloudのコンソールからサインアウトするか、別のブラウザからOracle Cloudのコンソールに接続して、グローバル・ユーザーPROXY_CLIENT2に紐づけたユーザーでサインインします。

接続test-proxy-option-3の検証を実行します。

セッション・ユーザーPROXY_USER2になっていることが確認できます。


SQLワークシートを開きます。データベース・ユーザーはPROXY_USER2なので、ビューCUSTOMERS、CUSTOMERS_ROLE1、CUSTOMERS_ROLE2は作成済みです。

接続時に割り当てられているユーザーはPROXY_ROLE1なので、ユーザーPROXY_USER2でもビューCUSTOMERS_ROLE1は検索できます。

select * from customers_role1


グローバル・ユーザーへのIAMユーザーのマッピングには、固定のユーザーを指定するIAM_PRINCIPAL_NAMEの他にグループや動的グループを指定するIAM_GROUP_NAMEが使えます。

マッピングを上手に使用すると、IAM上で所属するグループが異なると、ユーザーからは同じMCPサーバーに接続しているも関わらず、(データベース・ユーザーが異なるため)まったく異なるデータが見えたり、許可する操作を制限することもできます。

以上で3種類のプロキシ認証タイプの挙動の確認ができました。