对sys用户进行行为审计(转载)

本文介绍如何通过操作系统层面和数据库设置,实现对Oracle数据库中Sys用户的登录、操作及SQL语句审计,确保数据库安全性。


转载自(文字有删减): https://blog.51cto.com/itbull/1177652

1、Sys用户审计

Sys用户是Oracle系统中很特殊的一个用户,类似于Linux/Unix中的root,具有绝对的超级权限。除了允许访问、操作大多数数据之外,Sys用户是具有对Oracle内部元数据基础表进行删除的权限。

鉴于Sys用户的巨大权限和潜在危险性,我们通常在使用数据库的时候,都不会直接使用sys用户,而是创建普通用户帐号进行管理。

从安全的层面上,Oracle也对于Sys的基本操作行为,如登陆、退出动作,都提供了默认审计策略。默认情况下,Sys的审计信息是记录在dba_audit_trail视图中进行查询,也就是记录在基表aud$下面。但是Sys又拥有该表数据删除权限,所以仅仅靠db层面是无法解决的,完全解决要借助操作系统,尝试将日志输出到操作系统。在操作系统层面,数据库的安装用户(dba,oinstall)就会受到限制。

Oracle 10g版本,推出了参数AUDIT_SYSLOG_LEVEL,可以实现这个功能。

2、OS层面审计记录

默认情况下,aduit_syslog_level参数是关闭的。

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的修改。

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.

此时,sys用户实际上已经进行了操作。我们查看操作系统层面的日志信息。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值