【经验分享】Oracle Serucity — Oracle审计技术介绍

-- Objectives

描述在安全和审计中DBA的职责;

开启标准的审计;

指定审计的选项;

查看那审计信息;

维护审计信息;

-- Database Security

1.限制数据和服务的访问:根据数据库中存放的数据类型,业务需要,对客户隐私的保护和法律限制,有些数据时严格受限访问的;比如信用卡信息,医疗数据,身份Zheng信息;Oracle提供了非常严格的细粒度的认证控制,但是首先要做到最小化权限的原则;

2.验证用户:做到最小化权限原则之后,有的用户必须要去访问敏感数据,那么系统必须要知道是谁要去访问数据;

     验证用户的几个方向:

     1.需要用户提供他们知道什么,最常用的就是密码,但是不安全;

     2.强一点的验证是需要用户提供他们有什么,比如token,比如PKI(Public KeyInfrastructure,公钥加密和数字签名);

     3.更强一点的就需要用户提供唯一的生理学特征,比如指纹,视网膜扫描,骨骼匹配;

3.监控可疑活动:尽管用户通过了验证,也要监控数据库中可疑的活动,比如查询大量的信用卡信息等等,可以第一时间检测数据库信息是否被盗;Oracle提供了大量的审计工具区跟踪用户的活动和判断可疑的动作;

-- Monitoring for Compliance,合规性监控

1.审计就是捕获数据库中发生的动作并存储起来,但是数据库中很多不同的活动,如果全都审计下来会影响系统的性能,所以我们只需要关心特定的活动审计;

2.Mandatory Auditing:不管其它审计选项或参数为何,所有Oracle数据库都会审计特定的操作;由于数据库需要记录系统启动/关闭数据库,用户连接的活动信息,所以存在强制性审计日志;

3.Standard Database Auditing:需要在系统级别打开AUDIT_TRAIL初始化参数,打开审计后,使用AUDIT命令审计相应的对象和权限;

4.Value-based Auditing:基于标准数据库审计的扩展,不仅会捕获已发生的审计事件,还会捕获插入,更新或删除的实际值;基于值审计是通过数据库触发器实现的;

5.Fine-grained Auditing(FGA):FGA扩展了标准数据库审计的功能,这种审计可捕获实际执行SQL语句,而不仅仅是发生的事件;

6.sysdba/sysoper Auditing:在DBA与审计者或安全管理员之间划分审计责任,审计者或安全管理员在操作系统审计中负责监视DBA的活动;

-- Audit Tool Comparisons

1.标准审计:主要是审计访问对象时候的权限,审计的结果是固定的格式;

2.基于值的审计:主要是审计DML语句,审计的结果由管理员定义;

3.FGA:主要是审计基于内容的SQL语句,审计的结果中包含执行的SQL;

-- Standard Database Auditing

1.为了使用标准审计,必须首先设置audit_trail参数用来指定审计日志存放的地方;

2.开启审计功能后,需要指定审计的选项,比如登陆事件,系统/对象权限,SQL语句的使用等等,数据库开始收集审计信息;

3.查看审计信息;

4.维护审计信息,把关心的数据给汇总,因为审计信息增长很快,要及时维护来避免影响数据库性能;

-- Configuring the Audit Trail

1.语法:ALTER SYSTEM SET AUDIT_TRAIL = {none | os | db [, extended] | xml [, extended] } SCOPE = SPFILE;

2.静态参数,设置后需要重启数据库;如果是使用dbca创建的,参数默认是db,如果是手动建库的话默认是none;

1.none:不打开审计;

2.os:记录审计日志到操作系统中,在linux中是audit_file_dest参数指定的目录/u01/app/oracle/admin/ORCL/adump;

3.db/db extended:记录审计信息到数据库中;sys.aud$表(sys.dba_audit_trail表是建立在aud$表上的视图);里面记录了用户登录登出的强制性审计信息;

4.xml/xml extended:以xml文件形式存在audit_file_dest参数指定的目录下,也可以通过SELECT * FROM v$xml_audit_trail视图查看对象目录下的xml文件;

-- Uniform Audit Trails

