SQL SERVER 2016 – Dynamic Data Masking

SQL Server 2016 versiyonu ile hayatımıza giren önemli özelliklerden bir tanesi de Dynamic Data Masking ‘dir. Önceki versiyonlarsa maskeleme sürecini  gerçekleştirmek için bir çok işlem yaparak sağlıyorduk. Genelde maskeleme, tuttuğumuz datanın kullanıcıya sunduğumuz da verinin aslını değil de bir kısmını gizleyerek göstermek olarak tanımlayabiliriz. Örnek olarak kullanıcının TC Kimlik Numarası, Telefon Numarası vb. gibi.

Önceden bu işlemleri bir çok işlem yaparak sağlıyorduk demiştik bunlardan bir tanesi kullanıcıların direk tablo üzerinde sorgulama yapmasını sağlamak yerine VIEW lar oluşturup VIEW lar içerisinde fonksiyonlar kullanarak datayı maskeleyip sunardık.

Yeni versiyon da gelen bu özellik ile bu maliyetli süreç ortadan kalkmış olmaktadır.

Örnek bir tablo oluşturalım ;

CREATE TABLE Personel_DDM
(
Personel_Id INT IDENTITY (1,1) PRIMARY KEY CLUSTERED ,
Identity_Number CHAR(11),
First_Name VARCHAR(100),
Last_Name VARCHAR(100),
Email VARCHAR(100),
Created_Date DATETIME
)

Dynamic Data Masking özelliğini , tablo oluştururken veya hali hazırdaki tablolarımız üzerinde de tanımlayabiliyoruz.

Data Maskeleme için 4 adet fonksiyonumuz bulunmaktadır ;

  1. Default

Bu fonksiyon ile maskelemek istediğimiz veri türleri aşağıda ki gibi olduklarında karşılarında ki karakter ile maskelenmektedir.

  • Metinsel Veri : XXXXX
  • Numerik Veri : 0000
  • Teihsel Veri : 01.01.2000 00:00:00.0000000

Örnek tablomuza bu fonksiyon altında kolonlar ekleyelim.

ALTER TABLE Personel_DDM ADD Phone VARCHAR(12)MASKED WITH (FUNCTION='default()') NOT NULL
ALTER TABLE Personel_DDM ADD Gender VARCHAR(1) MASKED WITH (FUNCTION='default()') NOT NULL

Phone ve Gender kolonlarını ekledik ve Default fonksiyonu ile de maskeledik.

Şimdi ise tablomuza veri basalım.

-- Kayıt Ekleme
INSERT INTO Personel_DDM
(
Identity_Number,
First_Name,
Last_Name,
Phone,
Email,
Gender,
Created_Date
)
VALUES 
(
'12345678910',
'Yusuf',
'Kahveci',
'05309999999',
'[email protected]',
'E',
GETDATE()
)
GO

INSERT INTO Personel_DDM
(
Identity_Number,
First_Name,
Last_Name,
Phone,
Email,
Gender,
Created_Date
)
VALUES 
(
'98765432101',
'Adam',
'Exev',
'05409999999',
'[email protected]',
'E',
GETDATE()
)
GO

INSERT INTO Personel_DDM
(
Identity_Number,
First_Name,
Last_Name,
Phone,
Email,
Gender,
Created_Date
)
VALUES 
(
'65432896471',
'Marry',
'Chunk',
'05407777777',
'[email protected]',
'B',
GETDATE()
)

Şimdi ise SELECt çekecek kullanıcımızı oluşturup yetkilendirmesini gerçekleştirelim.

-- Kullanıcı oluşturup Tablomuza SELECT yetkisi veriyoruz.
CREATE USER SQLTR_Demo_User WITHOUT LOGIN; 
GO 
GRANT SELECT ON Personel_DDM TO SQLTR_Demo_User;
GO

Kullanıcımızı oluşturduk ve yetkilendirmeyi sağladık.

Bu kullanıcı ile SELECT çekelim :

-- Kullanıcımız ile SELECT çekiyoruz.
EXECUTE AS USER = 'SQLTR_Demo_User'; 
GO
SELECT  *
FROM    Personel_DDM; 
GO
REVERT;

Gördüğünüz üzere Phone ve Gender alanları Maskelenmiş geldi.

2.Email

Default fonksiyonunun dışında kullanabileceğimiz bir diğer fonksiyon ise EMAIL fonksiyonudur. Bu fonksiyon ile de emila formatımızın ilk harfi alınarak XXXXX olarak maskelenmektedir.

ÖR : [email protected]

Tablomuz üzerinde ki Email kolonunu maskelemek istediğimizde ;

-- Var olan kolonu maskeleme
ALTER TABLE Personel_DDM ALTER COLUMN Email ADD MASKED WITH (FUNCTION='Email()')

