Pazartesi , 20 Kasım 2017

SQL Server 2016 Dynamic Data Masking

SQL Server 2016 ile beraber gelen önemli güvenlik özelliklerinden biri Dynamic Data Masking özelliğidir. Bu özellik sayesinde SQL Serverda tutulan ve sorgulama yapan kullanıcılardan gizlemek istediğimiz önemli verilerimizi kolayca maskeleyebiliyoruz. Maskeleme kavramını biraz açacak olursak, maskeleme işlemi temelde var olan veriyi değiştirmeden sadece kullanıcıya gösterirken verinin aslını değil bir kısmının gizlenerek gösterilmesidir. Örneğin hemen hemen bir çok online satış yapan firmada müşteriye ait kredi kartı numarası, TC kimlik numarası, telefon numarası gibi hassas verilerin her kullanıcı tarafından görülmesini istemeyiz.

SQL Server 2016 öncesinde yetkisiz daha doğrusu sınırlı yetkiye sahip kişilerin görmesini istemediğimiz verilerimiz için bu kişilere tablo üzerinde sorgulama yetkisi vermek yerine bir View oluşturarak, View içindeki sorgumuzda istediğimiz veriyi SQL Server fonksiyonları ile maskeleyip kullanıcılarımıza tablo yerine bu View üzerinde yetki veriyorduk. Oysa SQL Serverın 2016 versiyonu ile birlikte tablomuzdaki veriyi fiziksel olarak değiştirmeden maskeleyebiliyoruz.

Maskeleme işlemi her ne kadar bir güvenlik önemli olarak görünse bile buradaki asıl amaç tablomuzdaki veriye kasıtlı erişim yetkisi bulunan, daha açık bir ifadeyle tablomuz üzerinde sadece select ile sorgulama yetkisi bulunan bir kişinin veriyi açıkça görmesini engellemektir. Örneğin günlük hayatta sık kullanılan şirketlerde raporlama departmanlarında rapor için SQL Server üzerinde sorgu yazan kişilerin üyelere ait tabloda sorgulama yetkisinin olması gerekiyor fakat bu tablodaki telefon numarası veya TC kimlik numarası gibi hassas verileri açıkça görmesine gerek duyulmayabilir. İşte bu durumlarda Dynamic Data Masking özelliğini kullanmak faydalı olacaktır.

Dynamic Data Masking özelliğini hem tablolarımızı oluştururken tanımlayabildiğimiz gibi hem de var olan tablomuzdaki kolonlarımız içinde kullanabiliriz. Tablolarımızdaki kolonlarımız için Dynamic Data Masking özelliğini kullandığımızda verilerimizi maskelemek için aşağıdaki üç fonksiyondan bir kullanılabilir.

Default:

Default fonksiyonu ile beraber maskelemek istediğimiz veri, metinsel bir veri ise bu veriyi XXXX olarak maskeler. Eğer verinin boyutu 4 karakterden az ise daha az X kullanılır. Ayrıca SQL Serverda var olan char, nchar, varchar, nvarchar gibi metinsel veriler desteklenmesine rağmen CTP 2.1 sürümünde bu veri tipleri için max boyut parametresi desteklenmemektedir.

Default fonksiyonu ile beraber maskelemek istediğimiz veri, numerik bir veri ise SQL Server maskeleme işlemi için 0(Sıfır) kullanacaktır.

Default fonksiyonu ile beraber maskelemek istediğimiz veri, tarihsel bir veri ise bu veri yerine varsayılan bir tarih olan 01.01.2000 00:00:00.0000000 değeri gösterilecektir.

Default fonksiyonu ile beraber maskelemek istediğimiz veri, binary veri ise SQL Server 0 değerinin ASCII karşılığını kullanacaktır.

Email:

Maskeleme işleminde kullanabileceğimiz bir diğer fonksiyonumuz ise Email fonksiyonudur. Adında da anlaşılabileceğini gibi email adresi verilerini kolayca maskelemek için kullanılan bu formatta verimizin ilk harfi ile beraber metinsel verilerde kullanılan X karakteri kullanılarak iXXX@XXXX.com formatında verilerimiz maskelenecektir.

Partial:

Maskeleme işleminde bizim belirleyeceğimiz formata göre maskeleme işleminin yapılmasını sağlayan fonksiyondur. Diğerlerine göre daha esnek olan Partial fonksiyonunda maskelemek istediğimiz verinin tipinden bağımsız olarak son kullanıcıya nasıl görüneceğini biz belirtebiliriz. Örneğin Email fonksiyonunda kullanıcıya email adresinin sadece ilk harfi gösteriliyordu. Partial fonksiyon ile biz ilk üç karakterinin gösterilmesini sağlayabiliriz. Ayrıca Default fonksiyonundan farklı olarak sadece X karakterini değil istediğimiz herhangi bir ifadeyi de maskeleme işlemi için kullanabiliriz. Çok kullanılışlı olan Partition fonksiyonun parametre yapısı aşağıdaki gibidir.

Partial(prefix,[padding],suffix)

Yukarıdaki kullanımda prefix ile ilk kaç karakterin görüntüleneceği belirtilirken, [padding] ifadesi ile maskeleme için kullanılacak ifade belirtilmekte olup son parametre olan suffix ise sondan kaç karakterin görüneceğini belirtmektedir.

Dynamic Data Masking özelliğine bu kadar değindikten sonra şimdi biraz örnek yapalım. Örneğimiz için müşterilerimize ait bilgileri tuttuğumuz aşağıdaki gibi bir tablo oluşturalım ve tablomuzu oluşturduğumuz zaman hassas veri bulunan bazı kolonlarımızdaki verilerimizi yukarıda değindiğimiz fonksiyonlarımızı kullanarak maskeleyelim.

CREATE TABLE Member
  (
   MemberID int IDENTITY PRIMARY KEY,
   FirstName varchar(100),
   LastName varchar(100) NOT NULL,
   Gender char(1) MASKED WITH (FUNCTION = 'default()') NULL,
   City varchar(50) NULL,
   IdentityNumber int MASKED WITH (FUNCTION = 'default()') NOT NULL,
   Phone varchar(12) MASKED WITH (FUNCTION = 'default()') NULL,
   Email varchar(100) MASKED WITH (FUNCTION = 'email()') NULL,
   CreditCardNumber varchar(50)  MASKED WITH (FUNCTION = 'partial(1,"XXXXXXX",0)') NULL,
   Createdate datetime NULL
   )

GO

insert into Member values
   ('Ali','Duru','E','İstanbul',123456,'54100000000','ali@duru.net','4345219895859409',GETDATE()),
   ('Ahmet','Korkmaz','E','Ankara',234456,'53200000000','crazyahmet@gmail.com','45565433456654409',GETDATE()),
   ('Zeynep','Çalışkan','K','İstanbul',987877,'21200000000','zcaliskan@hotmail.com','8765445676543457876',GETDATE()),
   ('Emre','Yıldız','E','İstanbul',2346543,'21600000000','emreyildiz@gmail.com','1234566543278876543',GETDATE())

Yukarıdaki gibi tablomuzu oluşturup 4 tane örnek kayıt insert ettikten sonra şimdi tablomuzu aşağıdaki gibi sorgulayıp kayıtlarımızı görelim.

   Select *
   From Member

ddm1

Yukarıdaki resimde gördüğünüz gibi eklediğimiz 4 tane kaydın tüm bilgilerini açıkça görebiliyorum. Şimdi örnek için aşağıdaki gibi bir tane kullanıcı oluşturup bu kullanıcıya tablomuzu sorgulama yetkisi verelim.

CREATE USER TestUser WITHOUT LOGIN
GO
GRANT SELECT ON Member TO TestUser

Yukarıdaki gibi TestUser adında bir kullanıcı oluşturup bu kullanıcıya tablomuz üzerinde Select yani sorgulama yetkisi verdikten sonra bu kullanıcı ile tablomuzu sorgulayıp sorgu sonucumuzu inceleyelim.

EXECUTE AS USER = 'TestUser'
SELECT * FROM Member
REVERT

ddm2

