等保测评2.0:Oracle安全审计(上) – 作者:起于凡而非于凡

 1. 说明

本篇文章主要说一说Oracle数据库安全审计控制点中测评项a的相关内容和理解。

 2. 测评项a

a)应启用安全审计功能,审计覆盖到每个用户,对重要的用户行为和重要安全事件进行审计;

Oracle自带有审计功能,可以通过audit_trail参数来开启使用。

查询audit_trail参数的语句如下

select value from v$parameter where name ='audit_trail';
show parameter audit_trail;

1595078271.png!small1595078280.png!small

注意,show parameter不是SQL语句,只能在sqlplus中使用,或者plsqldev的命令窗口中使用。

1595078293.png!small

 3. audit_trail参数说明

audit_trail参数有6个参数可以使用:

  • none:禁用数据库审计(强制审计除外),为理论上的默认值

  • os:将所有审核记录定向到操作系统文件,windows系统的话好像是会定向到事件查看器中的应用程序中(注意,其记录的值和db差不多,不包括具体的sql语句)

  • db:将所有审核记录定向到SYS.AUD$表(但强制审计的记录除外)

  • db, extended:同上,同时,SYS.AUD$表的SQL bind and SQL text列才会填充值,也就是说参数为db的情况下,并不会记录具体的sql语句

  • xml:记录的内容和参数值为db时一致,同时将记录定向到xml文件中

  • xml, extended:记录的内容和参数值为“db, extended”时一致,同时将记录定向到xml文件中

这里虽然在Oracle官方文档中,none是audit_trail参数的默认值,但实际上,audit_trail参数的值在没有改动的情况下,基本都是db:

1595078304.png!small

注意,该参数的设置需要重启数据库。

 4. 审计策略

在audit_trail的值不为none的情况下,Oracle会根据审计策略的设置来进行事件的记录,审计策略可以通过audit语句来添加,比如:

Audit alter user by access;

也可以使用noaudit取消某个审计策略:

NOAUDIT DELETE ANY TABLE;

审计策略分成以下几种:

1595078319.png!small

  • Statement:对某些SQL语句的审计,比如Create Table语句

  • Privilege:对权限设置的审计,比如Create Any Trigger

  • Object:对对象操作的审计,比如 Alter Table On The hr.employees

  • Netword:略

 5. Statement审计

查询对SQL语句的审计策略:

select * from dba_stmt_audit_opts;

1595078329.png!small

User_Name为空值,意味着这个审计是针对所有用户的,在使用Audit语句的使用,是可以指定审计某个用户的:

AUDIT SELECT TABLE, UPDATE TABLE BY scott

至于SUCCESS列,则代表是对成功执行的语句进行审计
而FAILURE列,则代表是对失败的语句进行审计(注,这里的失败是指你sql语句正确的前提下引起的执行失败,比如权限不足)
这两列的值都是有三种,一种是BY ACCESS,一种是BY SESSION,最后一种就是未指定也就是不进行审计。

比如我使用如下语句新建了一个审计策略:
AUDIT SELECT TABLE BY ACCESS WHENEVER NOT SUCCESSFUL;
结果如下:

1595078339.png!small

至于BY ACCESS、BY SESSION,前者是每个操作都进行记录,后者是一个会话中,同类的操作只进行一次记录。
Oracle官方文档推荐使用BY ACCESS,但是我不很明白什么叫做同类的操作只记录一次,因为我使用BY SESSION实验后,同样的操作比如select或者update,都是执行几次就记录几次。
唯一的区别就是使用BY SESSION的时候,SES$ACTIONS列会有值:

1595078348.png!small

Oracle官方文档解释如下:

1595078356.png!small

可能我对一个会话中的理解有误?可是在使用by session后,我使用begin、end语句块执行多个update语句,还是会出现多个记录:

1595078366.png!small

Statement审计好像对SYS用户无效,不会记录SYS用户的操作,比如update操作。
另外,其他用户对SYS拥有对象的操作,也不会被记录,比如普通用户updateSYS用户的表(比如自己建立的一些测试表)

 6. Privilege 审计

查询权限设置的审计策略:

select * from dba_priv_audit_opts;

1595078374.png!small

同样,这里的审计对SYS用户无效(或者至少一部分无效),比如SYS用户自行Create User的操作,就没有被记录下来。
字段的意义与Statement审计策略表一样。

 7. Object审计

查询对对象操作的审计策略:

select* from dba_obj_audit_opts;

1595078384.png!small

这里每个操作下面的值代表的意思其实和前两种审计是一样的。
比如SEL,代表Select,S/S中,第一个字符,代表成功执行的语句的审计策略值,S代表By Session,以此类推,第三个字符,代表执行失败的语句的审计策略的值。
在这里,A代表By Access。

同样,这里的审计对SYS用户无效(或至少一部分无效)。

注意,Object审计和Statement审计有很多是重复的,有些SQL的审计设置了也不会有效果,比如Select Any Table,这个语句就算设置了审计也没有用,不会存在记录。
只有单独对某对象(比如某张表)设置Select的审计,才会有用。

 8. 强制审计

强制审计不受到audit_trail参数的影响:

1595078392.png!small

它会对SYSDBA或SYSOPER等以特权身份登录的用户的操作进行审计,不过记录的操作很有限,也就连接到实例,数据库启动和数据库关闭。
强制审计的记录存放于操作系统的文件中,比如linux,其默认路径为:$ORACLE_BASE/admin/$ORACLE_SID/adump:

[root@centos01 adump]# ll
总用量 2012
-rw-r-----  1 oracle oinstall  932 6月  30 2019 oraclesi_ora_10001_1.aud
-rw-r-----  1 oracle oinstall  721 6月  30 2019 oraclesi_ora_10008_1.aud
-rw-r-----  1 oracle oinstall 1141 6月  30 2019 oraclesi_ora_10115_1.aud
-rw-r-----  1 oracle oinstall  721 6月  30 2019 oraclesi_ora_10127_1.aud
-rw-r-----  1 oracle oinstall  721 6月  30 2019 oraclesi_ora_10136_1.aud
-rw-r-----  1 oracle oinstall  721 6月  30 2019 oraclesi_ora_10149_1.aud
-rw-r-----  1 oracle oinstall  728 7月  16 11:17 oraclesi_ora_10289_1.aud
-rw-r-----  1 oracle oinstall  728 7月  16 11:21 oraclesi_ora_10322_1.aud
-rw-r-----  1 oracle oinstall  728 7月  16 11:24 oraclesi_ora_10355_1.aud
-rw-r-----  1 oracle oinstall  731 6月  30 2019 oraclesi_ora_10699_1.aud
-rw-r-----  1 oracle oinstall  728 7月  16 12:41 oraclesi_ora_11224_1.aud
-rw-r-----  1 oracle oinstall  728 7月  16 12:42 oraclesi_ora_11244_1.aud
-rw-r-----  1 oracle oinstall  728 7月  16 12:49 oraclesi_ora_11298_1.aud
-rw-r-----  1 oracle oinstall  731 6月  30 2019 oraclesi_ora_11641_1.aud
-rw-r-----  1 oracle oinstall  728 7月  16 13:35 oraclesi_ora_11695_1.aud
-rw-r-----  1 oracle oinstall  728 7月  16 13:45 oraclesi_ora_11779_1.aud
-rw-r-----. 1 oracle oinstall  721 6月  28 2019 oraclesi_ora_11819_2.aud
-rw-r-----  1 oracle oinstall  731 6月  30 2019 oraclesi_ora_11877_1.aud
-rw-r-----. 1 oracle oinstall  722 6月  28 2019 oraclesi_ora_11883_1.aud
-rw-r-----  1 oracle oinstall  729 7月  16 14:00 oraclesi_ora_11903_1.aud
-rw-r-----  1 oracle oinstall  729 7月  16 14:00 oraclesi_ora_11905_1.aud
-rw-r-----  1 oracle oinstall  729 7月  16 14:00 oraclesi_ora_11907_1.aud
-rw-r-----  1 oracle oinstall  928 6月  30 2019 oraclesi_ora_11922_1.aud
-rw-r-----  1 oracle oinstall  729 7月  16 14:01 oraclesi_ora_11922_2.aud
-rw-r-----. 1 oracle oinstall  914 6月  28 2019 oraclesi_ora_11926_1.aud
-rw-r-----. 1 oracle oinstall  721 6月  28 2019 oraclesi_ora_11927_2.aud
-rw-r-----  1 oracle oinstall  729 7月  16 14:02 oraclesi_ora_11942_1.aud
-rw-r-----  1 oracle oinstall  728 7月  16 14:04 oraclesi_ora_11958_1.aud
-rw-r-----  1 oracle oinstall  729 7月  16 14:05 oraclesi_ora_11966_1.aud
-rw-r-----  1 oracle oinstall  729 7月  16 14:07 oraclesi_ora_11982_1.aud
-rw-r-----. 1 oracle oinstall  722 6月  28 2019 oraclesi_ora_11991_1.aud
-rw-r-----  1 oracle oinstall  928 7月  12 13:22 oraclesi_ora_12026_1.aud
-rw-r-----  1 oracle oinstall  721 6月  30 2019 oraclesi_ora_12031_2.aud
-rw-r-----  1 oracle oinstall  729 7月  16 14:16 oraclesi_ora_12062_1.aud
-rw-r-----  1 oracle oinstall  729 7月  16 14:16 oraclesi_ora_12064_1.aud
-rw-r-----  1 oracle oinstall  729 7月  16 14:16 oraclesi_ora_12066_1.aud
-rw-r-----  1 oracle oinstall  721 7月  12 13:28 oraclesi_ora_12067_2.aud

