使用AUDIT_SYSLOG_LEVEL进行Sys用户行为监控

只谈情不闲聊 提交于 2019-12-12 04:38:36

对生产环境运行的系统而言,用户行为审计是一个非常重要的部分。当发生安全事故、非法侵入的时候,稳妥、全面的审计信息是我们发现安全漏洞和修复故障的重要依据。所以,所有的完善数据库产品中,都有专门的审计功能模块。

 

Oracle从大规模商用化到今天,一直在不断的推进审计功能模块,以适应灵活多变的用户需求。目前的Oracle审计功能,主要分为Traditional Audit和Fine Grained Audit(FGA)两种技术主线。这两条主线主要提供的是对于用户行为和数据两个主要层面的审计内容。

 

1、Sys用户审计

 

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

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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!