トークン・ベースの認証の使用を有効にした場合、以下のプロキシ認証タイプを選択できます。なしの確認は除きます。
- 単一セッション
- 二重セッション(パスワード・ロール)
- 二重セッション(ユーザー、ロールの自動検出)
これらの設定は、以下のドキュメントでオプションとして説明されています。
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を起動します。
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_ROLE1とPROXY_ROLE2を作成します。
create role proxy_role1;
create role proxy_role2;
これから、それぞれのプロキシ認証タイプの接続を作成し、検証していきます。
単一セッション
実際にデータベースを操作するユーザーとしてPROXY_USER1を作成します。ユーザー認証はグローバル・ユーザーPROXY_CLIENTとして実施します。データベースに接続するに当たって、PROXY_USER1はユーザー認証をしません。
create user proxy_user1 no authentication account unlock;
grant create session, create view to 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つのビューCUSTOMERS、CUSTOMERS_ROLE1、CUSTOMERS_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ともに、検索しても行は返されません。
二重セッション(パスワード、ロール)
データベース・ユーザーとして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;
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ワークシートを開き先ほどと同じスクリプトを実行し、ビューCUSTOMERS、CUSTOMERS_ROLE1、CUSTOMERS_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
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を使えるようにします。
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になっていることが確認できます。
接続時に割り当てられているユーザーはPROXY_ROLE1なので、ユーザーPROXY_USER2でもビューCUSTOMERS_ROLE1は検索できます。
select * from customers_role1
マッピングを上手に使用すると、IAM上で所属するグループが異なると、ユーザーからは同じMCPサーバーに接続しているも関わらず、(データベース・ユーザーが異なるため)まったく異なるデータが見えたり、許可する操作を制限することもできます。
以上で3種類のプロキシ認証タイプの挙動の確認ができました。
完
























