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 -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_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工作的一个重要部分。限制权限、管制监控行为,粗看是对我们运维人员的限制,实际上也是对运维人员责任的保护和证明。用好审计,可以提高数据库安全级别,消除系统安全漏洞,完善运维制度。