使用AUDIT_SYSLOG_LEVEL進行Sys使用者行為監控

realkid4發表於2012-07-02

 

對生產環境執行的系統而言,使用者行為審計是一個非常重要的部分。當發生安全事故、非法侵入的時候,穩妥、全面的審計資訊是我們發現安全漏洞和修復故障的重要依據。所以,所有的完善資料庫產品中,都有專門的審計功能模組。

 

Oracle從大規模商用化到今天,一直在不斷的推進審計功能模組,以適應靈活多變的使用者需求。目前的Oracle審計功能,主要分為Traditional AuditFine Grained AuditFGA)兩種技術主線。這兩條主線主要提供的是對於使用者行為和資料兩個主要層面的審計內容。

 

1Sys使用者審計

 

Sys使用者是Oracle系統中很特殊的一個使用者,類似於Linux/Unix中的root,具有絕對的超級許可權。除了允許訪問、操作大多數資料之外,Sys使用者是具有對Oracle內部後設資料基礎表進行刪除的許可權。

 

鑑於Sys使用者的巨大許可權和潛在危險性,我們通常在使用資料庫的時候,都不會直接使用sys使用者,而是建立普通使用者帳號進行管理。

 

從安全的層面上,Oracle也對於Sys的基本操作行為,如登陸、退出動作,都提供了預設審計策略。

 

但是,這個過程中,是存在一個問題的。預設情況下,Sys的審計資訊是記錄在dba_audit_trail檢視中進行查詢,也就是記錄在基表aud$下面。而Sys恰恰是擁有該表資料刪除許可權的使用者。這樣,Sys使用者是可以刪除掉關於自己“不利”的資訊的。

 

解決這個問題,單純從DB層面是不可解的。完全解決要藉助作業系統,嘗試將日誌輸出到作業系統。在作業系統層面,資料庫的安裝使用者(dbaoinstall)就會受到限制。

 

Oracle 10g,推出了引數AUDIT_SYSLOG_LEVEL,幫助我們實現了這個功能。

 

2、作業系統層面審計記錄

 

預設情況下,aduit_syslog_level引數是關閉的。我們本篇使用11g進行實驗。

 

 

SQL> select * from v$version;

BANNER

--------------------------------------------------------------------------------

Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production

PL/SQL Release 11.2.0.1.0 - Production

CORE        11.2.0.1.0         Production

 

SQL> show parameter audit_sys

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

audit_sys_operations                 boolean     FALSE

audit_syslog_level                   string     

 

 

該引數的作用原理是利用作業系統的審計記錄方法,在作業系統中,均有記錄日誌的功能元件。以Linux/Unix為例,就有syslog命令。

 

 

[root@bspdev ~]# man syslog

 

NAME

       syslog,  klogctl  -  read  and/or clear kernel message ring buffer; set

       console_loglevel

SYNOPSIS

       int syslog(int type, char *bufp, int len);

                       /* No wrapper provided in glibc */

       /* The glibc interface */

       #include

       int klogctl(int type, char *bufp, int len);

DESCRIPTION

       If you need the libc function syslog()  (which  talks  to  syslogd(8)),

       then look at syslog(3).  The system call of this name is about control-

   (篇幅原因,略。。。)

 

 

具體配置上,syslog的配置檔案在/etc/syslog.conf,其中配置了各種型別的日誌輸出位置和訊息源。

 

 

[root@bspdev ~]# cat /etc/syslog.conf

# Log all kernel messages to the console.

# Logging much else clutters up the screen.

#kern.*                                                 /dev/console

# Log anything (except mail) of level info or higher.

# Don't log private authentication messages!

*.info;mail.none;authpriv.none;cron.none                /var/log/messages

# The authpriv file has restricted access.

authpriv.*                                              /var/log/secure

# Log all the mail messages in one place.

mail.*                                                  -/var/log/maillog

# Log cron stuff

cron.*                                                  /var/log/cron

# Everybody gets emergency messages

*.emerg                                                 *

# Save news errors of level crit and higher in a special file.

uucp,news.crit                                          /var/log/spooler

# Save boot messages also to boot.log

local7.*                                                /var/log/boot.log

 

 

我們只需要將Oracle日誌輸出的配置資訊新增在該檔案中,就可以指定輸出位置。

 

 

--新增資訊

[root@bspdev ~]# vi /etc/syslog.conf

 

# Log all kernel messages to the console.

# Logging much else clutters up the screen.

# Save boot messages also to boot.log

local7.*                                                /var/log/boot.log

