17 Ocak 2014 Cuma

Kullanıcı Takibi ve Hatalı Girişlerin Belirlenmesi

Veritabanına bağlanan kullanıcıları takip edebilmenin birden fazla yolu bulunmaktadır. Bunların arasında audit ve logon trigger gibi yöntemler bulunmaktadır.
Sisteme bağlanan her kullanıcının takip edilebilmesi için aşağıdaki gibi bir trigger yaratılabilir;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
CREATE OR REPLACE TRIGGER OPTPROD_LOGON_TRIGGER
  after logon on database
 
declare
hostadi varchar2(100);
ipadresi varchar2(100);
schema_adi varchar2(100);
db_adi varchar2(100);
terminaladi varchar2(100);
zaman date;
os_user varchar2(100);
 
begin
 
select sys_context('USERENV','HOST') into hostadi from dual;
select sys_context('USERENV','IP_ADDRESS') into ipadresi from dual;
select sys_context('USERENV','SESSION_USER') into schema_adi from dual;
select sys_context('USERENV','DB_NAME') into db_adi from dual;
select sys_context('USERENV','TERMINAL') into terminaladi from dual;
select sysdate into zaman from dual;
SELECT sys_context('USERENV', 'OS_USER') into os_user FROM dual;
 
insert into OPTPROD_LOGON
values(user, hostadi, ipadresi, schema_adi, db_adi, terminaladi, zaman, os_user);
 
END IF;
 
end;
/
Bu basit trigger ile veritabanına yapılan her girişten sonra OPTPROD_LOGON tablosu içerisine kullanıcı bilgileri girilecektir.
Peki veritabanına yapılabilecek olası bir kullanıcı giriş zorlamasını nasıl algılarsınız? Öncelikle buna bir önlem olarak Oracle profillerini kullanarak, belirlenen bir profil grubu için maksimum şifre deneyebilme özelliğini, resource_limit parametresini TRUE yapmadan ayarlayabilir ve zorlama yapan kişi örneğin 3 defa yanlış girdikten sonra ilgili hesabı kilitleyebilirsiniz. Böyle bir güvenliğin yanı sıra neler olduğunu takip etmek isterseniz, audit özelliğini rahatlıkla kullanabilirsiniz. Öncelikli olarak AUDIT_TRAIL parametresini DB veya DB_EXTENDED olarak değiştirmeniz, bunu SPFILE’a yazmanız ve veritabanını yeniden başlatmanız gerekmektedir.
1
2
3
SQL> alter system set audit_trail='DB_EXTENDED' scope=spfile;
SQL> startup force;
SQL> show parameter audit_trail;
Şimdi ise yukarıda bahsettiğim bilgiye sahip olmak için yapılacak aksiyonu gösteriyorum;
1
2
SQL> audit create session by access;
Audit succeeded.
Bu değişikliğin nerede bulunduğunu takip etmek isterseniz SYS kullanıcısının sahip olduğu bir görüntü var ve adı DBA_PRIV_AUDIT_OPTS.
1
2
3
4
5
6
SQL> select privilege, success, failure
        from sys.dba_priv_audit_opts;
 
PRIVILEGE                  SUCCESS           FAILURE
-----------------------------------------------------------
CREATE SESSION     BY ACCESS      BY ACCESS
Veritabanına yapılan girişleri kontrol edeceğiniz görüntü ise DBA_AUDIT_SESSION.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
SQL> select "OS_USERNAME","USERNAME","USERHOST","TERMINAL","TIMESTAMP","ACTION_NAME","LOGOFF_TIME","LOGOFF_LREAD","LOGOFF_PREAD","LOGOFF_LWRITE","LOGOFF_DLOCK","SESSIONID","RETURNCODE",
 
CASE
WHEN TO_CHAR(RETURNCODE) = '1017' THEN 'ORA-01017: geçersiz kullanıcı adı/parolası; oturum açma reddedildi'
WHEN TO_CHAR(RETURNCODE) = '28000' THEN 'ORA-28000: hesap kilitli'
WHEN TO_CHAR(RETURNCODE) = '28009' THEN 'ORA-28009: SYS şeklindeki bağlantı SYSDBA veya SYSOPER olarak yapılmalıdır'
WHEN TO_CHAR(RETURNCODE) = '604' THEN 'ORA-00604: özyinelemeli SQL düzeyinde hata oluştu'
 
ELSE TO_CHAR(RETURNCODE) END "RETURNMESSAGE",
 
"CLIENT_ID","SESSION_CPU","EXTENDED_TIMESTAMP","PROXY_SESSIONID","GLOBAL_UID","INSTANCE_NUMBER","OS_PROCESS"
 
