Merhaba Arkadaşlar,
Bu makalede sizlere ib/fb veritabanı sunucularında yapısal anlamda nasıl kullanıcı hakları nasıl verildiğine değineceğim. Makalede kapalı ifadeler olabilir. Bilgisi olmayan arkadaşlar uzmanlık gerektiren bir konu olduğundan IB klavuzundan bilgi edinmelerini öneririm.
Çok kullanıcılı uygulamaların özelliği, kullanıcı tanımlanması ve kullanıcılara haklar verilmesidir. Nasıl ki işletim sistemlerinde admin,guest,power user gibi haklarla işletim sisteminde kullanıcıları kısıtlayabiliyorsanız sql sunucuları içeren programlarda da bunu yapabilirsiniz.
IB/FB veritabanlarında yetkilendirme için grant ISql komutunu kullanabilirsiniz. Ayrıca Revoke komutu ile bu hakları silebilirsiniz. Bu işlemleri yapmak için manuel sunucunun sql konsolu üzerinden yapmak durumundasınız. Çünkü SQL sunucuları kendi Sql versiyonlarını kullanırlar. Örneğin InterBase ISQL sürümünü kullanırken, Access ve MS-SQL Server kendi MSSql sürümlerini, Oracle ise kendi sql sürümünü kullanır. Bunlar sintaks olarak farklıdırlar. Delphi ise sql ile işlem yaparken temel sql komt kümesini kullanır. Bundan dolayı delphi içerisinden isql,mssql,oraclesql komutlarını çalıştıramazsınız. TDataset sınıfı bu sql sunucu komutlarını görmeyecektir.
Peki nasıl haklar tanımlayacağız? Komutları çalıştıramıyorsak nasıl erişimi kısıtlayacağız?
Birçok firma bunun için veri tablosu içerisinde program arayüzünde tanımladığı kullanıcıları ve haklarını bu tür bir tablo içerisinde tutar. Birçok profesyonel program üreten firma bunu bu şekilde kullanmaktadır. Fakat bu son derece sağlıksız bir çözümdür. Veritabanı dosyası başka bir bilgisayar üzerinde okunabilir, sadece paket program içerisinde yazılan komutlarla haklar kısıtlanır.
Bunu engellemenin yolu SQL sunucusunun kendi kullanıcı tanımlama bloğunu kullanmaktır. Bu en sağlıklı çözümdür. Bu şekilde yapılırsa veritabanı kullanıcıları ve haklarını kendi sistem tablolarında tutar. Yetkisi olmayan bir kullanıcı veritabanına erişmek isterse sql sunucusu doğrudan sistem tablosundaki kullanıcı haklarına bakar yetkisi yoksa ilgili tablolara erişimi kısıtlar.
Örnek olarak IB konsolundan "misafir" kullanıcısına müşteri bilgilerinin bulunduğu tabloya sadece okuma izni verelim.
GRANT SELECT ON "MUSTERI_BILGILERI" TO MISAFIR;
Böylece yapısal olarak sunucuya erişim hakkı gönderdik. Kullanıcı sistemede misafir kullanıcısı ile girdiğinde sadece müşteri bilgilerini görebilecek diğer tablolara erişemeyecektir. Eğer bu hakkı kaldırmak isterseniz revoke komutunu kullanabilirsiniz.
Biz bunu konsoldan yapabiliyoruz. Fakat sql bilgisi olmayan son kullanıcı programı kullanırken bunları kullanıcının yazmasını bekleyemezsiniz. En mantıklı çözüm bir program hazırlamak ve kullanıcıları ve haklarını buradan yönetebilmesini sağlamaktır.
Delphi kütüphanelerinin ISql komut setini tanımadığını söylemiştik.IBQuery bileşenine yukarıdaki grant komutunu verdiğinizde bunu algılamayacaktır. Bunu aşmak için kullanıcı haklarının bulunduğu tabloya select,update,delete,insert gibi temel sql komutlarıyla erişmek, ve hakları belirlemektir. Örneğin misafir kullanıcısına "taksitler" tablosuna okuma yazma hakkı vermek istediğimizde sistem tablosuna bu hakları insert komutuyla eklememiz gerekir. Grant komutu da bu işlemi yapar. Interbase 7 sürümünden önceki sürümler sistem tablolarını gösterir. 7 ve sonraki sürümler için ise IbConsole içerisinde "View" menüsünden "System Data" seçerseniz sistem tablolarını göreceksiniz.
Sistem tabloları "RDB$" ile başlar. örneğin karakter kümelerinin tanımlandığı sistem tablosu "RDB$CHARACTER_SETS" dir. Bizim ise işlem yapacağımız tablo "RDB$USER_PRIVILEGES" tablosudur. Bu tabloda sql sunucusunun kullanıcı hakları bulunmaktadır. Ayrıca burada tabloların haricinde görüntü (view), depolanmış yordam (stored procedure) erişim haklarıda bulunur. Böylece kullanıcıların görüntü ve depolanmış yordamları çalıştırmasını da kısıtlayabilirsiniz.
RDB$USER_PRIVILEGES tablosu aşağıdaki alanları içerir.
"RDB$USER" ->>kullanıcı adı
"RDB$GRANTOR"
"RDB$PRIVILEGE" ->> kullanıcı hakları: "S","I","D","U","X"(Execute)
"RDB$GRANT_OPTION"
"RDB$RELATION_NAME" ->> Tablo,görüntü,yordam adı
"RDB$FIELD_NAME"
"RDB$USER_TYPE"
"RDB$OBJECT_TYPE"
Delphi içerisinde kullanıcıları tablodan alabilir veya IbSecurityService bileşeniyle listeleyebilirsiniz.
Örneğin daha önce grant komutuyla konsoldan yaptığımız işlemi delphi içerisinde IBQuery bileşeni ile yapmak için şunu yazabilirsiniz.
Insert Into RDB$USER_PRIVILEGES values("misafir",,"S ","musteriler",,"8","0")
Böylece grant komutunun yaptığı işlemi yaptık. Bunu bir arayüz şeklinde hazırlayarak kullanıcının yönetebilmesini sağlayabilirsiniz. Bunu ayrı bir modül halinde hazırlayarak ana program girişinde; kullanıcı giriş şifre ekranı, şeklinde bir yol izleyebilirsiniz. Bu tamamen sizin tercihinize kalmış.
Konsoldan veritabanı üzerine sağ tuş yaparak "View Metadata" derseniz ekrana gelen pencerenin en altında grant hakkının eklenmiş olduğunu göreceksiniz.
Böylece zahmetli kullanıcı kontrol yöntemlerinden kurtularak tam güvenli bir yönetim sisteminiz olacaktır.
Makaleyi sabırla anlamaya çalışıp okuyan tüm arkadaşlarıma teşekkür ediyor çalışmalarında başarılar diliyorum.
Sinan ERGİN.