# About Oracle SysLog

user.notice                                             /var/log/oracle_dbms

 

 

指定一個user.notice的輸出位置是/var/log/oracle_dbms檔案。

 

此外,我們要讓syslog.conf引數生效,還要提醒一下後臺程式syslogd重新載入一下配置資訊。

 

 

[root@bspdev ~]# ps -ef | grep syslogd

root      2517     1  0 07:04 ?        00:00:00 syslogd -m 0

root      3825  3670  0 07:21 pts/0    00:00:00 grep syslogd

 

[root@bspdev ~]# kill -HUP 2517

 

 

作業系統層面的配置到此為止,接下來就要配置Oracle資料庫層面的審計內容。主要是針對audit_syslog_level的修改。

 

 

--Spfile Level修改引數

SQL> alter system set audit_syslog_level='user.notice' scope=spfile;

System altered

 

--重啟資料庫生效;

SQL> conn / as sysdba

Connected.

SQL> startup force

ORACLE instance started.

 

Total System Global Area  849530880 bytes

Fixed Size                  1339824 bytes

Variable Size             515903056 bytes

Database Buffers          327155712 bytes

Redo Buffers                5132288 bytes

Database mounted.

Database opened.

SQL>

 

 

此時,sys使用者實際上已經進行了操作。我們檢視作業系統層面的日誌資訊。

 

 

--oracle_dbms檔案被root擁有,不能進行修改檢視。

[oracle@bspdev ~]$ cd ..

[oracle@bspdev home]$ cd /var/log/

[oracle@bspdev log]$ ls -l | grep oracle

-rw------- 1 root root   1083 Jul  2 07:27 oracle_dbms

[oracle@bspdev log]$ cat oracle_dbms

cat: oracle_dbms: Permission denied

 

 

oracle_dbmsownerroot,其許可權配置就決定了oracle使用者不能進行修改。

 

 

[oracle@bspdev log]$ su - root

Password:

[root@bspdev ~]# cat /var/log/oracle_dbms

Jul  2 07:25:31 bspdev Oracle Audit[3901]: LENGTH : '155' ACTION :[7] 'STARTUP' DATABASE USER:[1] '/' PRIVILEGE :[4] 'NONE' CLIENT USER:[6] 'oracle' CLIENT TERMINAL:[13] 'Not Available' STATUS:[1] '0' DBID:[0] ''

Jul  2 07:25:31 bspdev Oracle Audit[4025]: LENGTH : '148' ACTION :[7] 'CONNECT' DATABASE USER:[1] '/' PRIVILEGE :[6] 'SYSDBA' CLIENT USER:[6] 'oracle' CLIENT TERMINAL:[5] 'pts/0' STATUS:[1] '0' DBID:[0] ''

Jul  2 07:25:35 bspdev Oracle Audit[4106]: LENGTH : '159' ACTION :[7] 'CONNECT' DATABASE USER:[1] '/' PRIVILEGE :[6] 'SYSDBA' CLIENT USER:[6] 'oracle' CLIENT TERMINAL:[5] 'pts/0' STATUS:[1] '0' DBID:[10] '3906514064'

Jul  2 07:27:05 bspdev Oracle Audit[4172]: LENGTH : '163' ACTION :[7] 'CONNECT' DATABASE USER:[3] 'sys' PRIVILEGE :[6] 'SYSDBA' CLIENT USER:[5] '51ibm' CLIENT TERMINAL:[8] '51IBM-PC' STATUS:[1] '0' DBID:[10] '3906514064'

Jul  2 07:27:05 bspdev Oracle Audit[4176]: LENGTH : '163' ACTION :[7] 'CONNECT' DATABASE USER:[3] 'sys' PRIVILEGE :[6] 'SYSDBA' CLIENT USER:[5] '51ibm' CLIENT TERMINAL:[8] '51IBM-PC' STATUS:[1] '0' DBID:[10] '3906514064'

 

 

oracle_dbms中,記錄了sys使用者的關鍵操作,如startupshutdownconnect等。但是,並不是所有的sys使用者資訊都可以被記錄下來。

 

 

SQL> show user;

User is "SYS"

 

SQL> drop table t purge;

Table dropped

 

SQL> create table t as select * from dba_objects;

Table created

 

 

這部分的資訊是不會記錄在日誌的。如果我們需要確實將sys所有的SQL操作記錄,則需要audit_sys_operations引數進行配合。

 

3Sys使用者的SQL審計

 

