1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Oracle Autonomous AI DatabaseのAI Profile機能で実装するAIアクセス制御

1
Posted at

はじめに

こちらは先日開催された、Oracle Developer Day 2026にて「Autonomous AI Databaseで実現するAIガバナンス実装」というタイトルで登壇した内容の補足になります。

当日の資料はこちらです。

AIエージェント利用時のデータストア側でのアクセス制御の重要性

直接AIエージェントがDBやストレージといったデータストアにアクセスするケースもあれば、MCPサーバーを経由してアクセスするなどいろいろなパターンがあります。

そして、個人利用やPoCといった小規模の利用からスケールして部門単位や全社規模で、AIエージェントがデータストアに対してアクセスする事例は増えていると思います。

そのような状況において求められるのが、厳格なアクセス制御やデータセキュリティかと思います。

AIガバナンスやAIセキュリティといった文脈においては、AIエージェントやアプリケーション側でのガバナンスやセキュリティの実装がフォーカスされがちですが、データストア側でもAIエージェントがアクセスしてくる前提でセキュリティやガバナンスを意識することが求められつつあります。

AIエージェントやアプリケーションは作っては壊すことが多いと思いますので、データストアでのセキュリティやガバナンスに関する機能実装はマストになってくるでしょう。

Autonomous AI DatabaseでできるAI時代のアクセス制御

Autonomous AI Databaseでは、Select AI AgentというDB内でAIエージェントが作成できる機能や、Autonomous AI Database MCP ServerといったMCPサーバーの機能など生成AI関連の機能が多く提供されています。

また、そういった機能をセキュアに利用するために、きめ細かいアクセス制御を実現するための機能やデータセキュリティに関する機能が提供されています。

もちろん、従来からあるVPDやRASなどのDBセキュリティの機能も利用できます。

前置きが長くなりましたが、今回ご紹介したいのがAI Profileという機能です。

AI Profileとは

AI Profileは、上述したSelect AI AgentやいわゆるNL2SQLの機能であるSelect AIといった機能を実行する際に設定が必要になるプロファイルです。

具体的には、ユーザーやユースケースといった単位で、どのLLMを使い、どのテーブルやビューなどのデータベース・オブジェクトへのアクセスを可能にするのかを定義するものになります。

そのため、Select AI Agentのツールでの設定やPython等で作成したカスタムエージェント、アプリケーション側でAIの振る舞いを定義するのではなく、データベース側でデータベース・オブジェクトに対するAIの振る舞いを定義することができます。

AI Profileの設定

前提条件

  • ユーザーに対するDBMS_CLOUD_AIパッケージの実行権限の付与
  • OCI Enterprise AI modelを利用する場合:OCI APIキーを利用したクレデンシャルの作成
  • ChatGPT、Claude、Geminiなど外部のモデルを利用する場合:APIキーによるクレデンシャル作成 + エンドポイントへのネットワークACL許可

AI Profileの設定例

ここでは、OpenAIのモデルを利用して、SHスキーマの任意のオブジェクトへのアクセスを許可するAI Profileを作成しています。

  • provider: OCIやOpenAI、GoogleといったAIプロバイダーを指定する
  • credential_name: 事前に作成済みのクレデンシャルの名前を指定する
  • object_list: Select AI AgentやSelect AIのアクションの対象となるオブジェクトの所有者名とオブジェクト名を指定する
BEGIN                                                                        
  DBMS_CLOUD_AI.CREATE_PROFILE(                                              
      profile_name =>'OPENAI',                                                            
      attributes   =>'{"provider": "openai",                                     
        "credential_name": "GENAI_CRED",
		"object_list": [{"owner": "SH", "name": "customers"},                
                            {"owner": "SH", "name": "countries"},                
                            {"owner": "SH", "name": "supplementary_demographics"},
                           {"owner": "SH", "name": "profits"},                  
                           {"owner": "SH", "name": "promotions"},               
                           {"owner": "SH", "name": "products"}]
       }');                                                                  
END;                                                                         
/

AI Profileでの設定内容を確認する

