【引言】
来了一需求,项目组想查看一段时间内都有哪些连接访问oracle数据库,并需要记录相关信息在日志文件中。有什么方法可以搞下这个问题。今天念叨下:
文章大纲:
- 有哪些审计的方法?
- 如何实现上述审计?
- 审计建议
有哪些审计的方法?
上述引言的问题,说的再通俗点就是:数据库用户的登录记录,如何查看?
一般有三种方法:
-
使用trigger定制化用系统触发器来记录用户登录
-
开启库audit审计功能用oracle库本身的审记功能来记录用户的操作信息
-
使用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.AUD 表 中 , 可 通 过