zoukankan      html  css  js  c++  java
  • Oracle 审计测试与总结

    Oracle数据库安全审计管理

     

    一、审计功能介绍

    审计(audit)用于监视用户所执行的数据库操作,审计记录可存在数据字典表(称为审计记录: 
    01.存储在system表空间中的 sys.aud$表中,可通过视图dba_audit_trail查看)或操作系统审计记录中( 02.默认位置为$oracle_base/admin/$oracle_sid/adump/)。
    默认情况下审计是没有开启的。10g
    默认情况下审计是开启的。11gR2+

    例如:数据被非授权用户所删除,此时安全管理员可决定对该数据库的所有连接进行审计,以及对数据库的所有表的成功地或不成功地删除进行审计。

    审计语句的成功执行、不成功执行,或者其两者。

    对每一用户会话审计语句执行一次或者对语句每次执行审计一次。

    对全部用户或指定用户的活动的审计。

    但有些功能不管开不开审计,都是会被记录的:

    用管理员权限连接instance;启动数据库;关闭数据库。

     

     

    二、审计相关的参数与视图

    1. audit_sys_operations

    1) audit_sys_operations
    默认为false,当设置为true时,所有sys用户(包括以sysdba, sysoper身份登录的用户)的操作都会被记录.
    audit trail不会写在aud$表中,这个很好理解,如果数据库还未启动aud$不可用,那么像conn /as sysdba这样的连接信息,只能记录在其它地方。
    如果是windows平台,audti trail会记录在windows的事件管理中,
    如果是linux/unix平台则会记录在audit_file_dest参数指定的文件中。

    show parameter audit_sys_operations
     
    show parameter audit_file_dest
    SQL> show parameter audit
    ​
    NAME                     TYPE    VALUE
    ------------------------------------ ----------- ------------------------------
    audit_file_dest              string  /data/app/oracle/admin/orcl/ad
                             ump
    audit_sys_operations             boolean     FALSE
    audit_syslog_level           string
    audit_trail              string  DB
    SQL>// 默认是 DB 意思是:将审计日志记录到数据库的审计相关表中 
    audit_trail 的value值为NONE表示不开启;
    audit_trail 的value值为FALSE表示不开启;
    audit_trail 的value值为DB表示开启;
    audit_trail 的value值为TURE表示开启
    audit_trail 的value值为OS表示审计记录写入一个操作系统文件
    ​ SQL> desc aud$ //默认的是记录到这个上面,默认的审计结果只有连接信息 Name Null? Type ----------------------------------------- -------- ---------------------------- SESSIONID NOT NULL NUMBER ENTRYID NOT NULL NUMBER STATEMENT NOT NULL NUMBER TIMESTAMP# DATE USERID VARCHAR2(30) USERHOST VARCHAR2(128) TERMINAL VARCHAR2(255) ACTION# NOT NULL NUMBER RETURNCODE NOT NULL NUMBER OBJ$CREATOR VARCHAR2(30) OBJ$NAME VARCHAR2(128) AUTH$PRIVILEGES VARCHAR2(16) AUTH$GRANTEE VARCHAR2(30) NEW$OWNER VARCHAR2(30) NEW$NAME VARCHAR2(128) SES$ACTIONS VARCHAR2(19) SES$TID NUMBER LOGOFF$LREAD NUMBER LOGOFF$PREAD NUMBER LOGOFF$LWRITE NUMBER LOGOFF$DEAD NUMBER LOGOFF$TIME DATE COMMENT$TEXT VARCHAR2(4000) CLIENTID VARCHAR2(64) SPARE1 VARCHAR2(255) SPARE2 NUMBER OBJ$LABEL RAW(255) SES$LABEL RAW(255) PRIV$USED NUMBER SESSIONCPU NUMBER NTIMESTAMP# TIMESTAMP(6) PROXY$SID NUMBER USER$GUID VARCHAR2(32) INSTANCE# NUMBER PROCESS# VARCHAR2(16) XID RAW(8) AUDITID VARCHAR2(64) SCN NUMBER DBID NUMBER SQLBIND CLOB SQLTEXT CLOB OBJ$EDITION VARCHAR2(30) ​ SQL>
     

     

    2. audit_trail

    none:是默认值,不做审计;
    db:将audit trail 记录在数据库的审计相关表中,如aud$,审计的结果只有连接信
    息;
    db,extended:这样审计结果里面除了连接信息还包含了当时执行的具体语句;
    os:将audit trail 记录在操作系统文件中,文件名由audit_file_dest参数指定;
    xml:10g里新增的。

    show parameter audit_trail
    NAME                     TYPE    VALUE
    ------------------------------------ ----------- ------------------------------
    audit_trail              string  DB
    SQL> 
    ​
    注:这两个参数是static参数,需要重新启动数据库才能生效。
    
    

    3. 审计相关的视图

    dba_audit_trail:
    保存所有的audit trail,实际上它只是一个基于aud$的视图。其它的视图dba_audit_session,dba_audit_object,dba_audit_statement 都只是dba_audit_trail的一个子集。

    dba_stmt_audit_opts:
    可以用来查看statement审计级别的audit options,即数据库设置过哪些statement级别的审计。dba_obj_audit_opts,dba_priv_audit_opts视图功能与之类似

    all_def_audit_opts:
    用来查看数据库用on default子句设置了哪些默认对象审计。

     

    三、审计级别与权限

     

    1.审计级别

    当开启审计功能后,可在三个级别对数据库进行审计:statement(语句)、privilege
    (权限)、object(对象)。

     

    1.1 statement(语句)

    statement
    语句审计,对某种类型的sql语句审计,不指定结构或对象。比如audit table 会审计
    数据库中所有的create table,drop table,truncate table语句,alter session by cmy
    会审计cmy用户所有的数据库连接。

    1.2 privilege(权限)

    privilege
    权限审计,当用户使用了该权限则被审计,如执行grant selectany table to a,当执
    行了audit select any table语句后,当用户a 访问了用户b的表时(如select * from
    b.t)会用到select any table权限,故会被审计。注意用户是自己表的所有者,所以用
    户访问自己的表不会被审计。

    1.3 object(对象)

    object
    对象审计,对一特殊模式对象上的指定语句的审计. 如审计on关键字指定对象的相关
    操作,如aduit alter,delete,drop,insert on cmy.t by itpux; 这里会对cmy用户的t表
    进行审计,但同时使用了by子句,所以只会对scott用户发起的操作进行审计。

    注意:

    oracle没有提供对schema中所有对象的审计功能,只能一个一个对象审计,对于后面

    创建的对象,oracle则提供on default子句来实现自动审计,比如执行audit drop on

    defaultby access;后,对于随后创建的对象的drop操作都会审计。但这个default会

    对之后创建的所有数据库对象有效,似乎没办法指定只对某个用户创建的对象有效,

    想比 trigger可以对schema的ddl进行“审计”,这个功能稍显不足。

     

    2.审计选项:by access(访问) / by session(会话)

    by access 每一个被审计的操作都会生成一条audit trail。
    by session 一个会话里面同类型的操作只会生成一条audit trail,默认为by session。

    3. whenever [not] successful

    whenever successful 操作成功(dba_audit_trail中returncode字段为0) 才审计, 
    whenever not successful 反之。省略该子句的话,不管操作成功与否都会审计

    4.审计的细粒度

    fine-grainedauditing(fga) 细粒度审计

    细粒度审计(fga):精细审计 ,是在 oracle 9i 中引入的,能够记录 scn 号和行级的更
    改以重建旧的数据,但是它们只能用于 select 语句,而不能用于 dml ,如 update 、
    insert 和delete 语句。
    因此,对于 oracle 数据库 10g 之前的版本,使用触发器虽然对于以行级跟踪用户
    初始的更改是没有吸引力的选择,但它也是唯一可靠的方法。
    10g 之后版本可以audit 所有dml。fga的实现基于dbms_fga包。它属于sys用户。

    fga 策略的定义位于数据字典视图 dba_audit_policies 中。
    审计线索收集在 sys 拥有的表 fga_log$ 中
    对于 sys 拥有的任何原始表,此表上的某些视图以对用户友好的方式显示信息。
    dba_fga_audit_trail是该表上的一个视图。

     

    四、审计功能的安装

    sqlplus> connect / as sysdba 
    sqlplus> select count(*) from sys.aud$; --没有记录返回 (11g默认就开了
    审计了) 
    sqlplus> select count(*) from dba_audit_trail; - 没有记录返回 
    如果做上述查询的时候发现表不存在,说明审计相关的表还没有安装,需要安装。
    sqlplus> connect / as sysdba 
    sqlplus> @$oracle_home/rdbms/admin/cataudit.sql
    
    注意:审计表安装在system表空间。所以要确保system表空间又足够的空间存放审计信息。
    安装后要重启数据库。

    五、审计功能迁移

    由于aud$表等审计相关的表存放在system表空间,因此为了不影响系统的性能,保护system表空间,最好把aud$移动到其他的表空间上。
     

    1. 创建审计用的表空间

    create tablespace audit_data
     logging 
     datafile '/oracle/oradata/itpuxdb/audit01.dbf' size 20m autoextend
     off extent management local segment space 
    management auto;

    2. 在线迁移

    [oracle@rac01 ~]$ sqlplus / as sysdba
    alter table aud$ move tablespace audit_data;
    alter table audit$ move tablespace audit_data;
    alter index i_audit rebuild online tablespace audit_data;
    alter table audit_actions move tablespace audit_data;
    alter index i_audit_actions rebuild online tablespace audit_data;

    查询结果

    select table_name,tablespace_name from dba_tables where table_name like
    2 '%AUD%';

    TABLE_NAME TABLESPACE_NAME
    ------------------------------ ------------------------------
    AUDIT_ACTIONS AUDIT_DATA
    AUDIT$ AUDIT_DATA
    AUD$ AUDIT_DATA
    WWV_FLOW_BUILDER_AUDIT_TRAIL SYSAUX
    MGMT_AUDIT_CUSTOM_ATTRIBS SYSAUX
    MGMT_AUDIT_LOGS SYSAUX
    MGMT_AUDIT_DESTINATION SYSAUX
    MGMT_AUDIT_MASTER SYSAUX
    MGMT_BCN_TXN_AUDIT SYSAUX
    REPCAT$_AUDIT_COLUMN SYSTEM
    REPCAT$_AUDIT_ATTRIBUTE SYSTEM

    TABLE_NAME TABLESPACE_NAME
    ------------------------------ ------------------------------
    AUDTAB$TBS$FOR_EXPORT_TBL SYSTEM
    STMT_AUDIT_OPTION_MAP SYSTEM

    13 rows selected.

    SQL>


    select index_name,tablespace_name from dba_indexes where index_name
    2 like '%AUDIT%';

    INDEX_NAME TABLESPACE_NAME
    ------------------------------ ------------------------------
    WWV_FLOW_BLD_AUDIT_PK SYSAUX
    WWV_FLOW_BUILD_AUDIT_TRAIL_I3 SYSAUX
    WWV_FLOW_BUILD_AUDIT_TRAIL_I5 SYSAUX
    MGMT_AUDIT_CUSTOM_ATTRIBS_PK SYSAUX
    MGMT_AUDIT_LOGS_IDX01 SYSAUX
    BCN_TXN_AUDIT_PRIMARY_KEY SYSAUX
    REPCAT$_AUDIT_COLUMN_PK SYSTEM
    REPCAT$_AUDIT_COLUMN_F1_IDX SYSTEM
    REPCAT$_AUDIT_COLUMN_F2_IDX SYSTEM
    REPCAT$_AUDIT_ATTRIBUTE_PK SYSTEM
    I_AUDIT_ACTIONS AUDIT_DATA

    INDEX_NAME TABLESPACE_NAME
    ------------------------------ ------------------------------
    I_STMT_AUDIT_OPTION_MAP SYSTEM
    I_AUDIT AUDIT_DATA

    13 rows selected.

    SQL>

    六、审计功能数据的清理

    审计功能的删除,主要是删除它的表:
    truncate 或者 delete sys.aud$ 表 在delete 之前,可以先把aud$表exp备份一下,注意,不要直接exp,先创建一张临时表,然后将临时表exp。
    sql>create table audit202005 tablespace users as select * from sys.aud$;
    
    然后exp:
    [oracle@rac01 ~]$exp system/oracle file=audit20200520.dmp tables=sys.audit202005
    
    最后delete 数据:
    sql>delete from sys.aud$;
    
    或者删除指定表的审计:
    sql>delete from sys.aud$ where obj$name='&table_nmae';
    注意,delete 不会释放system表空间。 可以使用truncate table:(所以不建议用 delete)
    
    sql>truncate table sys.aud$

    查看清空的结果
    SQL> select count(*) from sys.aud$;

    COUNT(*)
    ----------
    0

    SQL> select count(*) from dba_audit_trail;

    COUNT(*)
    ----------
    0

    SQL>

    七、审计的控制、撤销、关闭

    1.审计功能的参数:

    audit_trail 参数的值可以设置为以下几种

    1. none:不开启

    2. db:开启审计功能

    3. os:审计记录写入一个操作系统文件。

    4. true:与参数db一样

    5. false:不开启审计功能。

    这个参数是写道spfile里面的,需要重启数据库

    2.审计的取消

    将对应审计语句的audit改为noaudit即可,

    如audit session whenever successful

    对应的取消审计语句为noaudit session whenever successful;

     

    3.审计的关闭:

    但这个功能会针对很多操作都产生审计文件.aud,日积月累下来这些文件也很多,考

    虑到实际情况,

    11g默认是开启的--建议关闭。

    su - oracle
    sqlplus “/as sysdba”
    sql>alter system set audit_trail='none' scope=spfile;
    sql>shutdown immediate;
    sql>startup;
    从spfile可以看出,是需要重启数据库才生效的。
    删除审计数据,oracle用户登录到数据库服务器:
    sqlplus / as sysdba
    truncate table sys.aud$;

    八、标准数据库审计的配置

    1. 安装数据库的审计功能

    conn /as sysdba;
    @$ORACLE_HOME/rdbms/admin/cataudit.sql

    2.创建审计表空间,迁移审计表空间

    2.1 创建审计用的表空间

    create tablespace audit_data
     logging 
     datafile '+data/orcl/datafile/audit01.dbf' size 20m autoextend
     off extent management local segment space 
     management auto;

    2.2 在线迁移

    --connect / as sysdba;
    alter table aud$ move tablespace audit_data;
    alter table audit$ move tablespace audit_data;
    alter index i_audit rebuild online tablespace audit_data;
    alter table audit_actions move tablespace audit_data;
    alter index i_audit_actions rebuild online tablespace audit_data;

    2.3 查询结果

    select table_name,tablespace_name from dba_tables where table_name like 
    '%AUD%'; 
    select index_name,tablespace_name from dba_indexes where index_name
    like '%AUDIT%';

    2.4 开启数据库审计

    alter system set audit_sys_operations=true scope=spfile;
    alter system set audit_trail=db,extended scope=spfile;
    shutdown immediate;
    startup;
    show parameter audit;

    2.5 审计表 并测试审计功能

    ## 创建表空间 和用户 
    create tablespace hr
     logging 
     datafile '+data/orcl/datafile/hr.dbf' size 50m autoextend
     off extent management local segment space 
    management auto;
    CREATE USER hr IDENTIFIED by hr DEFAULT TABLESPACE hr;
    grant connect,resource,dba to hr;
    
    ## 创建表,并插入数据
    create table employees (id int,name varchar2(10));
    insert into employees values (1,'itpx01');
    insert into employees values (2,'itpx02');
    insert into employees values (3,'itpx03');
    insert into employees values (4,'itpx04');
    insert into employees values (5,'itpx05');
    insert into employees values (6,'itpx06');
    
    --审计hr.employees表select操作----
    audit select on hr.employees
    --audit select on hr.employees by session;
    --audit select on hr.employees by access;
    
    ## 进行几次查询做测试
    conn hr/hr   ---在hr 用户下执行
    select * from hr.employees where id=1;
    select * from hr.employees where id=2;
    select * from hr.employees where id=3;
    
    ## 查看结果  通过plsql 查看
    conn /as sysdba;
    select * from aud$ where userid='HR'、、
     select SESSIONID,USERID,SQLTEXT from aud$ where userid='HR';

    2.6 关闭审计功能

    ## 关闭审计功能(建议使用第一种)
    alter system set audit_trail=none scope=spfile;
    或者 //alter system reset audit_trail scope=spfile; 意思重新设置,设置成了默认值,建议使用第一种的即可
    
    shutdown immediate;
    startup;
    show parameter audit
    
    ##额取消审计的语句
    --noaudit all on hr.employees
    
    ## 清空记录
    truncate table sys.aud$  (建议使用 truncate)
    --delete from sys.aud$ where obj$name='EMPLOYEES';

    九、高精度数据库审计的配置(fga)

    1. 要求:

    对表hr.employees进行高精度审计,审计字段id,name,审计条件

    id=1,对select及update操作进行审计。

    (前提是已经开启了审计功能)

    2. 执行策略

    [oracle@rac01 ~]$ sqlplus / as sysdba
    SQL> exec dbms_fga.add_policy('hr','employees','mypolicy','id=1','name',statement_types=>'select');
    
    PL/SQL procedure successfully completed.
    
    
    dbms_fga--审计的函数  hr--用户  employees--表   mypolicy--策略名字 id=1--审核条件  name--审计字段
    statement_types--审计选项 

    3. 执行语句

    conn hr/hr
    SQL> select * from employees;
    
        ID NAME
    ---------- ----------
         1 itpx01
         2 itpx02
         3 itpx03
         4 itpx04
         5 itpx05
         6 itpx06
    
    6 rows selected.
    
    select * from hr.employees where id=1
    
    SQL> select * from hr.employees where id=6;
    
        ID NAME
    ---------- ----------
         6 itpx06

    4. 检查审计结果

    SQL> conn /as sysdba
    Connected.
    SQL> col sqltext format a30
    SQL> select sql_text from dba_fga_audit_trail;
    
    SQL_TEXT
    --------------------------------------------------------------------------------
    select * from employees
    select * from hr.employees where id=1
    SQL> 
    
    ----根据审计结果可知:----
    第一个和 第二 个语句满足字段和条件要求,所以进行审计;而第三个语句虽然满足了
    department_id=6,但是不满足要求的字段,所以不进行审计。

    5. 禁止fga审计

    begin 
    dbms_fga.disable_policy (
    object_schema => 'hr',
    object_name => 'employees',
    policy_name => 'mypolicy');
    end; 
    /
    
    禁用后,在执行 第三步 的sql 是不会再进行审计的

    6. 启动fga审计

    begin 
    dbms_fga.enable_policy (
    object_schema => 'hr',
    object_name => 'employees',
    policy_name => 'mypolicy',
    enable => true);
    end; 
    /
    
    开启后,在执行第三步的 sql  就会进行审计的

    7. 删除fga审计

    begin 
    dbms_fga.drop_policy (
    object_schema => 'hr',
    object_name => 'employees',
    policy_name => 'mypolicy');
    end; 
    /

    十、审计日常功能与操作命令(总结)

    1.语句审计:跟踪会话的连接和注销

    audit session by itpux; -- 审计指定用户的连接或断开连接操作
    noaudit session by itpux; --取消审计前面加 no
    
    audit session; --审计用户连接或断开连接操作
    noaudit session; --取消审计前面加 no

    2.查看审计action对应的编码:

    select name from audit_actions where action=100;
    select name from audit_actions where action=101;
    
    例子查询结果
    SQL> select name from audit_actions where action=1;
    
    NAME
    ----------------------------
    CREATE TABLE

    3.语句审计(审计create table,drop table,truncate table):

    audit table by itpux; --成功与否都生成审计线索
    audit table by itpux whenever successful; --只有成功生成审计线索
    audit table by itpux whenever not successful; --只有失败生成审计线索
    noaudit table by itpux;
    
    audit table; --审计所有表
    audit table whenever successful;
    audit table whenever not successful;
    noaudit table;

    4.语句审计(审计dml语句):

    audit insert table by itpux; --审计表插入
    audit insert table by itpux whenever successful;
    audit insert table by itpux whenever not successful;
    audit insert table by itpux by access;
    audit insert table by itpux by access whenever successful;
    audit insert table by itpux by access whenever not successful;
    noaudit insert table by itpux;
    (by access每次都生成一条审计记录, 
    by session相同操作只生成一条审计记录)

    5. 查看用户被启用的语句审计的选项:

    col audit_option for a20
    select audit_option,failure,success,user_name from dba_stmt_audit_opts;

    6. 特权审计(使用了特定的系统权限才会触发审计线索):

    audit create any table; --创建任何表进行审计
    audit create any table by itpux; --创建表itpux 进行审计
    audit drop any table by itpux;
    audit select any table by itpux by session;

    7. 查看用户被启用的特权审计的选项:

    select privilege,user_name from dba_priv_audit_opts order by user_name;

    8. 对象审计(跟踪指定对象权限的操作):

    audit delete on scott.e;  跟踪表scott 的delter 权限
    audit delete on scott.e by session;
    audit delete on scott.e by session whenever successful;
    audit delete on scott.e by session whenever not successful;
    audit select on scott.emp by access;
    audit delete on scott.e by access whenever successful;
    audit delete on scott.e by access whenever not successful;
    noaudit delete on scott.e;

    9.查看用户被启用的对象审计的选项:

    col owner for a10
    col object_name for a15
    col object_type for a15
    select * from dba_obj_audit_opts where owner='scott';
    successful /not successful
    s --> session
    a --> access

    10.取消所有statement审计

    noaudit all;

    11. 取消所有权限审计

    noaudit all privileges;

    12. 取消所有对象审计

    noaudit all on default;

    13.将审计线索保存到数据库:

    alter system set audit_trail=db scope=spfile;
    
    aud$
    
    col obj$creator for a10
    col userid for a10
    col userhost for a22
    col obj$name for a10
    col ntimestamp# for a28
    col comment$text for a30

     

  • 相关阅读:
    黑马程序员_字符串常用处理方法
    动软代码生成器,主子表增加的时候子表的parentID无法插入问题解决方案
    大数据量高并发的数据库优化详解
    C# Socket网络编程精华篇 (转)
    html+javascript+soap获取webservice免费天气预报信息
    js中字符串怎么转化为日期
    attachEvent方法的作用
    C#中[WebMethod]的用法,aspx、ashx、asmx
    C#操作XML方法详解
    C#操作XML的通用方法总结
  • 原文地址:https://www.cnblogs.com/zy-303/p/12924090.html
Copyright © 2011-2022 走看看