2025年8月20日水曜日

Entra IDで認証したユーザーを統合監査のレコードに記録する

先日の記事「SQLclのMCPサーバーのデータベース接続にTOKEN_AUTH=AZURE_INTERACTIVEの設定を使用する」にて、SQLclのMCPサーバーからデータベースに接続する際に、Entra IDでユーザー認証する環境を作成しました。

Entra IDで認証したユーザーIDはシステム・コンテキストUSERENVのAUTHENTICATED_IDENTITYに設定されています。統合監査の監査レコードにこの値を含めることにより、データベース・ユーザーではなくSQLを実行した個人を特定することができます。

先の記事で作成した環境を使って、統合監査の監査レコードにAUTHENTICATED_IDENTITYを含めてみます。

設定作業は管理者ユーザーADMINで実施します。

サンプル・データセットのhuman resourcesがインストール済みで、スキーマHRと表EMPLOYEESが作成されていることを前提とします。

sql admin@salesadb_low

azure % sql admin@salesadb_low



SQLcl: 水 8月 20 14:57:53 2025のリリース25.2 Production


Copyright (c) 1982, 2025, Oracle.  All rights reserved.


パスワード (**********?) **************

Last Successful login time: 水 8月  20 2025 14:58:01 +09:00


接続先:

Oracle Database 23ai Enterprise Edition Release 23.0.0.0.0 - for Oracle Cloud and Engineered Systems

Version 23.9.0.25.08


SQL> 


統合監査ポリシーとしてMCP_HR_EMPを作成します。

Entra IDで認証されたユーザーによる、表HR.EMPLOYEESを対象としたすべてのSQLの実行を記録します。
create audit policy mcp_hr_emp
actions
    all on hr.employees
when
    q'~SYS_CONTEXT('USERENV','AUTHENTICATION_METHOD') = 'TOKEN_GLOBAL'~'
evaluate per statement;

SQL> create audit policy mcp_hr_emp

  2  actions

  3      all on hr.employees

  4  when

  5      q'~SYS_CONTEXT('USERENV','AUTHENTICATION_METHOD') = 'TOKEN_GLOBAL'~'

  6* evaluate per statement;


Audit POLICYは作成されました。


SQL> 


システム・コンテキストUSERENVAUTHENTICATION_METHODAUTHENTICATED_IDENTITYを監査レコードに追加します。

audit context namespace userenv attributes authentication_method, authenticated_identity;

SQL> audit context namespace userenv attributes authentication_method, authenticated_identity;


Auditが正常に実行されました。


SQL> 


統合監査ポリシーMCP_HR_EMPを適用します。

audit policy mcp_hr_emp;

SQL> audit policy mcp_hr_emp;


Auditが正常に実行されました。


SQL> 


別ターミナルから、Entra IDで認証してデータベースSALESADBに接続します。接続後、表HR.EMPLOYEESの行数をカウントします。

sql /@salesadb_azcode
select count(*) from hr.employees;


azure % sql /@salesadb_azcode



SQLcl: 水 8月 20 15:10:28 2025のリリース25.2 Production


Copyright (c) 1982, 2025, Oracle.  All rights reserved.


To sign in, use a web browser to open the page https://microsoft.com/devicelogin and enter the code OYVQQZYRV to authenticate.


SQL> select count(*) from hr.employees;


   COUNT(*) 

___________ 

        107 


SQL> 


上記のSELECT文の監査レコードを確認します。

AUDIT CONTEXT文で記録するように設定したAUTHENTICATION_METHODおよびAUTHENTICATED_METHODの値は、列APPLICATION_CONTEXTSから参照できます。

select event_timestamp, sql_text, application_contexts from unified_audit_trail where object_schema = 'HR' and object_name = 'EMPLOYEES' order by event_timestamp;

SQL> select event_timestamp, sql_text, application_contexts from unified_audit_trail where object_schema = 'HR' and object_name = 'EMPLOYEES' order by event_timestamp;


EVENT_TIMESTAMP                SQL_TEXT                              APPLICATION_CONTEXTS                                                                                                                                                         

______________________________ _____________________________________ ____________________________________________________________________________________________________________________________________________________________________________ 

25-08-20 15:11:35.317798000    select count(*) from hr.employees    (USERENV,AUTHENTICATED_IDENTITY=yuji______outlook.com_EXT_@________outlook.onmicrosoft.com); (USERENV,AUTHENTICATION_METHOD=TOKEN_GLOBAL); (USERENV,SESSION_USER=MCPUSER)    


SQL> 


以上より、Entra IDで認証したユーザーIDを統合監査の監査レコードに含められることが確認できました。

以下のスクリプトにより、統合監査を設定する前の状態に戻すことができます。
noaudit policy mcp_hr_emp;
drop audit policy mcp_hr_emp;
begin
    dbms_audit_mgmt.clean_audit_trail(
        audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED,
        use_last_arch_timestamp => false,
        container => DBMS_AUDIT_MGMT.CONTAINER_CURRENT
    );
end;
/

SQL> noaudit policy mcp_hr_emp;


Noauditが正常に実行されました。


SQL> drop audit policy mcp_hr_emp;


Audit POLICYが削除されました。


SQL> begin

  2  dbms_audit_mgmt.clean_audit_trail(

  3  audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED,

  4  use_last_arch_timestamp => false,

  5  container => DBMS_AUDIT_MGMT.CONTAINER_CURRENT);

  6  end;

  7* /


PL/SQLプロシージャが正常に完了しました。


SQL> 


今回の記事は以上になります。