Oracle DBA課程系列筆記 第十九章: 審計 (Audit)

原文 http://tiany.blog.51cto.com/513694/791819

第十九章: 審計 (Audit)

   1、審計的功能:監控用戶在database 的 action (操作)
  
   2、審計分類:
        1) session :在同一個session,相同的語句只產生一個審計結果(默認)
        2) access : 在同一個session,每一個語句產生一個審計結果
       
   3、啓用審計(默認不啓用)
   09:54:18 SQL> show parameter audit                                                                                                      

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
audit_file_dest                      string      /u01/app/oracle/admin/prod/adu
                                                 mp
audit_sys_operations                 boolean     FALSE
audit_syslog_level                   string
audit_trail                          string      NONE (不啓用)

09:54:56 SQL> alter system set audit_trail=db  scope=spfile;                                                                            

System altered.

09:55:02 SQL> startup force;                                                                                                            
ORACLE instance started.

Total System Global Area  167772160 bytes
Fixed Size                  1218316 bytes
Variable Size              83888372 bytes
Database Buffers           79691776 bytes
Redo Buffers                2973696 bytes
Database mounted.
Database opened.
09:55:23 SQL> show parameter audit                                                                                                      

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
audit_file_dest                      string      /u01/app/oracle/admin/prod/adump                                             
audit_sys_operations                 boolean     FALSE
audit_syslog_level                   string
audit_trail                          string      DB
09:55:29 SQL>

-------audit_trail 
         1)none  不啓用audit
         2)db 將審計結果放在數據字典裏(database),只有dba 可以訪問
         3)os 將審計結果存放到操作系統的文件裏(由audit_file_dest指定的位置)
        
----啓用audit ,默認不審計sys用戶的action

         audit_sys_operations=true ,啓用對於sys 用戶的審計
        
  4、審計的對象:(默認情況:session ,對成功和不成功的同時審計)
         1)語句審計
         10:02:39 SQL> audit table;                                                                                                              

Audit succeeded.

10:02:43 SQL> audit table by tom ;                                                                                                      

Audit succeeded.

10:02:52 SQL> audit table by tom  whenever successful;                                                                                  

Audit succeeded.

  ----------查看審計設置
  11:08:29 SQL>  select user_name,audit_option from dba_stmt_audit_opts;                                                                  

USER_NAME                      AUDIT_OPTION
------------------------------ ----------------------------------------
                               TABLE
                              
 11:08:54 SQL> conn scott/tiger                                                                                                          
Connected.

11:09:02 SQL> drop table dept1 purge;                                                                                                   
drop table dept1 purge
           *
ERROR at line 1:
ORA-02449: unique/primary keys in table referenced by foreign keys


11:09:12 SQL> drop table dept1 cascade purge;                                                                                           
drop table dept1 cascade purge
                         *
ERROR at line 1:
ORA-00905: missing keyword


11:09:28 SQL> drop table dept1 cascade;                                                                                                 
drop table dept1 cascade
                       *
ERROR at line 1:
ORA-00905: missing keyword


11:09:31 SQL> drop table dept1 cascade constraint purge;                                                                                

Table dropped.

11:09:38 SQL> drop table emp1 purge;                                                                                                    

Table dropped.

11:09:46 SQL> create table emp1 as select * from emp;                                                                                   

Table created.

11:11:50 SQL> conn tom/tom                                                                                                              
Connected.
11:12:52 SQL> create table t01 (id int);                                                                                                

Table created.

11:13:07 SQL> drop table t01 purge;                                                                                                     

Table dropped.


11:13:11 SQL> conn /as sysdba                                                                                                           
Connected.

11:13:29 SQL> alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';                                                                

Session altered.

11:14:31 SQL> col username for a10                                                                                                      
11:14:35 SQL> col obj_name for a10                                                                                                      
11:14:42 SQL>                                                                                                                         
  1* select USERNAME,TIMESTAMP,OBJ_NAME,ACTION_NAME from dba_audit_trail

USERNAME   TIMESTAMP           OBJ_NAME   ACTION_NAME
---------- ------------------- ---------- ----------------------------
SCOTT      2011-08-11 11:09:12 DEPT1      DROP TABLE
SCOTT      2011-08-11 11:09:26 DEPT1      DROP TABLE
SCOTT      2011-08-11 11:09:31 DEPT1      DROP TABLE
SCOTT      2011-08-11 11:09:39 DEPT1      DROP TABLE
SCOTT      2011-08-11 11:09:47 EMP1       DROP TABLE
SCOTT      2011-08-11 11:09:59 EMP1       CREATE TABLE
TOM        2011-08-11 11:13:07 T01        CREATE TAB    

---------審計結果存放到aud$的基表裏,通過dba_audit_trail 視圖查看
 11:14:42 SQL> select count(*) from aud$;                                                                                                

  COUNT(*)
----------
         8

----------刪除審計結果
11:17:24 SQL> delete from aud$;                                                                                                         