在上面的部分中,我們已經可以成功的對SYS使用者活動行為進行作業系統層面的審計。一些如啟動伺服器、關閉伺服器、登陸等操作可以完整的記錄在作業系統日誌下,只能由root使用者進行檢視。

 

那麼,我們可否對其操作審計粒度變得更細,也就是將sys使用者的SQL語句行為記錄下來呢?我們說,藉助引數audit_sys_operations,是可以做到這點的。

 

該引數的含義是是否對SYS使用者的操作進行日誌記錄。預設情況下,該引數取值為false

 

 

SQL> show parameter audit_sys

 

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

audit_sys_operations                 boolean     FALSE

audit_syslog_level                   string      USER.NOTICE

 

 

spfile層面進行修改之後,重新啟動伺服器。

 

 

SQL> alter system set audit_sys_operations=true scope=spfile;

System altered

 

[oracle@bspdev ~]$ sqlplus /nolog

SQL*Plus: Release 11.2.0.1.0 Production on Mon Jul 2 07:39:09 2012

Copyright (c) 1982, 2009, Oracle.  All rights reserved.

 

SQL> conn / as sysdba

Connected.

SQL> startup force

ORACLE instance started.

 

Total System Global Area  849530880 bytes

Fixed Size                  1339824 bytes

Variable Size             515903056 bytes

Database Buffers          327155712 bytes

Redo Buffers                5132288 bytes

Database mounted.

Database opened.

SQL>

 

 

此時,如果SYS使用者進行一些操作,就會被記錄在日誌上。

 

 

SQL> drop table t purge;

Table dropped

 

SQL> create table t as select * from dba_objects;

Table created

 

--檢視日誌

[root@bspdev ~]# tail -n 10 /var/log/oracle_dbms

Jul  2 07:41:29 bspdev Oracle Audit[4677]: LENGTH : '259' ACTION :[101] 'select length(chr(2000000000)) l4, length(chr(2000000)) l3,  length(chr(20000)) l2, 'c' c1 from dual ' DATABASE USER:[3] 'sys' PRIVILEGE :[6] 'SYSDBA' CLIENT USER:[5] '51ibm' CLIENT TERMINAL:[8] '51IBM-PC' STATUS:[1] '0' DBID:[10] '3906514064'

Jul  2 07:41:29 bspdev Oracle Audit[4677]: LENGTH : '202' ACTION :[45] 'select lengthb(nchr(20)), nchr(20) from dual ' DATABASE USER:[3] 'sys' PRIVILEGE :[6] 'SYSDBA' CLIENT USER:[5] '51ibm' CLIENT TERMINAL:[8] '51IBM-PC' STATUS:[1] '0' DBID:[10] '3906514064'

Jul  2 07:41:29 bspdev Oracle Audit[4677]: LENGTH : '235' ACTION :[78] 'begin sys.dbms_application_info.set_module('PL/SQL Developer', :action); end; ' DATABASE USER:[3] 'sys' PRIVILEGE :[6] 'SYSDBA' CLIENT USER:[5] '51ibm' CLIENT TERMINAL:[8] '51IBM-PC' STATUS:[1] '0' DBID:[10] '3906514064'

Jul  2 07:41:29 bspdev Oracle Audit[4677]: LENGTH : '218' ACTION :[61] 'begin :id := sys.dbms_transaction.local_transaction_id; end; ' DATABASE USER:[3] 'sys' PRIVILEGE :[6] 'SYSDBA' CLIENT USER:[5] '51ibm' CLIENT TERMINAL:[8] '51IBM-PC' STATUS:[1] '0' DBID:[10] '3906514064'

Jul  2 07:41:29 bspdev Oracle Audit[4677]: LENGTH : '177' ACTION :[20] 'drop table t purge  ' DATABASE USER:[3] 'sys' PRIVILEGE :[6] 'SYSDBA' CLIENT USER:[5] '51ibm' CLIENT TERMINAL:[8] '51IBM-PC' STATUS:[1] '0' DBID:[10] '3906514064'

(篇幅原因,省略部分內容……

 

 

4、結論

 

隨著資訊保安觀念的深入,安全漏洞和審計要求越來越成為DBA工作的一個重要部分。限制許可權、管制監控行為,粗看是對我們運維人員的限制,實際上也是對運維人員責任的保護和證明。用好審計,可以提高資料庫安全級別,消除系統安全漏洞,完善運維制度。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/17203031/viewspace-734433/,如需轉載,請註明出處,否則將追究法律責任。

相關文章