Çoğu yazılım geliştirici tarafından veritabanı yetkilendirmesi göz ardı edilmektedir. Yazılım geliştiriciler yetkilendirme problemini, uygulama kullanıcısını db_owner yaparak çözüyor. Bu şekilde hiçbir yetki problemi ile karşılaşılmıyor.
Ancak üretim ortamlarında bu yetki çok fazladır ve veritabanı yöneticileri bu yetkiyi gerekli ve yeterli olacak seviyede tutmaya çalışmaktadır.
Veritabanını kullanan yazılım, özellikle dış kaynaklı bir yazılım ise, uygulama kullanıcısı “db_owner” rolünde olması çok muhtemeldir. Bu durumda yapılması gereken uygulama kullanıcısının yetkilerini gerekli ve yeterli olacak bir seviyeye çekmektir. Ama bu çok kolay bir şey değildir, çünkü uygulama yetkilendirme problemlerinden dolayı çalışmayabilir.
Uygulama kullanıcısının hangi yetkilere sahip olması gerektiği bilgisi uygulama geliştiricilerden alınmalıdır.
Çoğunlukla uygulamalar DML işlemleri (insert, update, delete, select) ile execute (stored procedure ve functionlar için) işlemlerine ihtiyaç duymaktadır. Bunların dışında truncate table, create procedure gibi işlemler yapan uygulamalar nadiren de olsa çıkabilir tabi.
Şimdi bir uygulama kullanıcısının yetkilerini gerekli ve yeterli seviyeye nasıl çekilebileceğimize bir bakalım.
Önce bir rol oluşturalım. Bu rolün adı “AppUserRole” olsun. Aşağıdaki kod ile rol create edilir.
CREATE ROLE [AppUserRole] AUTHORIZATION [DBO]
Şimdi oluşturduğumuz bu role uygulama kullanıcısı olan “AppUser”ı ekleyelim.
exec sp_addrolemember [AppUserRole], [AppUser]
Şimdi yapılması gereken şey, veritabanında işlem yapabilmek için gerekli olan yetkileri “AppUserRole”de toplamak. Bu schema seviyesinde yapılabileceği gibi nesne seviyesinde de yapılabilir.
Schema seviyesinde yetkilendirme yapmak için :
Aşağıdaki kodu çalıştırarak schema seviyesinde yetkilendirme yapmış oluruz.
GRANT select, insert, update, delete, exec on schema::[schemaName] to [AppUserRole]
Bu kod ile schema altında var olan tüm tablo, view, sp, function vs. hepsine DML ve EXEC yetkileri “AppUserRole”e verilmiş olur. Schema altında sonradan oluşturulacak nesnelerin yetkileri de verilmiş olur.
Schema bazlı yetkilendirme yapmak ileride oluşturulacak nesneleri de kapsadığı için bir esneklik sağlamaktadır.
Nesne seviyesinde yetkilendirme yapmak için:
Aşağıdaki kod parçacığını çalıştırarak veritabanındaki tüm kullanıcı nesnelerine gerekli yetkiyi veren scripti üretebiliriz. Üretilen bu scripti ilgili veritabanında çalıştırdığımızda tüm dml ve exec yetkileri “AppUserRole”de toplamış oluruz.
select
'GRANT '+
case type when 'U' then 'select, insert, update, delete'
when 'V' then 'select'
when 'FN' then 'exec'
when 'FC' then 'exec'
when 'FT' then 'select'
when 'TF' then 'select'
when 'IF' then 'select'
when 'P' then 'exec'
when 'PC' then 'exec'
end +
' on [' + SCHEMA_NAME(schema_id) + '].[' + name + '] to AppUserRole
GO
'
from sys.objects where type in ('U','P','PC','FN', 'FC','FT','IF', 'TF','V') and name not like '%diagram%'
order by type, SCHEMA_NAME(schema_id), name
Nesne seviyesinde yetkilendirme yapmak yetki ayrıştırması bakımından avantaj sağlarken her oluşturulan yeni nesne için yetki verilmesi gerekliliği iş yükü getirmektedir.
Sonuç:
Kullanıcıların gereğinden fazla yetkiye sahip olması veritabanı yöneticileri tarafından istemeyen bir durumdur. Bu durumu çözüme kavuşturmak bu yöntem ile mümkün hale gelmektedir.