8 rows deleted.

--------關閉審計

11:17:35 SQL> noaudit table                                                                                                             
11:18:11   2  ;                                                                                                                         

Noaudit succeeded.       
        
        2)權限審計
11:18:12 SQL> audit create table;                                                                                                       

Audit succeeded.

11:19:42 SQL> conn scott/tiger                                                                                                          
Connected.
11:20:02 SQL> create table dept1 as select * from dept;                                                                                 

Table created.

11:20:10 SQL> drop table dept1 purge;                                                                                                   

Table dropped.

11:20:17 SQL> conn /as sysdba                                                                                                           
Connected.
11:20:20 SQL>
11:20:20 SQL> select USERNAME,TIMESTAMP,OBJ_NAME,ACTION_NAME from dba_audit_trail;                                                      

USERNAME   TIMESTAMP OBJ_NAME   ACTION_NAME
---------- --------- ---------- ----------------------------
SCOTT      11-AUG-11 DEPT1      CREATE TABLE

11:20:26 SQL>
        3)對象審計

11:21:13 SQL> audit all on scott.emp1;                                                                                                  

Audit succeeded.

11:21:25 SQL> conn scott/tiger                                                                                                          
Connected.
11:22:19 SQL>
11:22:19 SQL> select * from emp1;                                                                                                       

     EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
      7369 SMITH      CLERK           7902 17-DEC-80        800                    20
      7499 ALLEN      SALESMAN        7698 20-FEB-81       1600        300         30
      7521 WARD       SALESMAN        7698 22-FEB-81       1250        500         30
      7566 JONES      MANAGER         7839 02-APR-81       2975                    20
      7654 MARTIN     SALESMAN        7698 28-SEP-81       1250       1400         30
      7698 BLAKE      MANAGER         7839 01-MAY-81       2850                    30
      7782 CLARK      MANAGER         7839 09-JUN-81       2450                    10
      7788 SCOTT      ANALYST         7566 19-APR-87       3000        100         40
      7839 KING       PRESIDENT            17-NOV-81       5000                    10
      7844 TURNER     SALESMAN        7698 08-SEP-81       1500          0         30
      7876 ADAMS      CLERK           7788 23-MAY-87       1100                    20
      7900 JAMES      CLERK           7698 03-DEC-81        950                    30
      7902 FORD       ANALYST         7566 03-DEC-81       3000                    20
      7934 MILLER     CLERK           7782 23-JAN-82       1300                    10

14 rows selected.

11:22:25 SQL> update emp1 set sal=9000 where empno=7788;                                                                                

1 row updated.

11:22:40 SQL> delete from emp1 where rownum<2;                                                                                          

1 row deleted.

11:22:49 SQL> commit;                                                                                                                   

Commit complete.


11:22:52 SQL> conn /as sysdba                                                                                                           
Connected.
11:22:55 SQL>

11:22:55 SQL> select username,ses_actions,obj_name,to_char(timestamp,'yyyy-mm-dd HH24:MI:SS')                                           
11:23:35   2     FROM dba_audit_trail;                                                                                                  

