14 Şubat 2011 Pazartesi

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

Selamlar,

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;


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.

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;

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

SQL> select privilege, success, failure
2 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.

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;

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;

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.

Kolay gelsin.

Ogan

Hiç yorum yok:

Takip et: @oganozdogan