Audit کامل یک کاربر خاص به‌صورت موقت با Unified Auditing

در بسیاری از سناریوهای عملیاتی، نیاز نداریم همه کاربران دیتابیس را به‌صورت دائمی Audit کنیم.
یک مثال کاملاً رایج:

  • یک کاربر DBA یا اپلیکیشنی قرار است برای مدت محدود روی دیتابیس کاری انجام دهد

  • می‌خواهیم تمام فعالیت‌های او ثبت شود

  • بعد از پایان کار، Audit بدون هیچ اثر جانبی غیرفعال شود

Unified Auditing در اوراکل دقیقاً برای چنین سناریویی طراحی شده است.

در این مقاله، یک سناریوی واقعی که روی Oracle Multitenant (PDB) تست شده را قدم‌به‌قدم بررسی می‌کنیم.

محیط تست

  • دیتابیس: Oracle با Unified Auditing فعال

  • Container:

    • CDB$ROOT

    • VAHIDPDB (محل اجرای تست)

  • کاربران:

    • TEST1

    • TEST2

  • هدف:

    • Audit کامل فعالیت‌های TEST1

    • امکان اضافه و حذف کاربران از Audit به‌صورت پویا

انتخاب PDB مورد نظر

ابتدا وارد PDB هدف می‌شویم:

ALTER SESSION SET CONTAINER = vahidpdb;

تمام تنظیمات Audit در این مقاله، در سطح همین PDB انجام می‌شود.

ساخت کاربران تست

CREATE USER test1 IDENTIFIED BY test1;
GRANT dba TO test1;

CREATE USER test2 IDENTIFIED BY test2;
GRANT dba TO test2;

ساخت Audit Policy برای ثبت تمام فعالیت‌ها

برای Audit کامل یک کاربر، یک Policy با ACTIONS ALL تعریف می‌کنیم:

CREATE AUDIT POLICY all_actions
ACTIONS ALL;

این Policy شامل موارد زیر است (و بیشتر):

  • LOGON / LOGOFF

  • SELECT

  • INSERT / UPDATE / DELETE

  • DDL (CREATE, ALTER, DROP)

  • EXECUTE

  • COMMIT / ROLLBACK

فعال‌سازی Audit فقط برای یک کاربر خاص

AUDIT POLICY all_actions BY test1;

از این لحظه به بعد:

  • فقط فعالیت‌های TEST1 Audit می‌شوند

  • سایر کاربران (حتی DBAها) تحت تأثیر نیستند


بررسی فعال بودن Policy برای کاربر

در محیط تست مشاهده شد که اطلاعات کاربران Audit‌شده مستقیماً در همین View قابل مشاهده است:

SELECT policy_name, enabled_option, entity_name
FROM   audit_unified_enabled_policies
WHERE  policy_name = 'ALL_ACTIONS';

خروجی:

  • ENABLED_OPTION = BY USER

  • ENTITY_NAME = TEST1

این یعنی:

Policy به‌صورت User-based فعال شده و فقط برای TEST1 معتبر است

مشاهده لاگ‌های Audit

برای بررسی دقیق فعالیت‌های کاربر:

SELECT
  event_timestamp,
  dbusername,
  action_name,
  object_schema,
  object_name,
  sql_text
FROM unified_audit_trail
WHERE dbusername = 'TEST1'
ORDER BY event_timestamp DESC;

در خروجی مواردی مثل زیر دیده می‌شود:

  • LOGON

  • SELECT روی DBA_USERS

  • CREATE TABLE

  • INSERT

  • EXECUTE پکیج‌ها

  • COMMIT

این نشان می‌دهد که تمام رفتار کاربر بدون استثنا ثبت شده است.

اضافه کردن کاربر دوم به همان Policy (در صورت نیاز)

اگر در ادامه تصمیم بگیریم کاربر دیگری هم موقتاً Audit شود:

AUDIT POLICY all_actions BY test2;

اکنون خروجی View به شکل زیر خواهد بود:

  • TEST1

  • TEST2

هر کاربر یک رکورد مستقل دارد و کاملاً جداگانه مدیریت می‌شود.

غیرفعال کردن Audit فقط برای یک کاربر (پایان مأموریت)

پس از اتمام کار TEST1:

NOAUDIT POLICY all_actions BY test1;

نتیجه:

  • Audit برای TEST1 متوقف می‌شود

  • Audit برای TEST2 (اگر فعال باشد) ادامه دارد

  • هیچ تغییری در Policy اصلی ایجاد نمی‌شود

نکته بسیار مهم درباره NOAUDIT POLICY و رفتار واقعی آن

در Unified Auditing، رفتار دستور NOAUDIT POLICY همیشه آن چیزی نیست که در نگاه اول انتظار داریم، مخصوصاً زمانی که Policy به‌صورت BY USER فعال شده باشد.

در سناریوی ما، Policy با نام ALL_ACTIONS در آخر کار فقط برای کاربر TEST2 فعال بود:

SELECT policy_name, enabled_option, entity_name
FROM audit_unified_enabled_policies
WHERE policy_name = 'ALL_ACTIONS';

خروجی:

  • POLICY_NAME: ALL_ACTIONS

  • ENABLED_OPTION: BY USER

  • ENTITY_NAME: TEST2

 

تصور رایج (ولی نادرست)

در نگاه اول ممکن است تصور شود که اجرای دستور زیر، Policy را به‌صورت کامل غیرفعال می‌کند:

NOAUDIT POLICY all_actions;

اما در عمل، همان‌طور که در تست واقعی مشاهده شد، Policy همچنان برای کاربر TEST2 فعال باقی ماند و هیچ تغییری در خروجی ایجاد نشد.

این یعنی:

زمانی که یک Audit Policy به‌صورت BY USER فعال شده باشد، اجرای NOAUDIT POLICY <policy_name> به‌تنهایی، الزاماً کاربران را از Audit خارج نمی‌کند.

روش صحیح و قطعی برای غیرفعال‌سازی

برای حذف کامل Audit یک کاربر خاص، باید دقیقاً همان سطحی که Policy فعال شده، هدف قرار گیرد:

NOAUDIT POLICY all_actions BY test2;

نکته بسیار مهم درباره Performance

ACTIONS ALL بسیار قدرتمند است اما:

  • برای کاربران پرترافیک توصیه نمی‌شود به‌صورت دائمی فعال بماند

  • بهترین استفاده از آن:

    • بررسی موقت

    • عیب‌یابی

    • مانیتورینگ رفتار مشکوک

    • کنترل دسترسی DBAها

برای استفاده دائمی، بهتر است Policy محدودتر تعریف شود.