USERNAME   SES_ACTIONS         OBJ_NAME   TO_CHAR(TIMESTAMP,'
---------- ------------------- ---------- -------------------
SCOTT      ---S-----SS-----    EMP1       2011-08-11 11:22:25

其中S表示successful ,表示在這個位置操作是成功的,F表示failure 失敗,B表示both,兩者都有。


5、精細審計Fine Grained Auditing (FGA)

-----建立審計策略
11:30:44 SQL> exec dbms_fga.add_policy(object_schema=>'scott',-                                                                         
11:30:51 >   object_name=>'emp',policy_name=>'chk_emp',-                                                                                
11:31:05 >  audit_condition =>'deptno=20',audit_column =>'sal',-                                                                        
11:31:18 > statement_types =>'update,select');                                                                                          

PL/SQL procedure successfully completed.

11:31:28 SQL> conn scott/tiger                                                                                                          
Connected.
11:31:35 SQL>
11:31:35 SQL> select * from emp;                                                                                                        

     EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
      7369 SMITH      CLERK           7902 17-DEC-80        800                    20
      7499 ALLEN      SALESMAN        7698 20-FEB-81       1600        300         30
      7521 WARD       SALESMAN        7698 22-FEB-81       1250        500         30
      7566 JONES      MANAGER         7839 02-APR-81       2975                    20
      7654 MARTIN     SALESMAN        7698 28-SEP-81       1250       1400         30
      7698 BLAKE      MANAGER         7839 01-MAY-81       2850                    30
      7782 CLARK      MANAGER         7839 09-JUN-81       2450                    10
      7788 SCOTT      ANALYST         7566 19-APR-87       3000        100         40
      7839 KING       PRESIDENT            17-NOV-81       5000                    10
      7844 TURNER     SALESMAN        7698 08-SEP-81       1500          0         30
      7876 ADAMS      CLERK           7788 23-MAY-87       1100                    20
      7900 JAMES      CLERK           7698 03-DEC-81        950                    30
      7902 FORD       ANALYST         7566 03-DEC-81       3000                    20
      7934 MILLER     CLERK           7782 23-JAN-82       1300                    10

14 rows selected.

11:31:41 SQL> select * from emp where deptno=20;                                                                                        

     EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
      7369 SMITH      CLERK           7902 17-DEC-80        800                    20
      7566 JONES      MANAGER         7839 02-APR-81       2975                    20
      7876 ADAMS      CLERK           7788 23-MAY-87       1100                    20
      7902 FORD       ANALYST         7566 03-DEC-81       3000                    20

11:31:48 SQL> update emp set deptno=10 where empno=7788;                                                                                

1 row updated.

11:32:05 SQL> update emp set sal=8000 where empno=7788;                                                                                 

1 row updated.

11:32:12 SQL> update emp set sal=8000 where deptno=20;                                                                                  

4 rows updated.

11:32:21 SQL> commit;                                                                                                                   

Commit complete.

---------驗證審計結果

11:32:24 SQL> conn /as sysdba                                                                                                           
Connected.
11:32:27 SQL>
11:33:52 SQL> select db_user,to_char(timestamp,'yyyy-mm-dd hh24:mi:ss') "time" ,sql_text from dba_fga_audit_trail;                      

DB_USER    time                SQL_TEXT
---------- ------------------- --------------------------------------------------
SCOTT      2011-08-11 11:31:42 select * from emp
SCOTT      2011-08-11 11:31:49 select * from emp where deptno=20
SCOTT      2011-08-11 11:32:12 update emp set sal=8000 where empno=7788
SCOTT      2011-08-11 11:32:21 update emp set sal=8000 where deptno=20
------精細審計結果存放到fga_log$的基表裏,通過dba_fga_audit_trail 查看。

11:34:36 SQL> select count(*) from fga_log$;                                                                                            

  COUNT(*)
----------
         4

11:36:20 SQL> delete from fga_log$;                                                                                                     

4 rows deleted.

11:36:26 SQL>  select db_user,to_char(timestamp,'yyyy-mm-dd hh24:mi:ss') "time" ,sql_text from dba_fga_audit_trail;                     

no rows selected

11:36:30 SQL>

禁止精細審計
04:08:08 SQL> exec dbms_fga.disable_policy(-
04:08:21 > object_schema=>'scott',object_name=>'emp',-
04:08:49 > policy_name=>'chk_emp');

PL/SQL procedure successfully completed.

激活精細審計
04:10:33 SQL> exec dbms_fga.enable_policy(-
04:10:40 > object_schema=>'scott',object_name=>'emp',-
04:10:51 >  policy_name=>'chk_emp');

PL/SQL procedure successfully completed.

刪除FGA策略
04:11:52 SQL> exec dbms_fga.drop_policy(-
04:11:54 > object_schema=>'scott',object_name=>'emp',-
04:11:59 >  policy_name=>'chk_emp');

PL/SQL procedure successfully completed.

刪除精細審計的結果
04:12:43 SQL> delete from sys.fga_log$;

7、應用審計(通過觸發器來實現)
用於記載DML操作所引起的數據變化


1)建立審計表

11:37:32 SQL> conn scott/tiger                                                                                                          
Connected.
create table audit_emp_change (
04:20:47   2  name varchar2(10),oldsal number(6,2),
04:21:12   3  newsal number(6,2) ,time date);

Table created.

2)建立DML 觸發器
04:26:47 SQL> l
  1  create or replace trigger tr_sal_change
  2   after update of sal on scott.emp
  3   for each row
  4   declare
  5     v_temp int;
  6  begin
  7     select count(*)  into v_temp from audit_emp_change
  8           where name=:old.ename;
  9  if v_temp=0 then
 10    insert into audit_emp_change
 11       values(:old.ename,:old.sal,:new.sal,sysdate);
 12  else
 13    update audit_emp_change
 14      set oldsal=:old.sal ,newsal=:new.sal ,time=sysdate
 15           where name=:old.ename;
 16    end if;
 17* end;
        /

3)執行DML操作
04:28:02 SQL> update scott.emp set sal=6000 where empno=7788;

1 row updated.

4)查看審計結果
04:28:35 SQL> select name,oldsal,newsal,
04:28:46   2   to_char(time,'YYYY-MM-DD HH24:MI') FROM AUDIT_EMP_CHANGE;

NAME           OLDSAL     NEWSAL TO_CHAR(TIME,'YY
---------- ---------- ---------- ----------------
SCOTT            2000       6000 2011-03-03 04:28

 

本文出自 “天涯客的blog” 博客,請務必保留此出處http://tiany.blog.51cto.com/513694/791819

 

發佈了11 篇原創文章 · 獲贊 3 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章