この内容は、Deep Data Securityをアプリケーションへ実装するの補足です。
Deep Data Securityのアクセス制御をアプリケーションに組み込む場合は、各言語向けの開発ガイドがこちらでまとめられています。サンプルコードも提供されているので、実際にアプリケーションを作成して動作を確認することができるので非常に有益だと思います。
例えば、PythonだとGithubにDeep Data Securityのサンプル・アプリケーションがあります。ちょっと見たところReadmeはそれほど親切ではない、設定も若干ややこしいので、実際に動作させるまでには苦労しそうです。肝心のEntra IDとの認証に必要なEntraID側の構成や設定手順の記載がないので、これが大きな挫折ポイントになりそうな気がします。
そこで今回は、このサンプルアプリケーションを流用しつつ設定しやすいように作り替えたバージョンを使用し、その実行に必要なEntra IDの設定はPowershellのスクリプトで自動化し、必要な設定を出来るだけ省力化かつ自動化させた手順を紹介します。
とはいえ、Entra IDとDeep Data Securityの基本的な設定や動作イメージが全くない人がいきなり構築し始めるはハードルが高いので段階的に進めます。 まず初めにこちらのEntra IDによるダイレクト・アクセス方式の設定をひと通り完了させ、SQLPlusでEntra ID認証によるOracle Database接続ができる環境を構築して下さい。そこで作成したHRスキーマやデータ・ロール、データ権限等は、このPythonアプリケーションで流用する内容に変えています。
以降は、WindowsのローカルPC上で設定・実行させる想定で説明しているので、ご自身の環境に応じて読み替えてください。
Pythonアプリケーションの設定
GithubからカスタマイズしたPythonのアプリケーションとEntra IDを作成するスクリプトをダウンロードする
Powershellでスクリプトを実行し、EntraIDにフロントエンドとバックエンドの2つアプリを作成する。実行後、設定情報が入っているdds_entrasetup_app.logが同フォルダに作成される。
PS> .\dds_entrasetup_app.ps1 `
-TenantId "xxxx-xxxx-xxxx-xxxx-xxxx" `
-DisplayName "dds-backdb" `
-ClientDisplayName "dds-frontapp" `
-RotateClientSecret
EntraIDにアプリケーション、ユーザー、アプリケーションロール等必要な要素が作成・設定まで完了している。

アプリケーションのzipファイルを解凍し、ディレクトリ内でpythonの仮想環境を作成
PS> py -3.12 -m venv .venv
PS> .\.venv\Scripts\Activate.ps1
(.venv) PS> pip install -r requirements.txt
アプリケーションのフォルダ内にあるmanage.pyファイルを編集する
# ------------------------------------------------------------------
# Microsoft Entra ID / DDS settings from dds_entrasetup_app.log.
# ------------------------------------------------------------------
#dds_entrasetup_app.logの一番下にある[変更パラメータ]のセクションにあるパラメータをコピーし
#manage.pyの同じ場所に貼り付ける。
# [変更パラメータ]
AZURE_USER_CLIENT_ID = "xxxx-xxxx-xxxx-xxxx-xxxx"
AZURE_USER_AUTHORITY = "https://login.microsoftonline.com/xxxx-xxxx-xxxx-xxxx-xxxx"
AZURE_USER_REDIRECT_URI = "http://localhost:8080/callback"
CALLBACK_PORT = "8080"
AZURE_USER_SCOPES = "api://xxxx-xxxx-xxxx-xxxx-xxxx/session:scope:connect"
AZURE_DB_CLIENT_ID = "xxxx-xxxx-xxxx-xxxx-xxxx"
AZURE_DB_CLIENT_CREDENTIAL = "xxxxxxxxxxxxxxxxxxxxxxx"
AZURE_DB_AUTHORITY = "https://login.microsoftonline.com/xxxx-xxxx-xxxx-xxxx-xxxx"
AZURE_DB_SCOPES = "api://xxxx-xxxx-xxxx-xxxx-xxxx/.default"
# ------------------------------------------------------------------
# Oracle Database / local runtime settings.
# ------------------------------------------------------------------
#tnsname.oraがあるTNS_ADMINを指定
tns_admin_dir = r"C:\xxxx\xxx\xxxx"
#tnsname.oraにある接続文字列、ユーザーはHRとパスワード。HRでパスワード接続できるか確認しておく
ORACLE_DB_DSN = "xxxxxxxx"
ORACLE_DB_USER = "HR"
ORACLE_DB_PASSWORD = "password"
# ------------------------------------------------------------------
# OCI Generative AI settings.(Option)
# ------------------------------------------------------------------
#自然言語での問い合わせを試す場合。必須ではない
OCI_CONFIG_FILE = r"C:\Users\xxxxxxx\.oci\config"
OCI_ENDPOINT = (
"https://inference.generativeai.us-ashburn-1.oci.oraclecloud.com"
)
OCI_COMPARTMENT_ID = (
"ocid1.compartment.oc1..xxxxxxxx"
)
データベースの初期化パラメータの変更
--dds_entrasetup_app.logのOracle ALTER SYSTEM SQLセクションに作成されたEntra IDのAPPIDに
--合わせたSQLが出力さているのでそれをデータベースで実行する
SQL> ALTER SYSTEM SET IDENTITY_PROVIDER_CONFIG = '{"app_id":"xxxx-xxxx-xxxx-xxxx-xxxx","application_id_uri":"api://xxxx-xxxx-xxxx-xxxx-xxxx","tenant_id":"xxxx-xxxx-xxxx-xxxx-xxxx"}' SCOPE=BOTH;
System altered.
SQL>
アプリケーションの実行
PS> .\.venv\Scripts\Activate.ps1
(.venv) PS> python manage.py runserver 8080
Watching for file changes with StatReloader
Performing system checks...
System check identified no issues (0 silenced).
You have 18 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.
July 12, 2026 - 13:18:12
Django version 6.0.7, using settings 'myproject.settings'
Starting development server at http://127.0.0.1:8080/
Quit the server with CTRL-BREAK.
WARNING: This is a development server. Do not use it in a production setting. Use a production WSGI or ASGI server instead.
For more information on production servers see: https://docs.djangoproject.com/en/6.0/howto/deployment/
Pythonアプリケーションのテスト
http://127.0.0.1:8080 にアクセスする
HR Employeesをクリックする。ログインしていない初期状態は、HRユーザーだけで接続しているので、Employees表のすべての行を参照できる

ホームに戻って、Loginをクリック。Entra IDの認証画面にリダイレクトされるので、作成されているemma@xxxx.xxxxでログイン。
HR Employeesをクリックすると、自分の行しか表示されない。(※これはemmaのエンドユーザー・セキュリティコンテキストが接続セッションにアタッチされているので、emmaのデータ権限でアクセス制御されている)
サインアウトして、同様にmarvinでLogin。自分の部下の行(MANAGER_ID=100)とSSNがマスクして表示される
Generative AIの設定をしている場合は、Chatに問い合わせ文を入れるとSQLに変換されて実行される
以上です。このアプリケーションは、PythonのDjangoフレームワークでエンドユーザー・セキュリティコンテキストを実装しています。詳しくはこちら。
また、Entra IDに作成される2つのアプリケーションについてですが、フロントエンド側はユーザーのログインに使用し、Authorization Code Flow with PKCE として構成されます。バックエンド側はデータベースアクセス用トークンを取得するための confidential client として使用し、Client Credentials Flow として構成されます。そのため、同じ Client Credentials Flow に対応し、必要なスコープや権限が設定されたアプリケーションであれば、同様の構成で流用することが可能です。




