欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

(Les11 Oracle审计)[20180330]

程序员文章站 2022-08-09 23:19:26
的 说明DBA负责的安全和审计工作 启用标准数据库审计 指定审计选项 复查审计信息 维护审计线索 《Oracle Database Concepts》《Oracle数据库管理员指南》《Oracle 数据库安全性指南》 责任分离 责任分离的主要要求 DBA必须是可信任的,同时也必须承担责任(考虑因素) ......
    说明DBA负责的安全和审计工作
    启用标准数据库审计
    指定审计选项
    复查审计信息
    维护审计线索
        
    《Oracle Database Concepts》《Oracle数据库管理员指南》《Oracle 数据库安全性指南》
 
责任分离
    责任分离的主要要求
        DBA必须是可信任的,同时也必须承担责任(考虑因素)
            滥用信任:DBA可能会滥用DBA_USERS视图中的加密密码
            用审计线索保护受信任位置:审计线索会指定特定人员有没有违反规程和有没有破坏性行为。
        必须共同分担DBA责任
        绝对不要共享账户
        DBA和系统管理员必须由不同的人员担任
        分离操作员与DBA的责任
        
          Oracle Database Valut: 数据库必须强制执行责任分离,或者不允许DBA查看某些或所有数据库schema中的数据,可以使用Oracle Database Vault选件。
数据库安全性
    安全性功能
        -限制对数据和服务的访问,Oracle DB通过提供细粒度的授权控制来限制数据库访问。
        -验证用户
                遵循简单规则的口令
                比较严格的验证方法,令牌或公共密钥基础结构(PKI)证书
                更严格的验证方法,通过诸如指纹,虹膜,骨组织模式等唯一生物学特征来识别用户。
        监视可疑活动
 
监视合规性
     监视或审计是安全过程不可缺少的一部分
        
    强制性审计:不管其他审计选项或参数如何设置,所有Oracle DB都会审计特定的操作。由于数据库需要记录诸如授权用户连接等数据库活动,所以存在强制审计日志。
    标准数据库审计:通过使用audit_trail初始化参数在系统级别启用。启用审计之后,选项要审计的对象和权限,并使用audit命令设置审计属性。
    基于值审计:扩展了标准数据库审计的功能,不仅会捕获发生的审计事件,还会捕获插入,更新或删除的实际值。基于值审计是通过数据库触发器实施的。
    细粒度审计(FGA):扩展了标准数据库审计的功能,从而可捕获发出的实际SQL语句,而不仅仅是发生事件的情况。
    SYSDBA(和SYSOPER)审计:将DBA与审计者或安全管理员的审计责任分离开,审计者或安全管理员在操作系统审计线索中负责监视DBA的活动。
 
    标准数据库审计
    (Les11 Oracle审计)[20180330]

 

        使用数据库审计,必须先将静态AUDIT_TRAIL参数设置为指向审计记录的存储位置。这样做可启用数据库审计。启用数据库审计并指定审计选项(登录事件,执行的系统和对象权限或使用的SQL语句)后,数据库开始收集审计信息。
            -AUDIT_TRAIL参数设置为OS,审计记录存储在操作系统的审计系统中。ADUIT_FILE_DEST参数指定的文件中
            -ADUIT_TRAIL参数设置为DB或DB,EXTENDED,可以在DBA_ADUIT_TRAIL视图参看审计记录
            -ADUIT_TRAIL参数设置XML或XML,EXTENDED,审计记录会写入ADUIT_FILE_DEST参数指定的目录中的XML文件。使用V$XML_AUDIT_TRAIL视图可查看目录中的所有XML文件。
        维护审计线索是一项重要的管理任务。审计线索可能会迅速地增长,具体取决于审计选项的审计重点。如果维护不当,审计线索会创建过多的记录,以至影响系统的性能。审计开销与生成的记录号直接相关。
        
            ALTER SYSTEM SET ADUIT_TRAIL=[NONE|OS|DB|DB,EXTENDED|XML|XML,EXTENDED] SCOPE=SPFILE;
            修改静态初始化参数之后重新启动数据库。
 
    统一审计线索
        (Les11 Oracle审计)[20180330]

 

        Oracle DB进行标准审计和细粒度审计时跟踪相同的字段,这使您可以轻松分析数据库活动。为实现这点,标准审计线索和细粒度审计线索包含了彼此互补的属性。
        通过标准审计收集的额外信息包括:
            -系统更改号(SCN),记录对系统的每一项更改。
            -用户执行的确切SQL文本与SQL文本一起使用的绑定变量。只有已指定ADUIT_TRAIL=DB,EXTENDED的情况下,这些列才会出现。
        通过细粒度审计收集的额外信息包括:
            -每个审计记录的序列号
            -将源自一条语句的多个审计条目联系起来的语句编号。
        公共属性包括:
            -用全球标准时间(UTC)表示的全球时间戳。这个字段在监视不同地理位置和不同时区时的数据库时特别有用。
            -每个Real Application Cluster(RAC)实例的唯一实例编号。
            -用于将一个事务处理的审计记录组成一组的事务处理标识符。
        DBA_COMMON_AUDIT_TRAIL视图组合了标准审计日志记录和细粒度审计日志记录。
 
    指定审计选项
        -SQL语句审计
            AUDIT <TABLE_NAME>;
            可按用户名或者按成功或失败来设置SQL语句审计的重点:
                SQL>AUDIT TABLE BY HR WHENEVER NOT SUCCESSFUL;
        -系统权限审计(非重点和重点)
            AUDIT SELECT ANY TABLE,CREATE ANY TRIGGER;
            AUDIT SELECT ANY TABLE BY HR BY SESSION;
            审计设置可以为<BY SESSION>或<BY ACCESS>
        -对象权限审计(非重点和重点)
            AUDIT ALL ON HR.EMPLOYEES;
            AUDIT UPDATE,SELECT,ON HR.EMEPLOYEES BY ACCESS;
            可用來审计关于表,视图,过程,序列,目录和用户定义数据类型的操作.这种审计类型可按成功或失败设置审计的重点,而且可以按会话或访问权限分组.与系统权限审计不同,默认情况下,对象权限审计按会话分组.如果要为每个操作分别生成一条审计线索记录,必须显式指定<BY ACCESS>
 

 

        
audit all on hr.employees;--开启审计
 
col username format a20
col userhost format a30
col sql_text format a30
set linesize 300
 
select username,userhost,sql_text,timestamp from dba_audit_trail
where username='DBMONITOR'
and timestamp>=trunc(sysdate)
and sql_text is not null
/
 
 
noaudit all on hr.employees;--关闭审计
  

 

 
            (Les11 Oracle审计)[20180330]
 
    使用和维护审计信息
        最佳实践提示
            审计会造成性能下降,其幅度与审计线索的写入数据成比例.要定制满足站点需求的审计选项,可只启用那些满足安全策略所需的选项.设置审计重点,以减少审计线索条目的数量.
            (Les11 Oracle审计)[20180330]

 

基于值的审计
    进行数据库审计时会记录审计对象中发生的插入,更新和删除操作,但是不会捕获更改的实际值.要扩展数据库审计,可使用基于值的审计,利用数据库触发器(事件驱动的PL/SQL构造)来捕获更改的值.
    CREATE OR REPLACE TRIGGER HR.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 INTO HR.AUDIT_EMPLOYEES
              VALUES(SYS_CONTEXT('USERENV','OS_USER'),SYSDATE,SYS_CONTEXT('USERENV','IP_ADDRESS'),:NEW.EMPLOYEE_ID||' SALARY CHANGED FOR '|| :OLD.SALARY||' TO '||:NEW.SALARY);
      END IF;
  END;
 
/
 
 细粒度审计
        -根据内容监视数据访问
        -审计SELECT,INSERT,UPDATE,DELETE和MERGE
        -可链接到表或视图中的一列或多列
        -可以执行某个过程
        -使用DBMS_FGA程序包进行管理
        数据库审计会记录已发生某个操作这一事实,但是不会捕获关于导致操作的语句的信息。细粒度审计(FGA)扩展了审计功能,可捕获查询或处理数据的实际SQL语句。与标准数据库审计或基于之的数据库审计相比,FGA将重点审计的范围设置得更窄。可将FGA选项设置为按表或视图中的各个列进行审计,还可以将其设置为条件选项,以便只在符合管理员定义的特定规范时才捕获审计。FGA策略支持多个相关列。默认情况下,如果其中任何一个出现在SQL语句中,就会审计该语句。通过使用DBMS_FGA.ALL_COLUMNS和DBMS_FGA.ANY_COLUMNS,可对语句中是否使用了任何或全部相关列来进行审计。
        可以使用DBMS_FGA PL\SQL程序包来创建对目标表或视图的审计策略。如果查询块中返回的任何与审计列和指定的审计条件相匹配,则审计事件会导致在审计线索中创建并存储审计记录。此外,审计事件还可执行某个过程。FGA自动将审计重点放在语句级别。一个SELECT语句会返回数千行,但只生成一条审计记录。
 
    FGA策略
        
        
