4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

DockerでOracle AI Database 26ai FreeのDeep Data Security検証環境をサクッと動作確認してみる

4
Last updated at Posted at 2026-06-24

はじめに

Oracle AI Database 26ai の Deep Data Security をローカルで試すために、Docker Compose、SQLcl、初期化SQL、検証SQLをまとめた検証環境を作りました。

この記事では、次の内容を確認します。

  • Oracle AI Database 26ai Free のコンテナ起動
  • ローカル・エンドユーザーの作成
  • Data role の作成
  • DATA GRANT の作成
  • employee_rolemanager_role の見え方の違い
  • SET USE DATA GRANTS ONLY によるビュー経由アクセスの違い
  • ORA_IS_COLUMN_AUTHORIZED
  • ORA_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 で unauthorizeddenied が出る場合は、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

サンプルデータです。

名前 email 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 は見えますが、部下の ssnNULL になります。

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で制御できる

参考資料

4
0
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
4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?