Daha önce yine bu konuyla bağlantı olduğunu düşündüğüm 2 tane yazı yazmıştım.
http://www.kamilturkyilmaz.com/2011/01/21/bilinen-adiyla-logon-trigger/
http://www.kamilturkyilmaz.com/2011/01/22/sisteme-connect-olan-%E2%80%93-olmayan-kullanicilari-tespit-etme/
Bugün sisteme girmeyi deneyip, bir şekilde giremeyen hata alan sessionları nasıl tespit edebiliriz ondan bahsetmek istiyorum. Öncelikle hata alan sessionlar ile ilgili 2 farklı durum karşımıza çıkabilir. Birincisi sisteme girmeyi deneyen user ora-01017 (invalid username/password) hatası alabilir, ikinci olarak ora-01031 (insufficient privilige) hatası alabilir. Bu tarz durumlarda hangi userın bu hatayı aldığını tespit etmek içinde aşağıdaki trigger’ ı kullanabilirsiniz ;
Öncelikle tespit edilen userlara ait bilginin insert edileceği tablomuzu oluştururalım ;
SQL> CREATE table failed_logon_audit(
sid NUMBER,
spid NUMBER,
audsid NUMBER,
username VARCHAR2(30),
program VARCHAR2(48),
osuser varchar2(30),
machine VARCHAR2(64),
terminal VARCHAR2(30),
logon_time DATE,
module VARCHAR2(48),
action VARCHAR2(32),
client_info VARCHAR2(64),
service_name VARCHAR2(64),
authenticated_identity VARCHAR2(30),
returncode number)
Table created.
Trigger’ ımızı oluşturalım ;
SQL> CREATE OR REPLACE TRIGGER failed_audit_trigger
AFTER SERVERERROR ON DATABASE
DECLARE
v_sid v$session.sid%TYPE;
v_program v$session.program%TYPE;
v_spid v$process.spid%TYPE;
v_audsid v$session.audsid%TYPE;
v_username v$session.username%TYPE;
v_osuser v$session.osuser%TYPE;
v_machine v$session.machine%TYPE;
v_terminal v$session.terminal%TYPE;
v_logon_time v$session.logon_time%TYPE;
v_module v$session.module%TYPE;
v_action v$session.action%TYPE;
v_client_info v$session.client_info%TYPE;
v_service_name v$session.service_name%TYPE;
v_authenticated_identity VARCHAR2(30);
v_returncode NUMBER;
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
v_returncode:=ora_server_error(1);
IF v_returncode=1017 THEN
SELECT s.sid,p.spid,s.audsid,s.username,s.program,s.osuser,s.machine,s.terminal,s.logon_time,
s.module,s.action,s.client_info,s.service_name
INTO v_sid,v_spid,v_audsid,v_username,v_program,v_osuser,v_machine,v_terminal,v_logon_time,
v_module,v_action,v_client_info,v_service_name
FROM v$session s, v$process p WHERE sid=(SELECT DISTINCT sid FROM v$mystat)
AND s.paddr=p.addr;
v_authenticated_identity:=sys_context(‘userenv’,’authenticated_identity’);
INSERT INTO failed_logon_audit VALUES(v_sid,v_spid,v_audsid,v_username,v_program,v_osuser,v_machine,v_terminal,v_logon_time,
v_module,v_action,v_client_info,v_service_name,v_authenticated_identity,v_returncode);
COMMIT;
END IF;
END;
Trigger created.
Şimdi test edelim, KAMIL userı ile yanlış bir şifre deneyerek girmeyi deniyorum ;
SQL>connect kamil/hatali_password;
ERROR:
ORA-01017: invalid username/password; logon denied
Warning: You are no longer connected to ORACLE.
SQL>
Tablomuzu kontrol ediyorum. Yapılan bu hatalı giriş denemesinin tabloda olmasını bekliyorum.
(Sonucun anlaşılabilir olması için tablodaki alanlardan sadece 3 tanesini select ediyorum)
SQL> select sid, service_name, authenticated_identity from failed_logon_audit;
SID SERVICE_NAME AUTHENTICATED_IDENTITY
—- ———— ————–
10 perfdb KAMIL
1 rows selected.
Hatalı olan giriş denemesini yakalamış olduk. Kurumsal firmaların güvenlik birimleri zaman zaman dba’ lerden bu tarz durumların tespit edilmesini ve önlem alınmasını talep edebiliyorlar. Bu gibi durumlarda bu trigger’ı rahatlıkla kullanabilirsiniz.
Aslında database’ deki auditing opsiyonunuz DB,EXTENTED olacak şekilde set edili ve database auting yapıyorsanız, sysç.aud$ tablosunda da returncode alanı 1017 olanları select ederek de benzer bir sonuca gidebilirsiniz.