在dba_audit_trail视图(基表是aud$)中可以查看标准审计,在dba_fga_audit_trail视图(fga_log$)中可以查看FGA审计,但是为了方便分析数据库的活动,还提供了一个公共的视图dba_common_audit_trail,可以查看标准审计和FGA审计;

SELECT * FROM dba_audit_trail;

SELECT * FROM dba_fga_audit_trail;

SELECT * FROM dba_common_audit_trail;

-- Specifying Audit Options

1.SQL statement auditing:按照SQL语句审计,AUDIT TABLE,表示审计任何影响表的DDL语句(CREATE/DROP/TRUNC TABLE);

2.System-privilege auditing:按照系统权限来审计;可以使用[BY user][BY[SESSION | ACCESS]] [WHENEVER [NOT] SUCCESSFUL]子句,默认是BY ACCESS;

3.Object-privilege auditing:按照对象权限来审计,可以审计表/视图/存储过程/序列/目录对象/用户自定义类型;可以使用[BY user][BY[SESSION | ACCESS]] [WHENEVER [NOT] SUCCESSFUL]子句,默认是BY SESSION;

补充:打开帮助文档解释;

[BY user] [BY [SESSION | ACCESS]] [WHENEVER [NOT] SUCCESSFUL]

BY user:如果不指定是所有用户,指定的话是某一个用户;

BY SESSION:表示在同一个session中,相同类型的SQL语句和操作访问同一个schema中的对象,只会记录一个audit trail;

BY ACCESS:每一个审计的操作都会记录一条audit trails,对性能影响比较大;

WHENEVER [NOT] SUCCESSFUL:成功/失败时才会记录audit trals,如果不指定的话是不管成功失败都会记录;

查看设置的语句级别审计:SELECT * FROM dba_stmt_audit_opts;

查看设置的权限级别审计:SELECT * FROM dba_priv_audit_opts;

查看设置的对象级别审计:SELECT * FROM dba_obj_audit_opts;

使用ON DEFAULT子句设置的对象审计:SELECT * FROM all_def_audit_opts;

eg:用非sys用户做操作,然后在SELECT * FROM dba_audit_trail视图中查看;

-- Default Auditing

在11g中开启审计后,图中的权限和SQL语句就会被默认审计下来,默认子句只有BY ACCESS(即所有用户,无论成功失败,BY ACCESS);

-- EnterpriseManager Audit Page

Server->Audit Setting(Security);

-- Value-Based Auditing

1.标准审计记录了审计对象上插入/更新/删除记录的动作,但是并不能获取实际改变的值;基于值的审计使用数据库的触发器来获得改变的值;

2.当用户对一个表插入/更新/删除数据时触发相应的触发器,触发器在后台工作,把审计信息拷贝到审计表中;

3.基于值的审计会比标准审计更影响数据库的性能,因为每次都要执行触发器的代码,影响的程度取决于触发器的代码的复杂度;

4.基于值的审计用的场合很少,基本已经被FGA所替代了;

eg:

CREATE TABLE system.audit_employees(os_user VARCHAR(500), audit_timeDATE, ip_address VARCHAR(15), employee_id INTEGER, description VARCHAR(1000));

CREATE OR REPLACE TRIGGER system.hrsalary_audit

     AFTER UPDATE OF salary ON hr.employees

     REFERENCING NEW AS NEW OLD AS OLD

     FOR EACH ROW

BEGIN

     IF :OLD.salary != :NEW.salary THEN

          INSERT INTOsystem.audit_employees

          VALUES

              (sys_context('userenv', 'os_user'),

              SYSDATE,

              sys_context('userenv', 'ip_address'),

              :NEW.employee_id,

              'salary changed from ' || :OLD.salary || ' to ' || :NEW.salary);

     END IF;

END;

UPDATE hr.employees SET salary = salary WHERE employee_id = 200;

COMMIT;

SELECT * FROM system.audit_employees;

UPDATE hr.employees SET salary = salary * 1.1 WHERE employee_id = 200;

COMMIT;

SELECT * FROM system.audit_employees;

-- Fine-Grained Auditing

