对sys用户进行行为审计
转载自(文字有删减): 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工作的一个重要部分。限制权限、管制监控行为,粗看是对我们运维人员的限制,实际上也是对运维人员责任的保护和证明。用好审计,可以提高数据库安全级别,消除系统安全漏洞,完善运维制度。
本文介绍如何通过操作系统层面和数据库设置,实现对Oracle数据库中Sys用户的登录、操作及SQL语句审计,确保数据库安全性。
2737

被折叠的 条评论
为什么被折叠?



