اوراکل 21c – انجام auditing بر اساس current user

ستونهای DBUSERNAME و CURRENT_USER در ویوی unified_audit_trail شباهت زیادی به هم دارند و در بسیاری از مواقع، این دو ستون حاوی اطلاعات یکسانی هستند. معمولا در این ستونها نام کاربری که به دیتابیس لاگین کرده و دستور را اجرا نموده است ، ذخیره می شود.

مگر آنکه کاربر متصل به دیتابیس با حقوق definer(یا همان definer right)، دستوری را اجرا کند، که در این صورت، نام کاربر متصل به دیتابیس در ستون DBUSERNAME ثبت می شود و نام کاربر definer که مجری واقعی دستور بوده در ستون CURRENT_USER ذخیره می شود.

*برای آشنایی بیشتر با مفهوم definer right و  invoker right پیشنهاد می شود مطلب بررسی Invoker’s Rights و Definer’s Rights را مطالعه کنید.

برای مثال، کاربر A پروسیجر زیر را به صورت definer right تعریف کرده است:

create or replace procedure prc1 authid definer as
  id_var number;
begin
  select object_id into id_var from usef.tbl1 where object_name = ‘TB’;
end;
/

کاربر دیگری با نام B قرار است این پروسیجر را اجرا کند این کاربر دسترسی حداقلی دارد: “اتصال به دیتابیس” و “اجرای پروسیجر prc1”:

SQL> create user B identified by b;
User created
SQL> grant create session to b;
Grant succeeded
SQL> grant execute on a.prc1 to b;
Grant succeeded

همچنین قرار است افرادی که اطلاعات جدول usef.tbl1 را مشاهده می کنند از طریق audit policy زیر audit شوند:

SQL> create audit policy pol_definer actions select on usef.tbl1;
Done
SQL> audit policy pol_definer;
Audit succeeded

برای تست این audit policy، از طریق کاربر B به دیتابیس login کرده و پروسیجر prc1 را اجرا می کنیم:

sqlplus "b/b@pdb1"
Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production
Version 21.3.0.0.0
SQL> exec  a.prc1;
PL/SQL procedure successfully completed.

از طریق پرس و جوی زیر خواهیم دید که نام کاربر B در ستون DBUSERNAME ثبت شده و با توجه به عدم دسترسی مستقیم کاربر B به جدول usef.tbl1، پروسیجر prc1 با مجوز definer آن که کاربر A هست، دستور select from tbl1 را اجرا کرده است بنابرین در این حالت، نام کاربر A  به عنوان CURRENT_USER در نظر گرفته می شود:

Select c.DBUSERNAME,CURRENT_USER,action_name from unified_audit_trail c where c.UNIFIED_AUDIT_POLICIES=’POL_DEFINER’;

سوال، اوراکل auditing  را در شرایط  فوق بر مبنای DBUSERNAME انجام می دهد یا CURRENT_USER؟ پاسخ به این سوال در نسخه های مختلف اوراکل، متفاوت خواهد بود.

در نسخه 21c، اوراکل auditing را بر مبنای CURRENT_USER انجام می دهد با این توضیح، اگر audit policy را صرفا برای کاربر B فعال کنیم؛ اجرای پروسیجر توسط کاربر B که منجر به فراخوانی جدول tbl1 می شود، audit نخواهد شد:

SQL>  exec dbms_audit_mgmt.clean_audit_trail(audit_trail_type=>dbms_audit_mgmt.audit_trail_unified,use_last_arch_timestamp=>false);
PL/SQL procedure successfully completed
SQL> noaudit policy pol_definer;
Noaudit succeeded
SQL> audit policy pol_definer by B;
Audit succeeded
SQL> connect B/b@pdb1
SQL> show user
USER is "B"
SQL> exec  a.prc1;
PL/SQL procedure successfully completed.
SQL> connect A/a@pdb1
SQL> select c.DBUSERNAME,CURRENT_USER,action_name from unified_audit_trail c where c.UNIFIED_AUDIT_POLICIES='POL_DEFINER';
no rows selected

این رفتار در نسخه 19c متفاوت است:

Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 – Production
Version 19.8.0.0.0

select policy_name,entity_name  from audit_unified_enabled_policies c where policy_name='POL_DEFINER';

SQL> show user
USER is "B"
SQL> exec  a.prc1;
PL/SQL procedure successfully completed.
SQL> connect A/a@pdb1
SQL> select c.DBUSERNAME,CURRENT_USER,action_name from unified_audit_trail c where c.UNIFIED_AUDIT_POLICIES='POL_DEFINER';

ارائه خدمات مشاوره ، پشتیبانی و نصب و راه اندازی پایگاه داده اوراکل در سراسر کشور...................... تلفن: 09128110897 ایمیل:vahidusefzadeh@gmail.com

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد.