Cuma , 23 Haziran 2017

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

Hemen hemen her eğitimde konu SQL Server güvenliğine geldiğ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.

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

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.

ssms1

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.

USE [test]
GO
CREATE USER [test] FOR LOGIN [test]
GO
USE [test]
GO
ALTER ROLE [db_datareader] ADD MEMBER [test]
GO

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.

USE [master]
GO
DENY VIEW ANY DATABASE to [test]

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

ssms2

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.

USE [test]
GO
DROP USER [test]
GO
EXEC dbo.sp_changedbowner @loginame = N'test', @map = false
GO

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.

ssms3

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

Hakkında ismailadar

Cevapla

E-posta adresiniz yayınlanmayacak. Required fields are marked *

*


*

Şu HTML etiketlerini ve özelliklerini kullanabilirsiniz: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>