今回は、SOMAというユーザーに対して、TELCOCUSTOMERCHURNという表に対して、NL2SQLの動作のみを許可しています。
ちなみに、TELCOCUSTOMERCHURNは通信会社の顧客解約(チャーン)分析用データセットになります。

LLMはOCI上のgrok-4を選択しています。

SELECT profile_name, status, description, created, last_modified
FROM   user_cloud_ai_profiles
ORDER  BY profile_name;

"PROFILE_NAME","STATUS","DESCRIPTION","CREATED","LAST_MODIFIED"
"NL2SQL_PROFILE","ENABLED","",26-04-28 15:34:07.507806000 ASIA/TOKYO,26-04-28 15:34:07.507806000 ASIA/TOKYO
SELECT profile_name, attribute_name, attribute_value
FROM   user_cloud_ai_profile_attributes
ORDER  BY profile_name, attribute_name;

"PROFILE_NAME","ATTRIBUTE_NAME","ATTRIBUTE_VALUE"
"NL2SQL_PROFILE","credential_name","OCI_GENAI_CRED"
"NL2SQL_PROFILE","max_tokens","4096"
"NL2SQL_PROFILE","model","xai.grok-4"
"NL2SQL_PROFILE","object_list","[{""owner"":""ADMIN"",""name"":""TELCOCUSTOMERCHURN""}]"
"NL2SQL_PROFILE","oci_compartment_id","ocid1.compartment.oc1..xxxq"
"NL2SQL_PROFILE","provider","oci"

AI Profileのobject_listの設定が効いていることを確認する

いくつかのSQL、Select AIの問合せを用意して、AI Profileのobject_listの設定が有効であることを確認します。

object_listでは、TELCOCUSTOMERCHURNという表のみアクセスを許可しています。

一方で、通常のSQL文においては、EMPLOYEE_SALARYという表に対するアクセスを許可しています。

1. 普通のSQLでSELECT文を実行して、EMPLOYEE_SALARYへのアクセス権があることを確認する。

SELECT COUNT(*) AS emp_salary_rows FROM ADMIN.EMPLOYEE_SALARY;

"EMP_SALARY_ROWS"
5

2. TELCOCUSTOMERCHURNに対してSelect AIで問い合わせる(runsql)

SELECT AI 解約した顧客は何人いますか;

"CHURNED_CUSTOMERS"
1869

3. narrate を使用して自然言語で回答させる

SELECT AI narrate 解約していない顧客は何人いますか;

"RESPONSE"
"解約していない顧客は5174人います。"

4. object_listに指定していないEMPLOYEE_SALARYに対して自然言語で問い合わせる

SELECT AI EMPLOYEE_SALARYテーブルの従業員の給与を一覧で見せてください;

"RESPONSE"
"SELECT 'I''m sorry, but I can only generate SQL queries using the tables and schema provided in my instructions, and ""EMPLOYEE_SALARY"" is not among them.' AS MESSAGE FROM DUAL"

→ object_listに指定しないので、エラーが出る

5. object_listに指定していないEMPLOYEE_SALARYに対してnarrateを使用して自然言語で回答させる

SELECT AI narrate 従業員の平均給与はいくらですか;

"RESPONSE"
"従業員の平均給与は約64.76です。"

→意図した回答は返ってきませんでしたが、TELCOCUSTOMERCHURN の MONTHLYCHARGES を「給与」と解釈して代用していました。

これは制限をすり抜けたのではなく、むしろ object_list の外には絶対アクセスしないことのもう一つの証拠になりました。

さいごに

少し意図した回答が返ってこなかったケースもありましたが、そのケースも含めてAI Profileによる制御が効いていることを示すことができました。

変わったユースケースかもしれませんが、AI Profileによる制御は以下の場合などで有効かもしれません。

  • アプリケーションにSelect AIの仕組みを組み込んだ場合のみ、特定のデータベース・オブジェクトに限定してアクセスさせたい場合
  • Select AI(NL2SQL)やSelect AI Agentなどユースケースに応じてアクセスを許可するデータベース・オブジェクトを限定させたい場合 など

それ以外の登壇内容の部分は気が向いたら補足説明を兼ねて更新したいと思います。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?