其具体内容为:

Sat Jul 18 13:27:43 2020 +08:00
LENGTH : '156'
ACTION :[7] 'STARTUP'
DATABASE USER:[1] '/'
PRIVILEGE :[4] 'NONE'
CLIENT USER:[6] 'oracle'
CLIENT TERMINAL:[13] 'Not Available'
STATUS:[1] '0'
DBID:[0] '
Mon Apr 27 21:33:40 2020 +08:00
LENGTH: "218"
SESSIONID:[6] "140380" ENTRYID:[1] "1" USERID:[0] "" ACTION:[3] "102" RETURNCODE:[1] "0" LOGOFF$PREAD:[1] "0" LOGOFF$LREAD:[3] "161" LOGOFF$LWRITE:[1] "4" LOGOFF$DEAD:[1] "0" DBID:[10] "1539943106" SESSIONCPU:[1] "0"
Mon Apr 27 21:39:36 2020 +08:00
LENGTH: "217"
SESSIONID:[6] "140377" ENTRYID:[1] "1" USERID:[0] "" ACTION:[3] "102" RETURNCODE:[1] "0" LOGOFF$PREAD:[1] "0" LOGOFF$LREAD:[2] "55" LOGOFF$LWRITE:[1] "8" LOGOFF$DEAD:[1] "0" DBID:[10] "1539943106" SESSIONCPU:[1] "0"
Mon Apr 27 21:43:59 2020 +08:00
LENGTH: "217"
SESSIONID:[6] "140385" ENTRYID:[1] "1" USERID:[0] "" ACTION:[3] "102" RETURNCODE:[1] "0" LOGOFF$PREAD:[1] "2" LOGOFF$LREAD:[2] "91" LOGOFF$LWRITE:[1] "4" LOGOFF$DEAD:[1] "0" DBID:[10] "1539943106" SESSIONCPU:[1] "2"

对于windows,则写入事件查看器中。

 9. audit_sys_operations参数

从前面几节来看,基本上就没对sys用户的操作进行了什么审计,通过audit_sys_operations参数,可以对sys用户实现审计。
哦,另外,这个参数不受到audit_trail参数的限制,audit_trail为none也不会影响到的。

SQL> show parameter audit_sys_operations;
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
audit_sys_operations                 boolean     FALSE

该参数默认值为false,启用后可对用户使用SYSDBA或SYSOPER特权连接时直接发出的SQL语句进行审计,审计记录和强制审计的记录存放在同一个文件中。

