9 Eylül 2012 Pazar

SQL Server Management Stdio Üzerinde Kullanıcıların Görebildikleri Veritabanı Listesini Kısıtlamak


SQL Server güvenliğinde sık karşılaştığımız sorulardan biri de kullanıcının yetkisi olmadığı halde SQL Server Management Stdio kullanarak SQL Servera bağlandıklarında tüm veritabanlarını görmelerinin nedenidir. Aslında bu durum SQL Server ile doğrudan ilişkili değildir. SQL Serverı yönetmek için kullandığımız araç olan SQL Server Management Stdio aracının tasarımı yapılırken hızlı açılabilmesi için dinamik olarak oluşturulan ve SQL Server objelerinin listelendiği Object Explorer penceresi oluşturulduğunda herhangi bir kontrol yapılması şeklinde tasarlanmıştır. Hatta yetkiden bağımsız olarak kimsenin erişmeyeceği Offline durumdaki veritabanları bile kontrol edilmeden listelenmektedir.
Daha teknik bir ifadeyle konuyu açıklayacak olursak SQL Server her kullanıcımızın üye olduğu public adında bir rol vardır ve varsayılan olarak bu role VIEW ANY DATABASE yetkisi verilmiştir. Yani bu role sahip her kullanıcı yetkisi olmasa bile erişim hakkı olmaz ama tüm veritabanlarının listesini Object Explorer penceresinde görebilmektedir. Bu nedenle eğer tüm kullanıcılardan veritabanı listesinin gizlemek istiyorsak public rolünden bu yetkiyi almamız gerekmektedir. Aynı şekilde sadece bir kullanıcıdan da bu yetkiyi alarak sadece bir kullanıcının tüm veritabanları görmesini engelleyebiliriz. Şimdi hemen bir uygulama üzerinde bu işlemi yapalım. İlk adım olarak bir kullanıcı oluşturalım ve hiç yetki vermeyelim.



1USE [master]
2GO
3CREATE LOGIN [test] WITH PASSWORD=N'test', DEFAULT_DATABASE=[master], CHECK_EXPIRATION=OFF
CHECK_POLICY=OFF
4GO

Kullanıcımızı oluşturduktan sonra Management Stdio aracılığıyla SQL Servera bağlanalım. Karşımıza aşağıdaki gibi bir ekran gelecektir.

 

Yukarıdaki resimde gördüğümüz gibi hiçbir yetki vermeden bir kullanıcı oluşturup SQL Servera bağlandıktan sonra kullanıcı erişim yetkisi olmasa bile Object Explorer penceresinde tüm veritabanlarının listesini görebilmektedir. Şimdi kullanıcımıza test adlı veritabanımız üzerinde okuma yetkisi verelim.
1USE [test]
2GO
3CREATE USER [test] FOR LOGIN [test]
4GO
5ALTER ROLE [db_datareader] ADD MEMBER [test]
6GO
Artık kullanıcımızın test adlı veritabanında okuma yetkisi vardır. Şimdi kullanıcımızdan yukarıda bahsettiğimiz VIEW ANY DATABASE yetkisini alalım.
1USE [master]
2GO
3DENY VIEW ANY DATABASE to [test]


Tekrar SQL Servera bağlanıp Object Explorer’daki Veritabanı listemizi kontrol edelim.


Yukarıdaki resimde gördüğümüz gibi kullanıcı okuma yetkisi olsa bile o veritabanı Object Explorer penceresinde listelenmedi. Çünkü daha önce belirttiğimiz gibi sadece sistem veritabanları olan master ve tempdb ile Owner sahip olduğu veritabanları listelenmektedir. Bunu da test edebilmek adına test kullanıcımızı veritabanının sahibi olarak değiştirelim.

1USE [test]
2GO
3DROP USER [test]
4GO
5EXEC dbo.sp_changedbowner@loginame = N'test', @map = false
6GO
Yukarıdaki kodumu incelediğimizde öncelikle test kullanıcımızı veritabanımızından silmemiz gerekir çünkü map edilmiş bir kullanıcı bir veritabanına owner olarak atayamıyoruz. Daha sonra sp_changedbowner adlı sistem stored Procedure aracılığıyla veritabanımızın sahibini değiştiriyoruz. Şimdi aynı kullanıcı ile SQL Servera tekrar bağlanalım. Karşımıza aşağıdaki gibi bir ekran gelecektir.

Yukarıdaki ekranda gördüğümüz gibi sadece sistem veritabanları ve sahibi olduğu veritabanı listelenmiştir. 

Hiç yorum yok:

Yorum Gönder