查看審計功能是否開啟:
SQL> show parameter audit
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
audit_file_dest string /data/oracle/admin/orcl/adump
audit_sys_operations boolean FALSE
audit_syslog_level string
audit_trail string OS
和審計相關的兩個參數:
audit_sys_operations
:
默認為 false
,當設置為true時,所有sys用戶(包括以sysdba, sysoper身份登錄的用戶)的操作都會被記錄,audit trail
不會寫在aud$
表中,這個很好理解,如果數據庫還未啟動aud$不可用,那么像conn /as sysdba這樣的連接信息,只能記錄在其它地方。如果是 linux/unix
平臺會記錄在 audit_file_dest
參數指定的文件中。
SQL> show parameter audit_sys_operation
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
audit_sys_operations boolean FALSE
audit_trail
:
NONE
:是默認值,不做審計;
DB
:將audit trail 記錄在數據庫的審計相關表中,如 aud$
,審計的結果只有連接信息;
DB,Extended
:這樣審計結果里面除了連接信息還包含了當時執行的具體語句;
OS
:將audit trail 記錄在操作系統文件中,文件名由 audit_file_dest
參數指定;
XML
:10g里新增的。
SQL> show parameter audit_trail
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
audit_trail string OS
修改參數,打開審計 sys
用戶的行為,審計記錄記錄到操作系統文件中:
SQL> alter system set audit_sys_operations=TRUE scope=spfile;
SQL> alter system set audit_trail=OS scope=spfile;
SQL> shutdown immediate
SQL> startup
注:這兩個參數是 static 參數,需要重新啟動數據庫才能生效。
audit_syslog_level
這個參數和 syslog
配合使用,可以轉發審計記錄到本地其他目錄或者遠程審計服務器。
在 CentOS
中,使用 rsyslog
代替 syslog
,r
意思是 Rocket-fast
,突出一個快。
配置 audit_syslog_level
為 local0.info
:
SQL> alter system set audit_syslog_level='local0.info' scope=spfile;
SQL> shutdown immediate;
SQL> startup;
SQL> show parameter audit;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
audit_file_dest string /data/oracle/admin/orcl/adump
audit_sys_operations boolean FALSE
audit_syslog_level string LOCAL0.INFO
audit_trail string OS
local0.info
是啥意思,這個是rsyslog
日志配置的兩個維度,local0
是facility
這個維度,有local0-local7
可選;info
是severity
這個維度,這個比較好理解,就是日志等級,后續過濾日志時可以使用這些維度去過濾。
配置 /etc/rsyslog.conf
# 審計記錄保存到本地文件,我們之前設置的 audit_syslog_level 為 `local0.info`, 那就過濾到特定文件中
local0.info /var/log/oracle_audit.log
# 或轉發到遠程審計服務器。@是使用 `UDP` 協議,@@是使用 `TCP` 協議
local0.info @140.0.1.108
# 找到這一行加上 `local0.none`,意思是不要把 oracle 日志寫入 message 文件中
*.info;mail.none;cron.none;local0.none /var/log/message
重啟 rsyslog
$ systemctl restart rsyslog
# sqlplus / as sysdba 時就會有數據了
$ tail -f /var/log/oracle_audit.log