1.标准审计值记录了操作的发生,而不捕获实际的SQL语句,FGA扩展了这个功能,不但可以捕获查询或者操作数据实际执行的SQL语句,还允许比标准审计和基于值的审计更加精细的审计;

2.FGA的选项可以审计到表/视图的列,甚至可以精确到某一个条件,更强大的是还可以调用存储过程;

3.主要通过DBMS_FGA包创建一个审计策略来完成,当满足审计条件时就会记录相应是审计条目到响应的审计表中;FGA默认是关心到语句级别,不管语句影响多少行的记录,只会产生一个审计条目;

-- FGA Policy

DBMS_FGA.ADD_POLICY(

   object_schema      VARCHAR2,     -- 被审计对象的架构名,如果为NULL的话就是当前登陆用户;

   object_name       VARCHAR2,      -- 被审计的对象名;

   policy_name        VARCHAR2,     -- 审计策略名称,要唯一;

   audit_condition    VARCHAR2,     -- 审计的条件,结果集中是否有满足条件的记录,如果有就审计,如果为NULL的话,就是返回TRUE;

   audit_column       VARCHAR2,     -- 访问的列,如果是多列的话中间用[,]分割;默认是NULL,表示任何一列;

   handler_schema     VARCHAR2,     -- 执行的存储过程的schema;

   handler_module     VARCHAR2,     -- 执行的存储过程名称,当第一条满足审计条件的记录处理后调用,有固定的格式查看帮助文档;

   enable            BOOLEAN,       -- 是否开启审计策略,默认是TRUE;

   statement_types    VARCHAR2,     -- 审计的SQL语句种类:INSERT/UPDATE/DELETE/SELECT;

   audit_trail        BINARY_INTEGER IN DEFAULT,     -- 审计条目存放的地方,默认是DB+EXTENDED,fga_log$表;

   audit_column_opts  BINARY_INTEGER IN DEFAULT);    -- 指定是满足audit_column条件中指定的任何列还是所有列,DBMS_FGA.ANY_COLUMNS(默认)/DBMS_FGA.ALL_COLUMNS;

-- Audited DML Statement:Considerations

对于DML语句的审计,不管是新值还是旧值,只要是满足了审计策略就会被记录;

对于DELETE语句,策略中指定的audit_column参数无效,因为所有的列都会被删除语句影响到;

对于MERGE语句,它依赖于语句中使用的INSERT/UPDATE/DELETE语句的审计;

例子中审计和没有审计的原因是因为条件department_id = 10;

SELECT * FROM hr.employees WHERE commission_pct = .2 AND department_id =10;

SELECT * FROM hr.employees WHERE employee_id = 200 AND department_id =10

-- FGA Guidelines

1.如果要审计所有的记录,那么设置audit_condition=NULL;

2.如果想要审计所有的列,那么设置audit_column=NULL;

3.策略的名称必须唯一;

4.在创建策略之前,被审计的表或者视图必须已经存在;

5.如果策略的条件语法有错误的话,那么在访问对象时会报ORA-28112错误;

6.如果审计的列在表中不存在,那么没有列被审计;

7.如果事件处理器不存在,不会报错,并且依然会产生审计记录;

eg:

BEGIN

     dbms_fga.add_policy(object_schema => 'HR',

                             object_name => 'EMPLOYEES',

                             policy_name => 'audit_emps_salary',

                             audit_condition => 'department_id=10',

                             audit_column => 'SALARY,COMMISSION_PCT',

                             enable => TRUE,

                             statement_types => 'SELECT,UPDATE');

END;

/

SELECT employee_id, job_id FROM hr.employees WHERE department_id = 20;

SELECT employee_id, salary FROM hr.employees WHERE department_id = 10;

UPDATE hr.employees SET salary = salary WHERE department_id = 10;

COMMIT;

conn / as sysdba

SELECT * FROM fga_log$;

SELECT * FROM dba_fga_audit_trail;

-- Data Dictionary Views

SELECT * FROM dba_fga_audit_trail;记录了所有fga审计的事件;

SELECT * FROM *_audit_policies;包含了fga的策略;

-- 补充:fga审计的审计记录和事务是互相独立的,也就是如果你的事务回滚了,那么审计记录还会被记录下来;(测试一下基于值的审计发现,不会记录的)