Yukarıdaki resimde gösterilen sorgumuzun sonucunu inceliğimizde tablomuzu oluştururken kullandığımız maskeleme fonksiyonları sayesinde sadece Select yetkisi olan bir kullanıcının verimizi maskelenmiş olarak gördüğünü görebiliyoruz. Ayrıca dikkat ederseniz Gender kolonundaki veri boyutu tek karakter olduğu için diğer kolonlardan farklı olarak onun için sadece bir tane X karakteri kullanılmıştır. Benzer olarak default fonksiyonunu kullandığımız IdentityNumber kolonunda ise değerler numerik olduğu için verimizin yerine 0(Sıfır) kullanılmıştır. Email verimiz için standart email fonksiyonunu kullandık. CreditCardNumber kolonunda ise sadece kredi kartı bilgisinin ilk kolonu görüncek şekilde partial fonksiyonunu kullanmış olduk.
Tablomuzu ilk oluşturduğumuzda kolonlarımızı nasıl maskelediğimizi gördük. Şimdide var olan tablolarımızda maskeleme işlemi yapılmamış tablolarımızdaki kolonlarımızın nasıl maskelendiğini görelim. Bunun için tablomuzda bulunan LastName kolonundaki verilerimizi de maskeleyelim.

ALTER TABLE Member
ALTER COLUMN LastName ADD MASKED WITH (FUNCTION = 'partial(2,"XXX",0)')

Yukarıdaki kodumuzu incelediğimizde ALTER COLUMN komutu ile beraber ADD MASKED ifadesi ile yukarıda değindiğimiz fonksiyonlardan birini kullanarak maskeleme işlemini yapıyoruz. Örneğimizde LastName kolonumuzdaki verilerin ilk iki harfi görünecek şekilde kalanlarının ise X olarak görüneceği şekilde maskele işlemini yapmış olduk.

Yukarıdaki işlemimizden sonra şimdi sorgumuzu tekrar çalıştırıp kolonumuzdaki verimizin maskelenip maskelenmediğini kontrol edelim.

EXECUTE AS USER = 'TestUser'
SELECT * FROM Member
REVERT

ddm3

Yukarıdaki resimde gördüğümüz gibi LastName kolonundaki verimizin de maskelendiğini görebiliyoruz. Var olan tablomuzdaki herhangi bir kolondaki verimizi nasıl maskeleyebileceğimizi gördük. Şimdide maskelenmiş bir kolondan maskeleme işlevini nasıl kaldırabileceğimize değinelim. Bunun içinde ALTER COLUMN komutunu aşağıdaki gibi kullanmamız gerekiyor.

ALTER TABLE Member 
ALTER COLUMN LastName DROP MASKED

Bu işlemden sonra sorgumuzun sonucunu kontrol edip maskeleme işleminin LastName kolonundan kaldırılıp kaldırılmadığını kontrol edelim.

EXECUTE AS USER = 'TestUser'
SELECT * FROM Member
REVERT

ddm4

Yukarıdaki resimde de gördüğümüz gibi LastName kolonundan maskeleme fonksiyonunu kaldırmış olduk. Böylece kullanıcılar veriyi açık bir şekilde görebiliyor. Fakat bu şekilde bir kolondan maskeleme fonksiyonunu kaldırmadan belli kullanıcıların veriyi açıkça görmesini istiyorsak, ilgili kullanıcılara UNMASKED yetkisi vermemiz gerekiyor. Bu yetkiyi SQL Serverda standart olarak yaptığımız yetkilendirme yapısının aynısını kullanabiliriz. Şimdi örneklerimizde kullandığımız kullanıcımız için UNMASK yetkisi verip sorgu sonucumuzu kontrol edelim.

GRANT UNMASK TO TestUser;

EXECUTE AS USER = 'TestUser'
SELECT * FROM Member
REVERT

ddm5

Yukarıdaki resimde gördüğümüz gibi kolonlarımız için maskeleme fonksiyonunu kullanmış olmamıza rağmen sorgu sonucunda tüm kolonlarımızdaki verimiz açıkça görülebiliyor bunun sebebi ise kullanıcımıza vermiş olduğumuz UNMASK yetkisidir.

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>