日常运维工作需要关注各个数据库是否有频繁的数据库用户登录失败行为,一方面频繁错误密码登录会导致已增加用户锁定策略的数据库用户被锁,影响业务进行,另一方面供分析排查是否为攻击或试探行为。通过编写如下触发器可将错误密码登库行为明细信息输出至alert日志中,结合自动化运维工具或人工巡检,可及时发现失败登录行为,第一时间关注处理。
CREATE OR REPLACE TRIGGER logon_denied_to_alert
AFTER servererror ON DATABASE
DECLARE
message VARCHAR2 ( 168 );
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 );
BEGIN
IF( ora_is_servererror ( 1017 )) THEN
-- get ip FOR remote connections :
IF upper(sys_context( 'userenv' , 'network_protocol' )) = 'TCP' THEN
ip :=sys_context( 'userenv' , 'ip_address' );
END IF;
SELECT sid INTO v_sid FROM sys . v_$mystat WHERE rownum < 2 ;
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 );
message := to_char(SYSDATE, 'YYYYMMDD HH24MISS' )|| 'logon denied from' ||nvl( ip , 'localhost' )|| ' ' || v_pid || ' ' || v_os_user || 'with' || v_program || '-' || v_module || ' ' || v_action ;
sys . dbms_system.ksdwrt ( 2 , message );
END IF;
END;
/
