Oracle’da After LOGON Trigger

Herkese Selam,

Bu yazıda sizlerle Oracle’da şemaya erişim anlamında güvenliği bir kademe daha arttıracağınız bir yöntemi aktaracağım. Bu yöntem ile ilgili şema ya login olmak isteyen user’ları ip adresine göre, osuser name’lerine göre veya bildiğiniz ve check edebileceğiniz farklı özelliklerine göre connection kurmalarına izin verebilir yada izin vermeyebilirsiniz. Bu kontrolü oracle üzerinde After Logon tipinde bir trigger yazarak sağlayabiliyoruz. Bu trigger ilgili şemaya user bağlandığı anda devreye girip gerekli kontrolleri yapıp connection sağlamasına izin veriyor veya vermiyor.

Şimdi bir örnek üzerinden bu sürecin nasıl çalıştığını anlatalım.

Öncelikle yeni bir user yaratıyorum ve gerekli hakkı veriyorum;

CREATE      USER emrah IDENTIFIED BY emrah;
ALTER      USER emrah ACCOUNT UNLOCK;

ALTER      USER emrah DEFAULT TABLESPACE myTableSpace;

GRANT UNLIMITED TABLESPACE TO emrah;

GRANT CREATE TABLE TO emrah;

GRANT CREATE TRIGGER TO emrah;

şimdi yeni yarattığım user’a login oluyorum.

login

CREATE TABLE login_control
( ID NUMBER PRIMARY KEY,
osuser_name VARCHAR2(20),
ip_address VARCHAR2(30));

INSERT INTO login_control
(ID, osuser_name, ip_address
)
VALUES (1, ‘EmrahMete’, NULL
);

INSERT INTO login_control
(ID, osuser_name, ip_address
)
VALUES (2, NULL, ‘10.10.2.002’
);

INSERT INTO login_control
(ID, osuser_name, ip_address
)
VALUES (3, NULL, ‘10.10.2.003’
);

INSERT INTO login_control
(ID, osuser_name, ip_address
)
VALUES (4, NULL, ‘10.10.2.04’
);

INSERT INTO login_control
(ID, osuser_name, ip_address
)
VALUES (5, ‘albertSenior’, NULL
);

Evet olusturduğum tabloya os user name veya ip numarası tanımladım. Şimdi emrah şemasına connect olmak isteyen kullanıcıların bu tabloda tanımlı olup olmadıklarına bakıp erişim izni vereceğim trigger’ı yazıyorum.

CREATE OR REPLACE TRIGGER emrah.login_trg
AFTER LOGON ON DATABASE
DECLARE
v_cnt_os        NUMBER        := 0;
v_cnt_ip        NUMBER        := 0;
v_os_username   VARCHAR2 (30);
v_ipaddress     VARCHAR2 (30);
BEGIN

— gelen user’ın ip adresini aliyorum
SELECT SYS_CONTEXT (‘userenv’, ‘ip_address’)
INTO v_ipaddress
FROM DUAL;
— gelen user’ın os user name ini aliyorum
SELECT SYS_CONTEXT (‘userenv’, ‘os_user’)
INTO v_os_username
FROM DUAL;

SELECT COUNT (osuser_name)
INTO v_cnt_os
FROM login_control
WHERE osuser_name = v_os_username;

SELECT COUNT (ip_address)
INTO v_cnt_ip
FROM login_control
WHERE osuser_name = v_ipaddress;

IF v_cnt_ip = 0 AND v_cnt_os = 0
THEN
raise_application_error
(-20001,
‘Semaya baglanmak icin tanimli bir kullanici degilsiniz, lutfen veritabani yoneticiniz ile iletisime geciniz’
);
END IF;
END;

şimdi login_control tablosunda tanımlı olmayan bir ip adresi ve kullanıcı adı ile login olmaya çalışıyorum.

hata

evet görüldüğü üzere login olamadan trigger’ın bana fırlattığı hatayı aldım. EmrahMete OS user’ının sahip olduğu makinadan girş yapmaya çalıştığımda ise herhangi bir sorun ile karşılaşmadan login olma işlemini gerçekleştirdim. Bu yöntem ile bazı şemalarda güvenlik önlemini şema seviyesindede alıp connection’ları yönetebilirsiniz.

Umarım farkındalık anlamında faydalı bir yazı olmustur.

Advertisements

About ... from Emrah METE

Bilgisayar Mühendisi
This entry was posted in Oracle, Uncategorized and tagged , , , . Bookmark the permalink.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s