FGA审计是通过一个自动事务来插入审计记录的,这种事务在它自己的上下文中提交,当DML语句失败或者被回滚时,插入的审计记录不被回滚?

这样就会导致出现虚假的审计记录,可以通过什么办法解决?可以根据发出的SQL语句和SCN,通过闪回查询来查看修改之前和之后的值,这个时候查到了就可以请这个人喝茶了;

接来下的问题是UNDO的保存时间又是有限的?可以通过FDA解决;

SELECT employee_id, salary FROM hr.employees

AS OF SCN 1144994

WHERE department_id = 10;

--sysdba/sysoper审计:

1.sysdba/sysoper用户有启动/关闭数据库权限;因为它们可以当数据库关闭的时候做一些操作,所以它们的审计信息必须存在数据库之外;

2.Oracle自动捕获sysdba/sysoper用户的登陆信息,但是只是在audit_trail=OS时有用,因为它们可以篡改数据库中的记录;

3.默认只是捕获sysdba/sysoper用户的登陆信息,如果想要审计其它的信息的话,必须开启audit_sys_operations初始化参数;

4.如果开启sys操作审计的话,默认也是放在audit_file_dest目录下;

eg:

ALTER SYSTEM SET audit_sys_operations = TRUE SCOPE = SPFILE;

shutdown immediate;

startup

cd /u01/app/oracle/admin/ORCL/adump

sqlplus / as sysdba

ALTER USER hr IDENTIFIED BY hr;

SELECT sid FROM v$mystat WHERE rownum = 1;

然后查看对应的trace文件;

-- Maintaining the Audit Trail

1.因为审计的aud$和fga_log$都在system表空间,所以必须它们尽快归档,可以使用expdp/impdp工具;

2.也可以移动到其它的表空间上,注意表上的lob字段;

ALTER TABLE sys.aud$ MOVE TABLESPACE users;

ALTER TABLE sys.aud$ MOVE lob(sqlbind) STORE AS(tablespace USERS);

ALTER TABLE sys.aud$ MOVE lob(SQLTEXT) STORE AS(tablespace USERS);

ALTER TABLE sys.fga_log$ MOVE TABLESPACE users;

ALTER TABLE sys.fga_log$ MOVE lob(LSQLTEXT) STORE AS(tablespace USERS);

ALTER TABLE sys.fga_log$ MOVE lob(LSQLBIND) STORE AS(tablespace USERS);

-- Oracle Audit Vault

1.Oracle Audit Valut可以透明的收集和统一安全审计数据,可以兼容2.Oracle9iR;

2,MSSQL2000/2005/2008,DB2,Sybase ASE;

3.帮助组织/简化/统一报表格式,另外还提供了开放的仓库审计架构,可以被Oracle BIPublisher,Oracle;

4.Application Express和第三方报表工具;

5.Oracle Audit Vault帮助降低IT运营成本,集中化管理和设置,方便使用;

补充:

1.从宏观方面看,Vault属于Oracle数据库安全领域中-访问控制的部分;

2.和VPD,OLS不不一样的是,Vault在实际的生产环境下,最主要的目的是为了防止具有sys用户DBA滥用权限;

3.在没有Vault情况下,sys可以随意查看数据,这对于一些企业(特别是金融领域)来说是不允许的,而有了Vault,就可以控制DBA不能访问应用的核心数据;

4.现在有HR领域和Fin领域,即使拥有sys权限的DBA也无法访问这两个领域,只有相应领域的用户才能访问某特定领域的数据;这样就彻底解决了DBA权限被滥用的问题;

参与5

1同行回答

zftangzftang其它小白一枚
19c里已调整了显示全部

19c里已调整了

收起
互联网服务 · 2020-04-20
浏览1069

提问者

royalwzy
技术经理海通证券股份有限公司
擅长领域: 数据库服务器存储

问题来自

相关问题

相关资料

相关文章

问题状态

  • 发布时间:2017-03-13
  • 关注会员:4 人
  • 问题浏览:4847
  • 最近回答:2020-04-20
  • X社区推广