如何实现系统级审计(用户登录/登出、数据库启停)及在Oracle中通过SQL/SQLPlus开启审计并获取对应SQL语句
系统级审计开展指南(含Oracle数据库实操)
刚好之前在项目里配置过类似的Oracle审计需求,给你梳理一下完整的操作步骤,分通用系统级审计思路和Oracle数据库具体实操两部分:
一、通用系统级审计的整体思路
要监控用户登录登出、数据库启停行为,需要从操作系统层和数据库层双维度入手:
- 操作系统层面:
- 用户登录登出:Linux可以监控
/var/log/secure日志,Windows则通过事件查看器的「安全日志」捕获; - 数据库启停:可以跟踪数据库服务的系统日志(比如Windows服务日志),或者Oracle自带的
alert.log文件(通常在$ORACLE_BASE/diag/rdbms/<dbname>/<instname>/trace目录下)。
- 用户登录登出:Linux可以监控
- 数据库层面:
利用Oracle内置的审计功能,精准捕获数据库层面的登录/登录尝试、启停事件,这部分是可控性更强、信息更精准的核心环节,下面详细讲具体配置。
二、Oracle数据库审计配置实操(SQL/SQLPlus)
2.1 先确认审计功能已启用
首先用SQLPlus登录SYS用户(需要SYSDBA权限),检查当前审计状态:
SHOW PARAMETER AUDIT_TRAIL;
如果返回的VALUE是NONE,说明审计未开启,需要修改参数并重启数据库:
-- 开启审计,将记录存储在数据库中,并保留扩展信息 ALTER SYSTEM SET AUDIT_TRAIL=DB,EXTENDED SCOPE=SPFILE; -- 重启数据库使参数生效 SHUTDOWN IMMEDIATE; STARTUP;
小提示:
DB表示审计记录存在SYS.AUD$表中,EXTENDED会额外记录绑定变量和SQL文本,方便后续排查问题;如果想把记录存在操作系统文件,可以用AUDIT_TRAIL=OS。
2.2 审计用户登录/登录尝试行为
要捕获所有用户的登录成功、失败以及登出行为,执行以下SQL命令:
-- 审计所有用户的成功登录/登出 AUDIT SESSION WHENEVER SUCCESSFUL; -- 审计所有用户的登录失败(比如密码错误、权限不足) AUDIT SESSION WHENEVER NOT SUCCESSFUL;
如果只需要审计特定用户(比如SCOTT),可以指定用户:
AUDIT SESSION BY SCOTT WHENEVER SUCCESSFUL; AUDIT SESSION BY SCOTT WHENEVER NOT SUCCESSFUL;
2.3 审计数据库启动与关闭行为
数据库启停属于系统级操作,只有SYSDBA权限用户能执行,要审计这些行为,执行:
-- 审计数据库启动操作 AUDIT STARTUP; -- 审计数据库关闭操作 AUDIT SHUTDOWN;
2.4 查询审计记录(用DBA_AUDIT_SESSION等视图)
配置完成后,就可以通过Oracle的审计视图查询结果:
查询登录/登出记录
DBA_AUDIT_SESSION是专门存储会话审计记录的视图,执行以下SQL:
SELECT username, os_username, terminal, timestamp AS login_time, logoff_time, returncode -- 0=成功,非0=失败(比如1017=密码错误) FROM dba_audit_session ORDER BY login_time DESC;
查询数据库启停记录
数据库启停属于系统级语句,用DBA_AUDIT_STATEMENT视图查询:
SELECT username, os_username, timestamp AS operation_time, action_name, -- 显示'STARTUP'或'SHUTDOWN' returncode FROM dba_audit_statement WHERE action_name IN ('STARTUP', 'SHUTDOWN') ORDER BY operation_time DESC;
2.5 审计维护注意事项
- 审计记录会占用数据库空间,定期清理旧记录(比如保留30天):
DELETE FROM sys.aud$ WHERE timestamp < SYSDATE - 30; COMMIT;
更规范的方式是用DBMS_AUDIT_MGMT包来管理审计记录的清理。
- 严格控制审计视图的访问权限,不要给普通用户授予
SELECT权限在DBA_AUDIT_SESSION、DBA_AUDIT_STATEMENT这类视图上,避免审计信息泄露。
内容的提问来源于stack exchange,提问作者Philmore Foster