Maskelem işlemini yukarıd aki script ile gerçekleştirdik ve şimdi data mızı çekelim.

-- Kullanıcımız ile SELECT çekiyoruz.
EXECUTE AS USER = 'SQLTR_Demo_User'; 
GO
SELECT  *
FROM    Personel_DDM; 
GO
REVERT;

Gördüğünüz üzere Emial Kolonu Maskelenmiş şekilde geldi. İlk karekter dışındakilerin hepsi maskelenmiş oldu.

3.Partial

Bu fonksiyonumuz ise Default ve Email fonksiyonlarına göre daha esnek bir fonksiyondur. Maskeleme işlemini istediğimiz şekilde şekillendirebileceğimiz bir yöntemdir.

Maskeleme yöntemi olarak çok kullanışlı bir yöntem olarak bilinir ve örnek verecek olur isek email fonksiyonumuzda ilk harfi gösterip maskeleme yapabilirken burada biz yapacağımız örneğimizde ilk iki  ve son bir harfi göstererek maskeleme yaptırabiliriz.

Genel Kullanım Syntax ‘ı :

Partial (Prefix,[Padding],Suffix)

Syntax ‘ı incelediğimizde ; Prefix bize kaç karakterin görüntülenecğini, [Padding] maskeleme için kullanılacak İfadeyi belirlediğimiz yer (örneğin XXX yerine YYY ile de maskeleme yapabilriz), Suffix ise sondan kaç karakterin görüneceğini belirttiğimiz bölümdür.

Identity Number kolonumuzu Partial maskeleme yapalım ve kuralımızda ilk iki hanesi ve son bir hanesi gözükecek şekilde olsun.

ALTER TABLE Personel_DDM ALTER COLUMN Identity_Number ADD MASKED WITH (FUNCTION='partial(2,"YYYYYY",1)')

Gerekli maskelememizi yaptık. Kullanıcımız ile datayı kontrol edelim .

-- Kullanıcımız ile SELECT çekiyoruz.
EXECUTE AS USER = 'SQLTR_Demo_User'; 
GO
SELECT  *
FROM    Personel_DDM; 
GO
REVERT;

Identity_Number kolonumuz a baktığımızda ilk iki hanesi ve son bir hanesi data çekme işleminde de görüldüğü üzere açık ve diğerleri maskelenmiş şekilde gelmektedir.

 4.Random()

Bu fonksiyon ile de random bir değer SET edilerek maskeleme yapılır. Tablomuza Salary adında bir kolon ekleyip datalarımızı salary kolonu için güncelleyeim. Örneğimizde herkesin Salary değeri aynı olsun.

ALTER TABLE  Personel_DDM ADD Salary INT  
GO
UPDATE Personel_DDM SET Salary=10000
GO

Bu fonksiyon ile verdiğimiz değer aralığında her sorgu çekildiğinde o aralıkta bir değer üretilerek maskeleme yapılır.

Örneğimizde 100000 ile 200000 arasında bir değer üreterek maskeleme yapmasını SET ediyoruz.

ALTER TABLE Personel_DDM ALTER COLUMN Salary ADD MASKED WITH (FUNCTION='Random(100000,200000)')

Maskeleme işlemini tamamladıktan sonra kullanıcımız ile SELECT çekelim ;

-- Kullanıcımız ile SELECT çekiyoruz.
EXECUTE AS USER = 'SQLTR_Demo_User'; 
GO
SELECT  *
FROM    Personel_DDM; 
GO
REVERT;

 

Gördüğünüz üzere verilen aralık arasından random bir değer üreterek maskeleme yapılmış oldu.

Maskeleme İşlemini Kolon Üzerinden Kaldırmak

Tablomuzda Email kolonund aki maskelemeyi kaldırmak istediğimiz de ;

ALTER TABLE <Table_Name> ALTER COLUMN <Column_Name> DROP MASKED

query sini hazırlamamız yeterlidir. Örneğimizde ki script ise aşağıda ki gibi olmalıdır.

ALTER TABLE Personel_DDM  ALTER COLUMN Email DROP MASKED

Daha sonra kullanıcımız ile datayı çekiyoruz ;

-- Kullanıcımız ile SELECT çekiyoruz.
EXECUTE AS USER = 'SQLTR_Demo_User'; 
GO
SELECT  *
FROM    Personel_DDM; 
GO
REVERT;

Email kolonumuzda ki maskelemenin kalktığını görmekteyiz.

 

2 Replies to “SQL SERVER 2016 – Dynamic Data Masking”

  1. Tһank you for every other great post. Where else may just anybody
    get that kind of infoгmation in such an ideal mɑnnеr of writing?

    I’ve a presentation subsequеnt week, and I am on the search for such info.

Leave a Reply

Your email address will not be published. Required fields are marked *