COL username FORMAT a20
COL userhost FORMAT a30
COL sql_text FORMAT a30
SET LINESIZE 300
 
SELECT username,
       userhost,
       sql_text,
       timestamp
  FROM dba_audit_trail
 WHERE     username = 'DBMONITOR'
       AND timestamp >= TRUNC (SYSDATE)
       AND sql_text IS NOT NULL
/
 
 
BEGIN
   DBMS_FGA.add_policy (object_schema     => 'HR',--FGA审计对象schema
                        object_name       => 'EMPLOYEES',--审计table
                        policy_name       => 'audit_emps_salary',--FGA审计名称
                        audit_condition   => 'department_id=10',--FGA审计条件
                        audit_column      => 'SALARY,COMMISSION_PCT',--FGA审计的列名
                        handler_schema    => 'secure',--指定调用schema
                        handler_module    => 'log_emps_salary',--指定执行程式
                        enable            => TRUE,--启用审计
                        statement_types   => 'SELECT,UPDATE');--审计dml类型
END;
/
 
BEGIN--删除fga审计
   DBMS_FGA.drop_policy (object_schema   => 'HR',
                         object_name     => 'EMPLOYEES',
                         policy_name     => 'audit_emps_salary');
END;
/
 
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',
                        --handler_schema    => 'secure',--如果不指定存储路径,默认会存放在dba_fga_audit_trail视图中
                        -- handler_module    => 'log_emps_salary',
                        enable            => TRUE,
                        statement_types   => 'SELECT,UPDATE');
END;
/
 
 
SELECT salary
  FROM employees
 WHERE department_id = 10;
 
SELECT commission_pct
  FROM employees
 WHERE department_id = 10;
 
SELECT salary, commission_pct
  FROM employees
 WHERE department_id = 10;
 
DELETE employees
 WHERE department_id = 10;
 
 
 
SELECT salary, commission_pct FROM employees;
 
COL DB_USER FORMAT a20
COL userhost FORMAT a30
COL sql_text FORMAT a30
SET PAGESIZE 600
SET LINESIZE 300
ALTER SESSION SET nls_date_format='YYYY-MM-DD HH24:MI:SS';
 
SELECT DB_USER,
       userhost,
       sql_text,
       timestamp
  FROM dba_fga_audit_trail
 WHERE --DB_USER='DBMONITOR'
       timestamp >= TRUNC (SYSDATE) AND sql_text IS NOT NULL
/
 
DB_USER              USERHOST                       SQL_TEXT                       TIMESTAMP
-------------------- ------------------------------ ------------------------------ -------------------
DBMONITOR            *****************              SELECT salary FROM hr.employee 2018-03-30 11:04:44
                                                    s WHERE department_id=10
 
HR                   *****************              SELECT salary FROM employees w 2018-03-30 11:15:59
                                                    here department_id=10
 
HR                   *****************              SELECT commission_pct FROM emp 2018-03-30 11:16:31
                                                    loyees WHERE department_id=10
 
HR                   *****************              SELECT salary,commission_pct f 2018-03-30 11:17:00
                                                    rom employees WHERE department
                                                    _ID=10
 
HR                   *****************              SELECT salary,commission_pct f 2018-03-30 11:17:00
                                                    rom employees
 

 

    审计的DML语句,注意事项
        -如果满足FGA谓词并且引用了相关列,则会对记录进行审计.
        -无论指定的列是什么,都会审计DELETE语句.
        -会审计MEEGE语句以及生成的INSERT/UPDATE和DELETE语句。
        
 
 
