#数据库 #审计 #登录信息
一、引言
在数据库安全体系中,登录失败审计是抵御暴力破解、非法访问的关键防线。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 audit
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
audit_file_dest string /opt/oracle/product/23ai/dbhom
eFree/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_alert
AFTER SERVERERROR
ON DATABASE
DECLARE
MESSAGE 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);
BEGIN
IF (ora_is_servererror (1017))
THEN
-- get IP for remote connections:
IF SYS_CONTEXT ('userenv', 'network_protocol') = 'TCP'
THEN
IP := SYS_CONTEXT ('userenv', 'ip_address');
END IF;
SELECT DISTINCT sid INTO v_sid FROM sys.v_$mystat;
SELECT p.SPID, v.PROGRAM
INTO v_pid, v_program
FROM V$PROCESS p, V$SESSION v
WHERE 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 用户登录失败事件,为数据库安全审计与非法访问溯源提供完整技术支撑。
🚀 更多数据库干货,欢迎关注【安呀智数据坊】
如果你觉得这篇文章对你有帮助,欢迎点赞 👍、收藏 ⭐ 和留言 💬 交流,让我知道你还想了解哪些数据库知识!
📬 想系统学习更多数据库实战案例与技术指南?
📊 实战项目分享
📚 技术原理讲解
🧠 数据库架构思维
🛠 工具推荐与实用技巧
立即关注,持续更新中 👇