from dba_audit_session
where returncode > 0;
RETURNCODE bize bağlantının nasıl sonlandığını göstermektedir. Benim gösterdiğim örnekte genelde gelen returncode’lar bulunmaktadır ama duruma göre sayısı tabii ki artabilir. DBA_AUDIT_SESSION bir SYS objesidir ve SYSTEM tablespace’i üzerinde bulundurulmaktadır. Konfigürasyonu bu şekilde bırakacaksanız tablespace’in durumunu kontrol altında tutmalısınız ve bu tablespace’in dolmasını önlemelisiniz. Bu genelde karşılaşılan audit problemleri arasında yer almaktadır, onun için audit açtıktan sonra mutlaka ilerleyişini ve boyutlandırmasını inceleyiniz.
DBA_AUDIT_SESSION’ın script’i;
1
2
3
4
5
6
select os_username,  username, userhost, terminal, timestamp, action_name,
         logoff_time, logoff_lread, logoff_pread, logoff_lwrite, logoff_dlock,
         sessionid, returncode, client_id, session_cpu, extended_timestamp,
         proxy_sessionid, global_uid, instance_number, os_process
from dba_audit_trail
where action between 100 and 102;
DBA_AUDIT_TRAIL’in script’i;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
select spare1           /* OS_USERNAME */,
userid           /* USERNAME */,
userhost         /* USERHOST */,
terminal         /* TERMINAL */,
cast (           /* TIMESTAMP */
(from_tz(ntimestamp#,'00:00') at local) as date),
obj$creator      /* OWNER */,
obj$name         /* OBJECT_NAME */,
aud.action#      /* ACTION */,
act.name         /* ACTION_NAME */,
new$owner        /* NEW_OWNER */,
new$name         /* NEW_NAME */,
decode(aud.action#,
108 /* grant  sys_priv */, null,
109 /* revoke sys_priv */, null,
114 /* grant  role */, null,
115 /* revoke role */, null,
auth$privileges)
 
/* OBJ_PRIVILEGE */,
 
decode(aud.action#,
108 /* grant  sys_priv */, spm.name,
109 /* revoke sys_priv */, spm.name,
null)
 
/* SYS_PRIVILEGE */,
 
decode(aud.action#,
108 /* grant  sys_priv */, substr(auth$privileges,1,1),
109 /* revoke sys_priv */, substr(auth$privileges,1,1),
114 /* grant  role */, substr(auth$privileges,1,1),
115 /* revoke role */, substr(auth$privileges,1,1),
null)
 
/* ADMIN_OPTION */,
 
auth$grantee     /* GRANTEE */,
 
decode(aud.action#,
 
104 /* audit   */, aom.name,
 
105 /* noaudit */, aom.name,
 
null)
 
/* AUDIT_OPTION  */,
 
ses$actions      /* SES_ACTIONS   */,
logoff$time      /* LOGOFF_TIME   */,
logoff$lread     /* LOGOFF_LREAD  */,
logoff$pread     /* LOGOFF_PREAD  */,
logoff$lwrite    /* LOGOFF_LWRITE */,
decode(aud.action#,
104 /* audit   */, null,
105 /* noaudit */, null,
108 /* grant  sys_priv */, null,
109 /* revoke sys_priv */, null,
114 /* grant  role */, null,
115 /* revoke role */, null,
aud.logoff$dead)
 
/* LOGOFF_DLOCK */,
comment$text      /* COMMENT_TEXT */,
sessionid         /* SESSIONID */,
entryid           /* ENTRYID */,
statement         /* STATEMENTID */,
returncode        /* RETURNCODE */,
spx.name          /* PRIVILEGE */,
clientid          /* CLIENT_ID */,
auditid           /* ECONTEXT_ID */,
sessioncpu        /* SESSION_CPU */,
from_tz(ntimestamp#,'00:00') at local,
 
/* EXTENDED_TIMESTAMP */
 
proxy$sid                      /* PROXY_SESSIONID */,
user$guid                           /* GLOBAL_UID */,
instance#                      /* INSTANCE_NUMBER */,
process#                            /* OS_PROCESS */,
xid                              /* TRANSACTIONID */,
scn                                        /* SCN */,
to_nchar(substr(sqlbind,1,2000))      /* SQL_BIND */,
to_nchar(substr(sqltext,1,2000))      /* SQL_TEXT */
from sys.aud$ aud, system_privilege_map spm, system_privilege_map spx,
STMT_AUDIT_OPTION_MAP aom, audit_actions act
where   aud.action#     = act.action    (+)
and - aud.logoff$dead = spm.privilege (+)
and   aud.logoff$dead = aom.option#   (+)
and - aud.priv$used   = spx.privilege (+)
 
/
Yukarıda da gördüğünüz gibi DBA_AUDIT_SESSION görüntüsünün bilgileri aldığı yer aslında aud$ tablosu. Bu tablo da SYS’nin objesidir ve SYSTEM tablespace’i içerisinde bulunur.
Ogan Özdoğan tarafından yayınlandı