【實操篇】_Oracle中如何記錄訪問數據庫的登陸信息

【引言】

來了一需求,項目組想查看一段時間內都有哪些連接訪問oracle數據庫,並需要記錄相關信息在日誌文件中。有什麼方法可以搞下這個問題。今天唸叨下:

文章大綱:

  1. 有哪些審計的方法?
  2. 如何實現上述審計?
  3. 審計建議

有哪些審計的方法?
上述引言的問題,說的再通俗點就是:數據庫用戶的登錄記錄,如何查看?

一般有三種方法:

  1. 使用trigger定製化用系統觸發器來記錄用戶登錄

  2. 開啓庫audit審計功能用oracle庫本身的審記功能來記錄用戶的操作信息

  3. 使用logmnr進行挖取日誌分析從logminner的文件中抓取出用戶登錄信息

如何實現上述審計?

方法一 使用trigger定製化
具體操作如下:

1. 創建表空間

CREATE TABLESPACE logInfo DATAFILE
  '/oradata/group/logInfo_01.dbf' SIZE 1G AUTOEXTEND ON NEXT 50M MAXSIZE UNLIMITED
LOGGING
ONLINE
EXTENT MANAGEMENT LOCAL AUTOALLOCATE
BLOCKSIZE 8K
SEGMENT SPACE MANAGEMENT AUTO
FLASHBACK ON;
/ 

2. 創建用戶登錄表,並制定表空間爲logInfo

