SQL Server 2016 Dynamic Data Masking Kullanımı

Herkese merhaba,

Bu yazıda size SQL Server 2016 ile gelen Dynamic Data Masking kullanımından bahsedeceğim.

Dynamic Data Masking kullanımı ile artık verilerimizi kolaylıkla maskeleyebileceğiz. Peki veri maskeleme nedir? Veri maskeleme, veritabanı içindeki önemli verilere erişimi engelleyen bir güvenlik sistemidir. Bu sistem, gerçek verilerin yerine gerçek olmayan başka verilerin getirilmesi ile gerçekleşen bir işlemdir.

Tablodaki istenilen alanlar, tüm kullanıcılara ya da istenilen kullanıcılara maskelenerek gösterilebilir. Peki maskeleme işlemi genel olarak nasıl yapılıyor?

Maskeleme işlemi T-SQL komutları ile yapılıyor. Alter Table komutu ile istediğimiz alanları maskelendirebiliyoruz. Maskeleme için 3 adet hazır, 1 adet de custom fonksiyon bulunmaktadır.

default(): Tüm veriyi xxx olarak maskeleyebiliriz.

email(): Email formatına uygun olarak verileri maskeler.

random([start range], [end range])): Sayısal alanlar için kullanabileceğimiz random fonksiyonu belirlediğimiz aralıkta rastgele sayı üreterek maskeleme işlemi yapar.

Custom- partial(prefix,[padding],suffix): String alanlar için custom yani özel fonksiyon yazılarak maskeleme işlemi yapılabilir.

Konu ile ilgili ayrıntılı örneği ve alıştırmaları açıklamaları ile aşağıda görmektesiniz.

--Database oluşturma

Create Database Test
go
Use Test
go

--Tablo oluşturma

CREATE TABLE Calisanlar_Tablosu (
CalisanID INT IDENTITY(1, 1) PRIMARY KEY
,CalisanAd NVARCHAR(10) NOT NULL
,CalisanSoyad NVARCHAR(10) NOT NULL
,CalisanDogumTarihi DATETIME NULL
,CalisanMaas INT NULL
,CalisanEmail NVARCHAR(50) NULL
,CalisanIstihdamTarihi DATETIME NULL
)
 
--Tabloya veri ekleme

insert into Calisanlar_Tablosu
(CalisanAd,CalisanSoyad,CalisanDogumTarihi,CalisanMaas,CalisanEmail,CalisanIstihdamTarihi) values ('Yavuz','Selim','2017.01.01','1200','yavuz@selim.com','2018.01.01')

--Tabloyu listeleme

select * from Calisanlar_Tablosu

 --Maskelenmiş veriyi görmek için kullanıcı oluşturma

CREATE USER TestKullanici WITHOUT LOGIN;  
GRANT SELECT ON Calisanlar_Tablosu TO TestKullanici;   

--Veriyi görmek

USE test 
GO
EXECUTE AS USER = 'TestKullanici';  
SELECT * FROM Calisanlar_Tablosu;  
REVERT;



--Tablomuzda email alanını maskeli hale getirmek

ALTER TABLE Calisanlar_Tablosu  
ALTER COLUMN CalisanEmail nvarchar(50) MASKED WITH (FUNCTION = 'Email()'); 

--Veriyi görmek

EXECUTE AS USER = 'TestKullanici';  
SELECT * FROM Calisanlar_Tablosu;  
REVERT;

--Tablomuzda maaş alanını maskeli hale getirmek

ALTER TABLE Calisanlar_Tablosu  
ALTER COLUMN CalisanMaas int MASKED WITH (FUNCTION='random(1,9)');

--Veriyi görmek

EXECUTE AS USER = 'TestKullanici';  
SELECT * FROM Calisanlar_Tablosu;  
REVERT;

--Tablomuzda çalışan alanını maskeli hale getirmek

ALTER TABLE Calisanlar_Tablosu  
ALTER COLUMN CalisanAd nvarchar(10) MASKED WITH (FUNCTION= 'partial(3,"XXXX",3)');
 
 --Veriyi görmek

