Oracle审计用户登录信息
#数据库 #审计 #登录信息
一、引言
在数据库安全体系中,登录失败审计是抵御暴力破解、非法访问的关键防线。Oracle 数据库提供了多层审计机制,但在传统审计功能受限(如AUDIT_TRAIL=NONE)的特殊场景下,需通过定制化方案实现精准审计。本文结合 Oracle特性,提供一套覆盖环境检测、方案实施、故障处理的完整技术方案,满足等保 2.0 及企业安全合规要求。
二、审计参数基线检查
参数名称 | 生产环境推荐值 | 当前检测值 | 风险等级 | 修复建议 |
audit_trail | DB/XML | NONE | 高 | 启用传统审计或采用触发器方案 |
audit_sys_operations | TRUE | FALSE | 中 | 建议启用系统操作审计 |
unified_auditing | ENABLED | DISABLED | 中 | 参考官方文档启用统一审计 |
文本结合当前环境禁用传统审计,需通过数据库触发器实现登录失败审计核心功能。
三、触发器审计方案设计
捕捉登录失败的几种方法:Audit (SQL> audit session whenever not successful; )、database trigger、 event errorstack、 sqlnet trace ,如果audit 在数据库已禁,可以使用创建一个Trigger,把登录失败信息写入DB alert log.
3.1 查看审计参数
SQL> show parameter auditNAME TYPE VALUE
------------------------------------ ----------- ------------------------------
audit_file_dest string /opt/oracle/product/23ai/dbhomeFree/rdbms/audit
audit_sys_operations boolean FALSE
audit_syslog_level string
audit_trail string NONE
unified_audit_common_systemlog string
unified_audit_systemlog string
3.2 触发器实现逻辑
3.3 核心实现逻辑
1)错误码捕获:
通过ora_is_servererror(1017)精准识别无效凭证登录
2)元数据采集:
- 网络层:SYS_CONTEXT('userenv', 'ip_address')获取客户端 IP
- 进程层:关联V$PROCESS与V$SESSION获取操作系统 PID
- 应用层:通过DBMS_APPLICATION_INFO获取客户端模块 / 动作
3)日志格式化:采用KEY=VALUE结构化格式,便于后续日志解析
3.4 触发器脚本
CREATE OR REPLACE TRIGGER logon_denied_to_alertAFTER SERVERERRORON DATABASE
DECLAREMESSAGE VARCHAR2 (256);IP VARCHAR2 (15);v_os_user VARCHAR2 (80);v_module VARCHAR2 (50);v_action VARCHAR2 (50);v_pid VARCHAR2 (10);v_sid NUMBER;v_program VARCHAR2 (48);v_client_id VARCHAR2 (64);v_dbuser VARCHAR2 (100);v_client_host VARCHAR2 (80);
BEGINIF (ora_is_servererror (1017))THEN-- get IP for remote connections:IF SYS_CONTEXT ('userenv', 'network_protocol') = 'TCP'THENIP := SYS_CONTEXT ('userenv', 'ip_address');END IF;SELECT DISTINCT sid INTO v_sid FROM sys.v_$mystat;SELECT p.SPID, v.PROGRAMINTO v_pid, v_programFROM V$PROCESS p, V$SESSION vWHERE p.ADDR = v.PADDR AND v.sid = v_sid;v_os_user := SYS_CONTEXT ('userenv', 'os_user');DBMS_APPLICATION_INFO.READ_MODULE (v_module, v_action);v_client_host := SYS_CONTEXT ('USERENV', 'HOST');v_client_id := sys_context ('userenv', 'client_identifier');v_dbuser := sys_context ('USERENV', 'AUTHENTICATED_IDENTITY');MESSAGE :=TO_CHAR (SYSDATE, 'Dy Mon dd HH24:MI:SS YYYY')|| ' logon denied '|| 'IP ='|| NVL (IP, 'unknown')|| ' client_host='|| v_client_host|| ' pid = '|| v_pid|| ' os user = '|| v_os_user|| ' client id = '|| v_client_id|| ' with program= '|| v_program|| ' module ='|| v_module|| ' action='|| v_action|| ' dbuser='|| v_dbuser;sys.DBMS_SYSTEM.ksdwrt (2, MESSAGE);-- remove comments from next line to let it hang for 5 minutes-- to be able to do more diagnostics on the operating system:-- sys.dbms_lock.sleep(300);END IF;
END;
/
四、实施效果
测试普通用户登录到数据库
4.1 alert日志
FREEPDB1(3):Tue Nov 12 08:25:52 2025 logon denied IP =unknown client_host=oracle19c03 pid = 11217 os user = oracle client id = with program= sqlplus@oracle19c03 (TNS V1-V3) module =sqlplus@oracle19c03 (TNS V1-V3) action= dbuser=APPS
2024-11-12T08:26:47.063315-08:00
4.2 获取主机IP
SQL> select utl_inaddr.get_host_address('oracle19c03') from dual;UTL_INADDR.GET_HOST_ADDRESS('ORACLE19C03')
--------------------------------------------------------------------------------
192.168.2.116
五、总结
通过多层审计方案的组合实施,可有效记录 Oracle 用户登录失败事件,为数据库安全审计与非法访问溯源提供完整技术支撑。
🚀 更多数据库干货,欢迎关注【安呀智数据坊】
如果你觉得这篇文章对你有帮助,欢迎点赞 👍、收藏 ⭐ 和留言 💬 交流,让我知道你还想了解哪些数据库知识!
📬 想系统学习更多数据库实战案例与技术指南?
📊 实战项目分享
📚 技术原理讲解
🧠 数据库架构思维
🛠 工具推荐与实用技巧
立即关注,持续更新中 👇