CREATE TABLE LOGINFO_LOG
(
   SESSION_ID                    NUMBER(8,0) NOT NULL,
   LOGIN_ON_TIME                 DATE,
   LOGIN_OFF_TIME                DATE,
   USER_IN_DB                    VARCHAR2(50),
   MACHINE                       VARCHAR2(50),
   IP_ADDRESS                    VARCHAR2(20),
   RUN_PROGRAM                   VARCHAR2(50)
)
PCTFREE 10
PCTUSED 40
MAXTRANS 255
TABLESPACE logInfo
STORAGE(INITIAL 64K MINEXTENTS 1 MAXEXTENTS 2147483645 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
NOCACHE
LOGGING
/

3. 創建用戶登錄觸發器

CREATE OR REPLACE TRIGGER sys.LOGIN_ON_INFO
AFTER LOGON
ON DATABASE
BEGIN
   INSERT into LOGINFO_LOG(session_id,login_on_time,login_off_time,user_in_db,machine,ip_address,run_program)

       SELECT AUDSID,sysdate,null,sys.login_user,machine,SYS_CONTEXT('USERENV','IP_ADDRESS'),program
       FROM v$session WHERE AUDSID=USERENV('SESSIONID');
END;
/

4. 創建登出信息觸發器

CREATE OR REPLACE TRIGGER SYS.LOGIN_OFF_INFO
BEFORE LOGOFF
ON DATABASE
Begin
   update sys.LOGINFO_LOG set login_off_time=sysdate where session_id=USERENV('SESSIONID');
   exception when others then
       null;
END;
/

5. 查看登陸信息:

Select * from loginfo_log order by 2 desc;

另,可在$ORACLE_HOME/network/admin/sqlnet.ora 中設置訪問限制:

–啓動檢查

tcp.validate_checking=yes

—允許訪問

tcp.invited_nodes=(IP1,IP2,….)

— 拒絕訪問

tcp.excluded_nodes=(IP1,IP2,……)

此外,因爲應用程序中的delete、drop、update操作也需要記錄,如下以drop審計進行舉例,說明使用觸發器如何進行用戶操作的留痕。

1. 創建drop操作的用戶留痕表

CREATE TABLE DROP_LOG

(

   SESSION_ID     INT NOT NULL,
   DROP_TIME      DATE,
   IP_ADDRESS     VARCHAR2 (20),
   OBJECT_OWNER   VARCHAR2 (30),
   OBJECT_NAME    VARCHAR2 (30),
   OBJECT_TYPE    VARCHAR2 (20),
   DROP_BY_USER   VARCHAR2 (30)
);

2. 創建刪除表操作的觸發器

CREATE OR REPLACE TRIGGER DROP_INFO
AFTER DROP ON username.schema 
BEGIN
INSERT INTO DROP_LOG
(SESSION_ID,
DROP_TIME,
IP_ADDRESS,
OBJECT_OWNER,
OBJECT_NAME,
OBJECT_TYPE,
DROP_BY_USER)
VALUES(userenv('sessionid'),
SYSDATE,
sys_context('userenv','ip_address'),
SYS.DICTIONARY_OBJ_OWNER,
SYS.DICTIONARY_OBJ_NAME,
SYS.DICTIONARY_OBJ_TYPE,
SYS.LOGIN_USER);?
end;
/

方法二 開啓庫audit審計記錄登錄功能
簡單介紹下Oracle的審計功能

審計(Audit)用於監視用戶所執行的數據庫操作,審計記錄可存在數據字典表(稱爲審計記錄:存儲在system表空間中的SYS.AUDdbaaudittrail(表中,可通過視圖dba_audit_trail查看)或操作系統審計記錄中(默認位置爲ORACLE_BASE/admin/$ORACLE_SID/adump/),默認情況下審計是不開啓。

和審計相關的兩個參數說明

參數1 :audit_sys_operations

默認爲false,當設置爲true時,所有sys用戶(包括以sysdba, sysoper身份登錄的用戶)的操作都會被記錄,audit trail不會寫在aud$表中,linux/unix平臺中則會記錄在audit_file_dest參數指定的文件中。

參數2:audit_trail:

None:是默認值,不做任何審計;

DB:審計的結果只有連接信息,記錄在數據庫的審計表aud$;

DB,Extended:這樣審計結果裏面除了連接信息還包含了當時執行的具體語句;

OS:將audit trail 記錄在操作系統文件中,文件名由參數audit_file_dest指定位置;

XML:10g裏新增的。

注意:

上述兩個參數是static參數,需重啓數據庫方可生效。

1. 檢查審計功能是否開啓

SQLPLUS> connect / AS SYSDBA

SQLPLUS> select * from sys.aud$; --沒有記錄返回

SQLPLUS> select * from dba_audit_trail; - 沒有記錄返回

如上述查詢發現表不存在,說明審計相關的表還沒有安裝,需要安裝。

安裝方式如下:

SQLPLUS> connect / as sysdba

SQLPLUS> @$ORACLE_HOME/rdbms/admin/cataudit.sql

注意:

審計表默認安裝在SYSTEM表空間。所以要確保SYSTEM表空間充足。

  1. 開啓審計功能

  2. 設置審計參數

SQL> alter system set audit_sys_operations=TRUE scope=spfile;

–如果要審計管理用戶(以sysdba/sysoper角色登陸),需要開此參數。

SQL> alter system set audit_trail=db scope=spfile;

  1. 重新啓動數據庫

  2. 以SYSTEM帳號登錄數據庫執行下列語句,設置CONNECT審計並檢查是否設置成功:

SQL> connect system/password

–審計登陸用戶

SQL> audit connect

如下是常用的幾個審計舉例

–審計所有對錶的操作

SQL> audit all on table;

–審計用戶test對錶的所有操作

sql> audit table by test;

–審計任何用戶刪除用戶test表的操作

SQL> AUDIT DELETE ANY test.TABLE;

–審計任何用戶刪除失敗的情況

SQL> AUDIT DELETE ANY TABLE WHENEVER NOT SUCCESSFUL;

–只審計刪除成功的情況

SQL> AUDIT DELETE ANY TABLE WHENEVER SUCCESSFUL;

–審計SYSTEM用戶對錶user.table的delete,update,insert操作

SQL> AUDIT DELETE,UPDATE,INSERT ON user.table by SYSTEM;

以SYSTEM帳號登錄數據庫執行下列語句,設置CONNECT審計並檢查是否設置成功:

SQL> col user_name format a20
SQL> col audit_option format a20
SQL> set linesize 999
SQL> select user_name, audit_option, success, failure from sys.dba_stmt_audit_opts;
USER_NAME AUDIT_OPTION SUCCESS FAILURE


        ALTER SYSTEM         BY ACCESS                      BY ACCESS
        SYSTEM AUDIT         BY ACCESS                      BY ACCESS
        CREATE SESSION       BY ACCESS                      BY ACCESS
        CREATE USER          BY ACCESS                      BY ACCESS
        ALTER USER           BY ACCESS                      BY ACCESS
        DROP USER            BY ACCESS                      BY ACCESS
        PUBLIC SYNONYM       BY ACCESS                      BY ACCESS
        DATABASE LINK        BY ACCESS                      BY ACCESS
        ROLE                 BY ACCESS                      BY ACCESS
        PROFILE              BY ACCESS                      BY ACCESS
        CREATE ANY TABLE     BY ACCESS                      BY ACCESS
  1. 查詢 AUD$表就可以查看到審計結果了

SQL> select sessionid, to_char(timestamp#,‘DD-MON-YY:HH24:MI:SS’)
login,userid, to_char(logoffKaTeX parse error: Undefined control sequence: \ at position 37: …MI:SS') logoff \̲ ̲from sys.aud where userid=‘USERNAME’;

  1. 關閉審計的方法,直接在審計語句前加no,如

SQL> noaudit connect

Sql> noaudit all on t_test;

最後注意:

將審計相關的表移動到其他表空間由於AUDSYSTEMSYSTEMAUD表等審計相關的表存放在SYSTEM表空間,因此爲了不影響系統性能,保護SYSTEM表空間不被佔用,最好把AUD移動到其他的表空間上,使用下面語句移動:

sql>connect / as sysdba;
sql>alter table aud$ move tablespace <new tablespace>;
sql>alter index I_aud1 rebuild online tablespace <new tablespace>;
SQL> alter table audit$ move tablespace <new tablespace>;
SQL> alter index i_audit rebuild online tablespace <new tablespace>;
SQL> alter table audit_actions move tablespace <new tablespace>;
SQL> alter index i_audit_actions rebuild online tablespace <new tablespace>;

方法三 使用logmnr進行挖取日誌分析
操作步驟如下:

  1. sys用戶登陸,安裝LogMiner工具

SQL>@$ORACLE_HOME\rdbms\admin\dbmslm.sql;

SQL>@ $ORACLE_HOME\rdbms\admin\dbmslmd.sql;

腳本1 用來創建DBMS_LOGMNR包,該包用來分析日誌文件。

腳本2用來創建DBMS_LOGMNR_D包,該包用來創建數據字典文件。

  1. 修改初始參數文件

UTL_FILE_DIR = ($ORACLE_HOME\logs)

重新啓動數據庫,使新加的參數生效。

  1. 創建數據字典文件:

SQL> connect /as sysdbaSQL> execute dbms_logmnr_d.build(dictionary_filename => ‘dict.ora’,dictionary_location => ‘/oracle/logs’);

  1. 創建分析列表,添加分析日誌:

SQL> execute dbms_logmnr.add_logfile(LogFileName => ‘/ORACLE/ORADATA/ORADBSP/REDO01.LOG’,Options => dbms_logmnr.new);

  1. 添加分析日誌(建議一次添加1個):

SQL> execute dbms_logmnr.add_logfile(LogFileName => ‘/ORACLE/ORADATA/ORADBSP/REDO02.LOG’,Options => dbms_logmnr.ADDFILE);

  1. logMiner日誌分析

無限制條件

SQL> execute dbms_logmnr.start_logmnr(DictFileName => ‘/oracle/logs’dict.ora’);

帶限制條件:

基於時間段的分析

SQL> execute dbms_logmnr.start_logmnr(startTime => to_date(‘20191112100000’,‘yyyy-mm-dd hh24:mi:ss’),endTime => to_date(‘20191112110000’,‘yyyy-mm-dd hh24:mi:ss’),DictFileName => ‘/oracle/logs’dict.ora’);

  1. 分析後釋放內存:

SQL> execute dbms_logmnr.end_logmnr;

  1. 刪除日誌分析文件:

SQL>exec dbms_logmnr.add_logfile(’/ORACLE/ORADATA/ORADBSP/REDO02.LOG’,dbms_logmnr.removefile);

  1. 查看LogMiner工具分析結果,

–所有與logmnr相關的視圖

SQL> select * from dict t where t.table_name like ‘%LOGMNR%’;

上述語句中,分析結果存在GV$LOGMNR_LOGS 分析日誌列表視圖,使用如下語句查詢:

SQL>create table logmnr_tmp as select * from GV$GV$LOGMNR_LOGS;

SQL>SELECT scn,
       timestamp,
       log_id,
       seg_owner,
       seg_type,
       table_space,
       data_blk#,
       data_obj#,
       data_objd#,
       session#,
       serial#,
       username,
       session_info,
       sql_redo,
       sql_undo
  FROM logmnr_tmp t
 WHERE t.sql_redo LIKE 'delete%';

關於LogMiner的更詳細的使用,請看本公衆號之前的一篇推文:

《Logminer:oracle人爲誤操作之恢復神器》

【結語】

1.本文講述三種查看用戶登錄信息的方法:觸發器、audit審計、LogMiner方式。

  1. 使用 Oracle Audit 函數來記錄用戶登錄信息,但開放了 Audit 函數將會使Oracle 性能下降,甚至導致 Oracle 崩潰;故推薦使用方法1觸發器的方式,不佔用系統資源,方便靈活。

【參考】

http://blog.itpub.net/26736162/viewspace-2140644/

【參考】

https://www.cnblogs.com/aocle/archive/2012/09/19/2694126.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章