设置audit_sys_operations参数(注意,改参数的设置也需要重启数据库。)

alter system set audit_sys_operations=TRUE scope=spfile;

重启后,参数值就变化了:

SQL> show parameter audit;
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
audit_file_dest                      string      /oracle/admin/orcl/adump
audit_sys_operations                 boolean     TRUE
audit_syslog_level                   string      
audit_trail                          string      NONE

此时的audit_trail为none,不影响对sys用户的操作记录:

[root@centos01 adump]# find . -name "*.aud"  | xargs grep  'test8.testy'
./oraclesi_ora_4306_1.aud:ACTION :[26] 'select * from test8.testy '
./oraclesi_ora_4306_1.aud:ACTION :[26] 'SELECT * FROM test8.testy '
./oraclesi_ora_4292_1.aud:ACTION :[30] 'update test8.testy set no=102 '

这样,sys的记录就会存放在aud文件中了。
每次sys用户登录,都会生成一个aud文件。

 10. audit_file_dest参数

这个参数似乎关联到很多策略,它设置了强制审计的文件的存放路径,如果开启了audit_sys_operations参数,那么同样也是sys用户的日志存放路径(和强制审计的记录存放在同一个文件中)。
如果audit_trail参数是xml或者os或者xml, extended,那么AUDIT_FILE_DEST参数也是这些记录的存放路径。
至于是不是和sys用户的审计记录放在同一个文件中,就不清楚了,没做过实验。

对了,这个参数在windows平台上应该无效,比如强制审计的记录会在事件查看器中查看到。

 11. audit_syslog_level参数

这个参数的默认值是空,通过设置这个参数可以将审计记录定向至unix系统的syslog中。

1595078409.png!small

参数的值的赋值模式就是:AUDIT_SYSLOG_LEVEL=facility.priority.
例如:AUDIT_SYSLOG_LEVEL=local1.warning,local1是facility,warning是priority。
然后再在syslog.conf中进行设置:

local1.warning /var/log/audit.log

此设置将所有警告消息记录到/var/log/audit.log文件中。
之后,重启syslog服务、数据库即可。

从文档上看,这里应该是把针对非特权用户的审计记录和针对特权用户(sys)都使用syslog服务进行记录。

1595078421.png!small

所以,AUDIT_FILE_DEST参数就被覆盖了吗?不大清楚,没进行试验。

网上有相关文章介绍得好像还算清楚,有兴趣者可自行研究,这里就不继续说明了:
https://blog.csdn.net/ciqu9915/article/details/100214403
http://blog.itpub.net/519536/viewspace-694036/
http://blog.sina.com.cn/s/blog_8fa7b9f50101o7kc.html

 12. 总结

综上所述,为了满足测评项,sys用户的具体记录一定开启,即audit_sys_operations参数的值为true,然后audit_trail为db, extended或xml, extended。
这样,就可以把特殊用户和普通用户的操作记录一部分了,不过其实还是不够。
因为默认的Statement审计虽然包含了不少策略,但是没有对update的审计,而Object审计默认就是空的……

Oracle自带了一个sql文件,估计默认的审计策略其实就是通过这个文件生成的:

[root@centos01 ~]# cat /oracle/app/rdbms/admin/secconf.sql;
Rem
Rem $Header: rdbms/admin/secconf.sql /main/3 2008/10/26 23:05:27 apsrivas Exp $
Rem
Rem secconf.sql
Rem
Rem Copyright (c) 2006, 2008, Oracle and/or its affiliates. All rights reserved.
Rem
Rem    NAME
Rem      secconf.sql - SECure CONFiguration script
Rem
Rem    DESCRIPTION
Rem      Secure configuration settings for the database include a reasonable
Rem      default password profile, password complexity checks, audit settings
Rem      (enabled, with admin actions audited), and as many revokes from PUBLIC
Rem      as possible. In the first phase, only the default password profile is
Rem      included.
Rem
Rem
Rem    NOTES
Rem      Only invoked for newly created databases, not for upgraded databases
Rem
Rem    MODIFIED   (MM/DD/YY)
Rem    apsrivas    09/30/08 - bug 7428539: Add missing audit settings
Rem    asurpur     06/16/06 - audit changes for sec config 
Rem    rburns      06/12/06 - secure configuration script 
Rem    rburns      06/12/06 - Created
Rem
Rem Secure configuration settings. Currently, only the default password
Rem profile is included, without the password complexity check. We will add
Rem the audit settings, revokes from PUBLIC, and the password complexity 
Rem checks.
-- Create password profile without a password complexity routine, for backward
-- compatibility. Add the routine if possible without breaking tests
ALTER PROFILE DEFAULT LIMIT
PASSWORD_LIFE_TIME 180
PASSWORD_GRACE_TIME 7
PASSWORD_REUSE_TIME UNLIMITED
PASSWORD_REUSE_MAX UNLIMITED
FAILED_LOGIN_ATTEMPTS 10
PASSWORD_LOCK_TIME 1
;
-- Turn on auditing options
Audit alter any table by access;
Audit create any table by access;
Audit drop any table by access;
Audit Create any procedure by access;
Audit Drop any procedure by access;
Audit Alter any procedure by access;
Audit Grant any privilege by access;
Audit grant any object privilege by access;
Audit grant any role by access;
Audit audit system by access;
Audit create external job by access;
Audit create any job by access;
Audit create any library by access;
Audit create public database link by access;
Audit exempt access policy by access;
Audit alter user by access;
Audit create user by access;
Audit role by access;
Audit create session by access;
Audit drop user by access;
Audit alter database by access;
Audit alter system by access;
Audit alter profile by access;
Audit drop profile by access;
Audit database link by access;
Audit system audit by access;
Audit profile by access;
Audit public synonym by access;
Audit system grant by access;

另外还自带了一个去除审计策略的文件:

[root@centos01 ~]# cat /oracle/app/rdbms/admin/undoaud.sql
Rem
Rem $Header: undoaud.sql 11-jul-2006.14:51:26 asurpur Exp $
Rem
Rem undoaud.sql
Rem
Rem Copyright (c) 2006, Oracle. All rights reserved.  
Rem
Rem    NAME
Rem      undoaud.sql - undo 11g default auditing changes 
Rem
Rem    DESCRIPTION
Rem      Undo the audit-related secure configuration changes for 11g. This
Rem      reverts to the 10gR2 default settings, which have auditing disabled
Rem      by default, and no audit options set. Called by DBCA if requested
Rem      by user for compatibility or performance reasons. Not intended to be
Rem      used during upgrade, since any customer audit options will be 
Rem      removed.
Rem
Rem    NOTES
Rem      <other useful comments, qualifications, etc.>
Rem
Rem    MODIFIED   (MM/DD/YY)
Rem    nlewis      07/11/06 - add comments 
Rem    asurpur     06/16/06 - audit changes for sec config 
Rem    asurpur     06/16/06 - audit changes for sec config 
Rem    asurpur     06/16/06 - Created
Rem
-- Turn off auditing and auditing options
noaudit all;
noaudit all privileges;
noaudit exempt access policy;
-- Can use the following to check that all audit options are indeed off:
-- select * from dba_stmt_audit_opts;
-- select * from dba_priv_audit_opts;

Oracle的审计功能很强大,强大也就意味着复杂,网上的文章很多,但是看起来也很费劲。特别是有一些参数,oracle自己的官方文档也是说得模模糊糊的。
不过其实也没有必要都搞清楚,实际测评时几乎就没有使用Oralce自带的审计功能的(当然被测评方有专业的DBA的话另说),要么就是默认值,要么就直接上数据库审计设备。
不过为了以防万一,最好还是了解下各个参数基本的作用,要是别人真使用自带的审计功能进行了配置,你现场查搜索参数的作用的话,一时半会不容易搞清楚,另外一点就是会比较尴尬……

Oracle的涉及到审计的官方文档地址如下,有兴趣者可自己去研究下:
https://docs.oracle.com/cd/E11882_01/network.112/e36292/auditing.htm#DBSEG006

 

来源:freebuf.com 2020-07-18 21:33:43 by: 起于凡而非于凡

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论