EXECUTE AS USER = 'TestKullanici';  
SELECT * FROM Calisanlar_Tablosu;  
REVERT;


--Tablolarda herhangi bir fiziksel değişiklik olmadığını aşağıda görebiliriz. Unmask erişimi verildi ise verileri maskesiz görebilirler Grant ile değiştirilenleri eski haline çevirmek için Revoke kullanılmıştır.

GRANT UNMASK TO TestKullanici
GO
EXECUTE AS USER = 'TestKullanici';  
SELECT * FROM Calisanlar_Tablosu;  
REVERT; 
GO

REVOKE UNMASK TO TestKullanici
EXECUTE AS USER = 'TestKullanici';  
SELECT * FROM Calisanlar_Tablosu;  
REVERT; 

--Tabloda maskelenmiş alanları görmek için aşağıdaki sorguyu kullanabilirsiniz.

SELECT TBLS.name as TabloAdi ,MC.NAME KolonAdi, MC.is_masked Maslelenmişmi, MC.masking_function MaskeFonksiyonu  
FROM sys.masked_columns AS MC 
JOIN sys.tables AS TBLS   
ON MC.object_id = TBLS.object_id  
WHERE is_masked = 1;   
 
 --Tablodan maskeli alanları drop etmek

 ALTER TABLE Calisanlar_Tablosu
ALTER COLUMN CalisanAd DROP MASKED;

--Tabloyu görüntülemek (Görüldüğü üzere maskesiz görünecek)
EXECUTE AS USER = 'TestKullanici';  
SELECT * FROM Calisanlar_Tablosu;  
REVERT;


--Yetkilendirme yapılması işlemi

GRANT SELECT,INSERT, UPDATE ON Calisanlar_Tablosu TO TestKullanici


--Eğer sıfır sonucunu alıyorsanız tablonuzun security kısmında user klasörü altında TestKullanici kullanıcısını bulun ve sonrasında sağ tık yapın, properties'i seçin ve membership kısmında db_owner'a tik koyun kaydedin. Aksi halde aşağıdaki tabloyu oluşturamazsınız.

use Test;
select IS_ROLEMEMBER('db_owner','TestKullanici');
 
 --Tabloyu oluşturma (Verilerin kopyalanacağı)

CREATE TABLE Calisanlar_Tablosu2 (
CalisanID2 INT IDENTITY(1, 1) PRIMARY KEY
,CalisanAd2 NVARCHAR(10) NOT NULL
,CalisanSoyad2 NVARCHAR(10) NOT NULL
,CalisanDogumTarihi2 DATETIME NULL
,CalisanMaas2 INT NULL
,CalisanEmail2 NVARCHAR(50) NULL
,CalisanIstihdamTarihi2 DATETIME NULL
)

--Bir tablodan diğerine veri kopyalama

EXECUTE AS USER = 'TestKullanici'; 
INSERT INTO Calisanlar_Tablosu2
           (CalisanAd2
           ,CalisanSoyad2
           ,CalisanDogumTarihi2
           ,CalisanMaas2
           ,CalisanEmail2
           ,CalisanIstihdamTarihi2 )
SELECT   CalisanAd
           ,CalisanSoyad
           ,CalisanDogumTarihi
           ,CalisanMaas
           ,CalisanEmail
           ,CalisanIstihdamTarihi 
		   FROM Calisanlar_Tablosu  

 --Tabloyu listeleme işlemi. Görüldüğü üzere yine maskelenmiş biçimde verdi.
    
SELECT * FROM Calisanlar_Tablosu2

Herkese çalışma hayatında ve yaşamında başarılar kolaylıklar.

1.009 Kez Okundu

Yavuz Selim Kart

Yazılım ve veri tabanında bildiklerimi anlatmaya gayret ediyorum. Halen birçok programlama dili üzerinde araştırmalar yaparak kendimi geliştiriyorum. Bunlar haricinde Grafik Tasarım ve Wordpress konularına da ilgim bulunmakta. SEO ve Sosyal medya yönetimleri hakkında da bilgim mevcuttur. Kısaca çok çalışmayı seven azimli biriyim.

You may also like...

Yazı kopyalamak yasaktır!