はじめに
Oracle AI Database 26ai の Deep Data Security をローカルで試すために、Docker Compose、SQLcl、初期化SQL、検証SQLをまとめた検証環境を作りました。
この記事では、次の内容を確認します。
- Oracle AI Database 26ai Free のコンテナ起動
- ローカル・エンドユーザーの作成
- Data role の作成
- DATA GRANT の作成
-
employee_roleとmanager_roleの見え方の違い -
SET USE DATA GRANTS ONLYによるビュー経由アクセスの違い ORA_IS_COLUMN_AUTHORIZEDORA_CHECK_DATA_PRIVILEGE
検証に使ったリポジトリはこちらです。
検証環境
今回確認した環境です。
OS: Oracle Linux Server 9.7
Docker: 29.6.0
Docker Compose plugin: v5.1.4
SQLcl: 26.1.2
Image: container-registry.oracle.com/database/free:latest
Database: Oracle AI Database 26ai Free Release 23.26.2.0.0
Service: FREEPDB1
Oracle Container Registry の image pull で unauthorized や denied が出る場合は、Oracle Container Registry にログインして、Database image の利用規約を承認してください。
セットアップ
リポジトリをcloneします。
git clone https://github.com/shunsuke2828/deepsec-lab.git
cd deepsec-lab
cp .env.example .env
Oracle Linux 9 の場合は、前提ソフトウェアをまとめて入れられます。
./scripts/install-prereqs-ol9.sh
sudo usermod -aG docker $USER
newgrp docker
入るものは主に以下です。
- Docker Engine
- Docker Compose plugin
- SQLcl
- Java 21 headless
Docker が使えるか確認します。
docker --version
docker compose version
docker images
SQLcl が使えるか確認します。
sql -version
Oracle Databaseコンテナの起動
Oracle Database Free image をpullします。
docker pull container-registry.oracle.com/database/free:latest
コンテナを起動します。
./scripts/start.sh
起動確認です。
docker ps --filter name=deepsec-db
DBバージョンを確認します。
./scripts/version.sh
期待する出力例です。
Oracle AI Database 26ai Free Release 23.26.2.0.0 - Develop, Learn, and Run for Free
Version 23.26.2.0.0
作成する検証データ
作成する主なオブジェクトです。
Schema: HR
Table: HR.EMPLOYEES
View: HR.EMPLOYEES_VIEW
Local end users:
- ebaker
- manderson
- tmills
- vwilliams
Data roles:
- employee_role
- manager_role
HR.EMPLOYEES は次の列を持ちます。
employee_id
first_name
last_name
email
manager
phone
salary
ssn
サンプルデータです。
| 名前 | manager | |
|---|---|---|
| Victoria Williams | vwilliams | NULL |
| Marvin Anderson | manderson | vwilliams |
| Emma Baker | ebaker | manderson |
| Taylor Mills | tmills | manderson |
| Noah Chen | nchen | vwilliams |
組織構造として見ると、次のようになります。
初期化
次のコマンドで、スキーマ、ローカル・エンドユーザー、Data role、DATA GRANTを作成します。
./scripts/init.sh
ローカル・エンドユーザーは、通常のDBユーザーではなく CREATE END USER で作ります。
create end user "ebaker" identified by "DeepSec_User_2026#";
create end user "manderson" identified by "DeepSec_User_2026#";
create end user "tmills" identified by "DeepSec_User_2026#";
create end user "vwilliams" identified by "DeepSec_User_2026#";
Data role は次のように作ります。
create or replace data role employee_role;
create or replace data role manager_role;
SQLcl接続に必要な通常DB roleをData roleへ付与しています。
create role db_role;
grant create session to db_role;
grant db_role to employee_role;
grant db_role to manager_role;
ローカル・エンドユーザーへData roleを付与します。
grant data role employee_role to "ebaker";
grant data role employee_role to "manderson";
grant data role employee_role to "tmills";
grant data role employee_role to "vwilliams";
grant data role manager_role to "manderson";
grant data role manager_role to "vwilliams";
DATA GRANT
employee_role は、自分の行だけ SELECT でき、自分の phone だけ UPDATE できます。
create or replace data grant hr.employee_self_access
as select, update(phone)
on hr.employees
where lower(email) = lower(ORA_END_USER_CONTEXT.username)
to employee_role;
manager_role は、自分がmanagerの部下行を SELECT できます。
ただし ssn は見せません。
また、部下の salary だけ UPDATE できます。
create or replace data grant hr.manager_reports_access
as select(all columns except ssn), update(salary)
on hr.employees
where lower(manager) = lower(ORA_END_USER_CONTEXT.username)
to manager_role;
SQLclで接続する
ローカル・エンドユーザーは小文字名で作っているため、SQLcl接続ではユーザー名をダブルクォートします。
sql '"ebaker"/DeepSec_User_2026#@//127.0.0.1:1521/FREEPDB1'
sql '"manderson"/DeepSec_User_2026#@//127.0.0.1:1521/FREEPDB1'
SYSで接続する場合です。
sql 'sys/DeepSec_SYS_2026#@//127.0.0.1:1521/FREEPDB1 as sysdba'
動作確認
まとめて確認する場合は次のコマンドです。
./scripts/verify.sh
./scripts/show-results.sh
個別に確認する場合は、次のようにSQLファイルを実行します。
sql '"ebaker"/DeepSec_User_2026#@//127.0.0.1:1521/FREEPDB1' @sql/20_verify_user.sql
sql '"manderson"/DeepSec_User_2026#@//127.0.0.1:1521/FREEPDB1' @sql/20_verify_user.sql
ebaker では、HR.EMPLOYEES は自分の1行だけ見えます。
EMPLOYEE_ID FIRST_NAME LAST_NAME EMAIL
3 Emma Baker ebaker
ORA_CHECK_DATA_PRIVILEGE の結果は、phone は更新可能、salary は更新不可です。
CAN_UPDATE_PHONE true
CAN_UPDATE_SALARY false
更新確認では、salary は0行、phone は1行になります。
update hr.employees set salary = salary + 1;
0 rows updated.
update hr.employees set phone = '555-9999';
1 row updated.
manderson では、自分の行と部下2行が見えます。
Marvin Anderson manderson
Emma Baker ebaker
Taylor Mills tmills
自分の ssn は見えますが、部下の ssn は NULL になります。
Marvin Anderson 222-22-2222 SSN_AUTHORIZED=true
Emma Baker [NULL] SSN_AUTHORIZED=false
Taylor Mills [NULL] SSN_AUTHORIZED=false
更新確認では、salary は部下2行、phone は自分1行です。
update hr.employees set salary = salary + 1;
2 rows updated.
update hr.employees set phone = '555-9999';
1 row updated.
ビューとSET USE DATA GRANTS ONLY
HR.EMPLOYEES_VIEW は、最初は通常のビューとして広く見えるようにしています。
そのため、USE DATA GRANTS ONLY が無効のとき、ebaker でもビュー経由では5行見えます。
sql 'sys/DeepSec_SYS_2026#@//127.0.0.1:1521/FREEPDB1 as sysdba' @sql/30_set_mac_disabled.sql
sql '"ebaker"/DeepSec_User_2026#@//127.0.0.1:1521/FREEPDB1' @sql/40_view_only.sql
期待結果です。
Victoria Williams
Marvin Anderson
Emma Baker
Taylor Mills
Noah Chen
次に、USE DATA GRANTS ONLY を有効にします。
sql 'sys/DeepSec_SYS_2026#@//127.0.0.1:1521/FREEPDB1 as sysdba' @sql/31_set_mac_enabled.sql
sql '"ebaker"/DeepSec_User_2026#@//127.0.0.1:1521/FREEPDB1' @sql/40_view_only.sql
期待結果は ebaker 自身の1行だけです。
Emma Baker
SQLclで SET USE DATA GRANTS ONLY ... を直接流すと、SQLclがクライアント側の SET と解釈してしまう場合があります。
そのため、この検証環境ではPL/SQLの execute immediate 経由で実行しています。
begin
execute immediate 'SET USE DATA GRANTS ONLY ON hr.employees ENABLED';
dbms_output.put_line('Use data grants only enabled.');
end;
/
検証結果のサマリ
./scripts/show-results.sh を実行すると、ログから重要部分だけを抜き出します。
./scripts/show-results.sh
出力例です。
=== Deep Data Security DDL ===
--- create employee_role ---
OK
--- create manager_role ---
OK
--- employee_role: self row SELECT and self phone UPDATE ---
OK
--- manager_role: direct reports SELECT except SSN and salary UPDATE ---
OK
=== ebaker table/view/update checks ===
Emma Baker ... true true false
0 rows updated.
1 row updated.
=== manderson table/view/update checks ===
Marvin Anderson ... true true false
Emma Baker ... [NULL] false false true
Taylor Mills ... [NULL] false false true
2 rows updated.
1 row updated.
=== MAC disabled/enabled ebaker view row evidence ===
-- disabled should show all sample rows
Victoria
Marvin
Emma
Taylor
Noah
-- enabled should show ebaker only
Emma
まとめ
Oracle AI Database 26ai Free のDocker imageで、Deep Data Securityの基本動作をローカル検証できました。
確認できたことです。
- ローカル・エンドユーザーを
CREATE END USERで作成できる - Data roleを作成し、ローカル・エンドユーザーへ付与できる
- DATA GRANTで行条件と列権限を表現できる
-
employee_roleは自分の行と自分のphone更新だけ可能 -
manager_roleは部下行を見られるが、部下のssnは隠せる -
ORA_IS_COLUMN_AUTHORIZEDで列の認可状態を確認できる -
ORA_CHECK_DATA_PRIVILEGEで列更新可否を確認できる -
SET USE DATA GRANTS ONLYにより、ビュー経由アクセスもDATA GRANTで制御できる
参考資料
- Oracle Documentation: Introduction to Oracle Deep Data Security
https://docs.oracle.com/en/database/oracle/oracle-database/26/ddscg/introduction-oracle-deep-data-security.html - Qiita: Oracle AI Database 26ai 新機能 - Deep Data Security -
https://qiita.com/Western24/items/4c40e95e432883b51f5c