BEGIN
   DBMS_FGA.add_policy (object_schema     => 'HR',
                        object_name       => 'EMP',
                        policy_name       => 'audit_emp_salary',
                        audit_condition   => 'department_id=90',
                        --audit_column      => 'SALARY,COMMISSION_PCT',
                        --handler_schema    => 'secure',
                        -- handler_module    => 'log_emps_salary',
                        enable            => TRUE,
                        statement_types   => 'DELETE');
END;
/
 
BEGIN
   DBMS_FGA.drop_policy (object_schema   => 'HR',
                         object_name     => 'EMP',
                         policy_name     => 'audit_emp_salary');
END;
/
 
DELETE emp
 WHERE department_id = 90;
 
SELECT SALARY, COMMISSION_PCT
  FROM emp
 WHERE department_id = 90;
 
DELETE emp ;
 
SELECT DB_USER,
       userhost,
       sql_text,
       timestamp
  FROM dba_fga_audit_trail
 WHERE --DB_USER='DBMONITOR'
       timestamp >= TRUNC (SYSDATE) AND sql_text IS NOT NULL
/
 

 

  

 
    FGA准则
        -要审计所有行,请使用NULL审计条件
        -要审计所有列,请使用NULL审计列
        -策略名必须唯一
        -创建策略时,审计的表或视图必须已经存在
        -如果审计条件语法无效,则访问审计的对象时会出现ORA-28112错误
        -如果表中不存在审计的列,则不会审计任何行
        -如果不存在事件处理程序,并不会返回任何错误,仍会创建审计记录。查询时触发‘ORA-28137: 无效FGA 审计程序’
 
    SYSDBA审计
        具有SYSDBA或SYSOPER权限的用户可在数据库处于关闭状态时进行连接。
            -审计线索必须存储在数据库外部
            -始终会对以SYSDAB或SYSOPER身份执行的连接进行审计
            -可使用AUDIT_SYS_OPEARATIONS启用对SYSDBA或SYSOPER操作的附加审计
            -可使用AUDIT_FILE_DEST控制审计存储路径
 
    维护审计线索
        应根据最佳实践准则来维护审计线索:
            -复查和存储旧记录
            -避免出现存储问题
            -避免记录丢失,标准审计的审计线索存储在AUD$表中,FGA审计线索存储在FGA_LOG$表中。默认情况下,这两个表都是SYSTEM表空间中。通过使用数据泵导出和导入可将这两个表迁移到另一个表空间中。
 
            ALTER TABLE SYS.AUD$ MOVE TABLESPACE <TABLESPACE_NAME>;
            SYS.FGA_LOG$--表上有LONG字段无法进行直接迁移,可采用DROP再CREATE.
        
3:53:14 SQL> select table_name,tablespace_name from dba_tables
13:53:21   2  where table_name='AUD$';
 
TABLE_NAME        TABLESPACE_NAME
----------------  ------------------------------------------------------------
AUD$               TP
 
13:53:23 SQL> ALTER TABLE SYS.AUD$ MOVE TABLESPACE SYSTEM;
 
13:53:59 SQL> select table_name,tablespace_name from dba_tables
13:54:02   2  where table_name='AUD$';
 
TABLE_NAME        TABLESPACE_NAME
----------------- ------------------------------------------------------------
AUD$              SYSTEM

 

Oracle Audit Vault
    合并和保护审计数据
        -Oracle 9i发行版2和更高的版本
        -SQL Server 2000,2005
        -IBM DB2 UDB 8.5和9.2
        -Sybase ASE 12.5-15.0
        -安全并可伸缩
        -清理源Oracle审计数据
    集中式报告
        -报表界面进行了更新,Oracle Application Express
        -合规性标准报表
        -新增定制报表
    安全威胁预警
        -检测和警告安全相关事件
 
 
 
总结
    审计类型:强制审计,标准审计,基于值的审计,细粒度的审计,SYSDBA/SYSOPER审计
    标准审计:audit_trail参数控制,NONE,OS,DB, DB EXTENDED,XML,XML, XML,EXTENDED,通过DBA_AUDIT_TRAIL视图查询,基表AUD$
    基于值的审计:触发器实现
    细粒度的审计:FGA,DBMS_FGA.ADD_POLICY,通过DBA_FGA_AUDIT_TRAIL视图查看,基表FGA_LOG$
    SYSDBA/SYSOPER审计