در اوراکل 18c، پارامتری به نام UNIFIED_AUDIT_SYSTEMLOG اضافه شد که امکان نوشتن unified audit trail را در محیط سیستم عامل فراهم می کند با این قابلیت می توان فیلدهای کلیدی unified audit trail را در محیط لینوکس به syslog و در محیط ویندوز به Event Viewer فرستاد.
SQL> show parameter unified_audit_systemlog
NAME TYPE VALUE
———————————— ———- ———-
unified_audit_systemlog string
قصد داریم با طی چند مرحله، این قابلیت را در محیط لینوکس پیکربندی کنیم.
مرحله اول:تنظیم پارامتر UNIFIED_AUDIT_SYSTEMLOG
برای تنظیم این پارامتر در محیط لینوکس، ابتدا باید facility و priority را مشخص کرد:
UNIFIED_AUDIT_SYSTEMLOG = ‘facility_clause.priority_clause’
مقادیر مجاز برای facility و priority:
facility_clause::={ USER | LOCAL[0 | 1 | 2 | 3 | 4 | 5 | 6 | 7] }
priority_clause::={NOTICE | INFO | DEBUG | WARNING | ERR | CRIT | ALERT | EMERG }
برای مثال، با دستور زیر، LOCAL6 به عنوان facility و EMERG هم به عنوان priority تعیین می شود:
SQL> alter system set UNIFIED_AUDIT_SYSTEMLOG = ‘LOCAL6.EMERG’ scope=spfile;
System altered.
همچنین در محیط ویندوز، برای ارسال لاگ به Event Viewer، صرفا باید این پارامتر را به مقدار TRUE تنظیم نمود:
SQL> alter system set UNIFIED_AUDIT_SYSTEMLOG =TRUE scope=spfile;
System altered.
مرحله دوم: در این مرحله فایل پیکربندی سرویس rsyslog را تنظیم می کنیم:
[root@ol7 ~]# vi /etc/rsyslog.conf
local6.emerg /var/log/oracle_audit.log
با این تنظیم، unified audit trail در فایل oracle_audit.log نوشته خواهد شد.
مرحله سوم: سرویس rsyslog را restart می کنیم:
[root@ol7 ~]# systemctl restart rsyslog
مرحله چهارم: دیتابیس را restart می کنیم:
SQL> startup force;
بعد از پیکربندی این قابلیت، قصد داریم با ایجاد یک audit policy، فعالیت کاربر usef را audit کنیم:
SQL> create audit policy audpol actions all;
Audit policy created.
SQL> audit policy audpol by usef;
Audit succeeded.
کاربر usef جدولی با نام mytbl را ایجاد و سپس حذف می کند:
SQL> create table mytbl(id number,name varchar2(10));
Table created.
SQL> drop table mytbl;
Table dropped.
با ایجاد و حذف جدول mytbl توسط کاربر usef، اطلاعاتی به فایل oracle_audit.log اضافه خواهد شد:
[root@ol7 ~]# ls -l /var/log/oracle_audit.log
-rw——- 1 root root 149653 Jun 2 12:37 /var/log/oracle_audit.log
اطلاعات ثبت شده برای جدول mytbl، به صورت زیر می باشد:
[root@ol7 ~]# cat /var/log/oracle_audit.log|grep MYTB
2020-06-02T12:37:49.871015+04:30 ol7 Oracle Unified Audit[32293]: LENGTH: ‘166’ TYPE:”4″ DBID:”1820349651″ SESID:”1063221700″ CLIENTID:”” ENTRYID:”101″ STMTID:”22″ DBUSER:”USEF” CURUSER:”USEF” ACTION:”1″ RETCODE:”0″ SCHEMA:”USEF” OBJNAME:”MYTBL”
2020-06-02T12:37:56.547434+04:30 ol7 Oracle Unified Audit[32293]: LENGTH: ‘167’ TYPE:”4″ DBID:”1820349651″ SESID:”1063221700″ CLIENTID:”” ENTRYID:”600″ STMTID:”90″ DBUSER:”USEF” CURUSER:”USEF” ACTION:”12″ RETCODE:”0″ SCHEMA:”USEF” OBJNAME:”MYTBL”
همانطور که می بینید در اطلاعات ثبت شده، خبری از ستون action_name نیست و برای تعیین عمل انجام شده(دستور اجرا شده) باید از ویوی audit_actions کمک گرفت:
SQL> select * from audit_actions where action IN (1,12);
ACTION NAME
———- ——————–
1 CREATE TABLE
12 DROP TABLE
در اوراکل 19c، مختصر بهبودی در این زمینه ایجاد شد که بر اساس ان، برای محیطهای multitenant، ستونی به نام PDB_GUID هم به syslog و Event Viewer ارسال می شود تا مشخص شود که این لاگ مربوط به کدام pdb می باشد.
در قسمت زیر قصد داریم در دو pdb مختلف، جدول همنامی را ایجاد کرده و تفاوت لاگ ثبت شده در دو نسخه 18c و 19c را بررسی کنیم.
–Oracle 18c:
—-pdb1
SQL> create table TBLPDB(id number,name varchar2(10));
Table created.
[root@ol7 ~]# cat /var/log/oracle_audit.log|grep TBLPDB
2019-06-24T16:27:06.572337+04:30 ol7 Oracle Unified Audit[22250]: LENGTH: ‘166’ TYPE:”4″ DBID:”557546386″ SESID:”2034358282″ CLIENTID:”” ENTRYID:”69″ STMTID:”14″ DBUSER:”USEF” CURUSER:”USEF” ACTION:”1″ RETCODE:”0″ SCHEMA:”USEF” OBJNAME:”TBLPDB”
—pdb2
SQL> create table TBLPDB(id number,name varchar2(10));
Table created.
[root@ol7 ~]# cat /var/log/oracle_audit.log|grep TBLPDB
2019-06-24T16:30:24.700120+04:30 ol7 Oracle Unified Audit[23295]: LENGTH: ‘166’ TYPE:”4″ DBID:”4267074312″ SESID:”3992345619″ CLIENTID:”” ENTRYID:”41″ STMTID:”12″ DBUSER:”USEF” CURUSER:”USEF” ACTION:”1″ RETCODE:”0″ SCHEMA:”USEF” OBJNAME:”TBLPDB”
همانطور که می بینید در لاگ ثبت شده، اثری از نام pdb نیست و عملا قابل تشخیص نیست که این دستور در کدام pdb اجرا شده است. در ادامه، همین سناریو را در اوراکل 19c تکرار می کنیم.
–Oracle 19c:
—pdb1
SQL> create table TBLPDB(id number,name varchar2(10));
Table created.
[root@ol7 ~]# cat /var/log/oracle_audit.log|grep TBL
2019-06-24T16:42:46.357614+04:30 ol7 journal: Oracle Unified Audit[21617]: LENGTH: ‘208’ TYPE:”4″ DBID:”4079153754″ SESID:”437400285″ CLIENTID:”” ENTRYID:”36″ STMTID:”9″ DBUSER:”USEF” CURUSER:”USEF” ACTION:”1″ RETCODE:”0″ SCHEMA:”USEF” OBJNAME:”TBLPDB” PDB_GUID:”8C117B2E612D6DC8E053069B200A0597″
—pdb2
SQL> create table TBLPDB(id number,name varchar2(10));
Table created.
[root@ol7 ~]# cat /var/log/oracle_audit.log|grep TBL
2019-06-24T16:45:03.615033+04:30 ol7 journal: Oracle Unified Audit[23669]: LENGTH: ‘208’ TYPE:”4″ DBID:”2881540304″ SESID:”2348227237″ CLIENTID:”” ENTRYID:”8″ STMTID:”7″ DBUSER:”USEF” CURUSER:”USEF” ACTION:”1″ RETCODE:”0″ SCHEMA:”USEF” OBJNAME:”TBLPDB” PDB_GUID:”8C119BA276F84229E053049B200A00FB”
همانطور که قابل مشاهده است، در خروجی این لاگ، guid مربوط به pdbها ثبت شده اند:
SQL> select PDB_NAME,GUID from cdb_pdbs where PDB_NAME in (‘PDB1′,’PDB2’);
PDB_NAME GUID
———- ——————————–
PDB1 8C117B2E612D6DC8E053069B200A0597
PDB2 8C119BA276F84229E053049B200A00FB
Comments (2)