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.