使用AUDIT_SYSLOG_LEVEL進行Sys用戶行爲監控

http://blog.chinaunix.net/uid-8504518-id-3437480.html

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

 
Oracle從大規模商用化到今天,一直在不斷的推進審計功能模塊,以適應靈活多變的用戶需求。目前的Oracle審計功能,主要分爲Traditional Audit和Fine Grained Audit(FGA)兩種技術主線。這兩條主線主要提供的是對於用戶行爲和數據兩個主要層面的審計內容。
 
1Sys用戶審計
 
Sys用戶是Oracle系統中很特殊的一個用戶,類似於Linux/Unix中的root,具有絕對的超級權限。除了允許訪問、操作大多數數據之外,Sys用戶是具有對Oracle內部元數據基礎表進行刪除的權限。
 
鑑於Sys用戶的巨大權限和潛在危險性,我們通常在使用數據庫的時候,都不會直接使用sys用戶,而是創建普通用戶帳號進行管理。
 
從安全的層面上,Oracle也對於Sys的基本操作行爲,如登陸、退出動作,都提供了默認審計策略。
 
但是,這個過程中,是存在一個問題的。默認情況下,Sys的審計信息是記錄在dba_audit_trail視圖中進行查詢,也就是記錄在基表aud$下面。而Sys恰恰是擁有該表數據刪除權限的用戶。這樣,Sys用戶是可以刪除掉關於自己“不利”的信息的。
 
解決這個問題,單純從DB層面是不可解的。完全解決要藉助操作系統,嘗試將日誌輸出到操作系統。在操作系統層面,數據庫的安裝用戶(dba,oinstall)就會受到限制。
 
在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 <sys/klog.h>
      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 -HUP2517
 
 
操作系統層面的配置到此爲止,接下來就要配置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------- 1root root  1083 Jul 2 07:27 oracle_dbms
[oracle@bspdev log]$ cat oracle_dbms
cat: oracle_dbms: Permission denied
 
 
oracle_dbms的owner爲root,其權限配置就決定了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用戶的關鍵操作,如startup、shutdown和connect等。但是,並不是所有的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參數進行配合。
 
3、Sys用戶的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工作的一個重要部分。限制權限、管制監控行爲,粗看是對我們運維人員的限制,實際上也是對運維人員責任的保護和證明。用好審計,可以提高數據庫安全級別,消除系統安全漏洞,完善運維制度。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章