در بسیاری از سناریوهای عملیاتی، نیاز نداریم همه کاربران دیتابیس را بهصورت دائمی 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;
از این لحظه به بعد:
-
فقط فعالیتهای
TEST1Audit میشوند -
سایر کاربران (حتی 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 محدودتر تعریف شود.