SQL Server Dynamic Data Masking(DDM) nedir?

Dynamic Data Masking(DDM): Verilerimiz üzerinde herhangi bir değişiklik/güncelleme yapmadan kolon bazlı maskeleyebilmemize olanak veren bir SQL Server güvenlik çözümüdür. Başka bir değiş ile veriler sonuç kümesinde maskelenmektedir.

SQL Server 2016 ile gelen bu özellik sayesinde (yetkisi olmayan) kullanıcılara hassas verilerimizin bir kısmını ya da tamamını göstermeyebilir, uygulamalar üzerinde herhangi bir değişiklik yapmadan verileri maskeleyebiliriz.

Maskeleme çeşitleri

FonksiyonlarÖzelliklerScript
DefaultString veri türleri için XXXX şeklinde, orjinal veri 4 karakterden az ise X tane gözükecek şekilde maskelenir.
Veri tipleri : charncharvarcharnvarchartextntext

Numeric veri türleri için sıfır (0) olarak maskelenir.
Veri tipleri : bigintbitdecimalintmoneynumericsmallintsmallmoneytinyintfloatreal

Date ve Time veri tipleri için 01.01.1900 00:00:00.0000000 şeklinde maskelenmektedir.
Veri tipleri : datedatetime2datetimedatetimeoffsetsmalldatetimetime

Binary veri türü için tek bir byte 0 olarak maskelenmektedir.
Veri tipleri : binaryvarbinaryimage
ALTER TABLE [Customer] ALTER COLUMN [Phone] ADD MASKED WITH (FUNCTION = 'default()')
EmailEmail adresinin ilk harfi verinin kendisi sonrasında X karakteri ile devam edip “.com” suffix’i ile bitiren string verilerde kullanılan maskeleme metodudur.
Örn : aXXX@XXXX.com
ALTER TABLE [Customer] ALTER COLUMN [Email] ADD MASKED WITH (FUNCTION = 'email()')
RandomVeriyi belirlinen bir aralıkta rastgele değerlerle maskeleyen numeric alanlarda kullanılan metottur.ALTER TABLE [Customer] ALTER COLUMN [IdentityNumber] ADD MASKED WITH (FUNCTION = 'random([start range], [end range])')
Custom StringVeriyi istenilen formata göre maskeleme imkanı sağlayan metottur. prefix,[padding],suffix

Eğer orjinal değer belirlenen maskeden daha kısa ise, başlangıç veya bitiş değerleri gösterilmeyecektir.
ALTER TABLE [Customer] ALTER COLUMN [Name] ADD MASKED WITH (FUNCTION = 'partial(1,"XXXXXXX",0)')

Demo

Maskelenmiş alanlardan oluşan bir tablo oluşturup, örnek kayıtlar ekliyorum.

CREATE TABLE Customer (
Id INT IDENTITY PRIMARY KEY,
FirstName VARCHAR(100),
LastName VARCHAR(100) NOT NULL,
Gender CHAR(1) MASKED WITH (FUNCTION = 'default()') NULL, 
IdentityNumber INT MASKED WITH (FUNCTION = 'random(1,1000000000)') NOT NULL,
BirthDate DATE MASKED WITH (FUNCTION = 'default()') 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,"****",0)') NULL,
Createdate DATETIME DEFAULT GETDATE() NOT NULL)


INSERT INTO Customer (FirstName,LastName,Gender,IdentityNumber,BirthDate,Phone,Email,CreditCardNumber)
VALUES
('Gail','Erickson','F',295847284,'1984-07-25','905006970142','gail.erickson@mail.com','11111985451507'),
('Jossef','Goldberg','M',245797967,'1988-11-19','905008190175','jgoldberg@mail.com','33336866065599'),
('Michael','Raheem','M',509647174,'1976-02-10','905002120187','michael_raheem@mail.com','11115274414475'),
('Diane','Margheim','M',112457891,'1990-05-17','905006120100','diane101@mail.com','77779803886862'),
('Dylan','Miller','M',695256908,'07-02-1980','905551230000','millerdylan@mail.com','55554195847998')

Tablomuzun çıktısı aşağıdaki gibidir. Kullanıcım sysadmin yetkisine sahip olduğu için maskeli alanları açık bir şekilde görebiliyorum.

Şimdi bir kullanıcı oluşturup bir de onunla kontrol edelim.

CREATE USER UserUNMASK WITHOUT LOGIN
GO
GRANT SELECT ON Customer TO UserUNMASK
GO
EXECUTE AS USER = 'UserUNMASK'
GO
SELECT * FROM Customer

Önceki sonuç kümesi ile kıyasladığımızda tablomuzdaki verilerin alan tiplerine ve maskeleme metotlarına göre hangi şekillerde maskelendiğini rahatça görebiliyoruz.

sysadmin veya db_owner yetkilerine sahip olmayan kullanıcılar default olarak maskeli alanları göremeyeceklerdir. Bu sebeple canlı ortamlarda maskeleme işlemi uygulamadan önce uygulama kullanıcılarına UNMASK yetkisi verilmesi tavsiye edilir.

Şimdi de var olan tablomuzun bir kolonuna maskeleme işlemi uygulayalım ve ardından yetkisiz olan UserUNMASK kullanıcımızla tabloya tekrar göz atalım.

ALTER TABLE Customer
ALTER COLUMN FirstName ADD MASKED WITH (FUNCTION = 'partial(1,"***",1)')
ALTER TABLE Customer
ALTER COLUMN LastName ADD MASKED WITH (FUNCTION = 'partial(1,"*********",1)')

Çok hızlı bir şekilde verilerimizi daha güvenli hale getirip maskeleme işlemlerimizi yapabiliyoruz. Şimdi de kolon üzerinde var olan maskelemeyi nasıl kaldıracağımıza bakalım.

ALTER TABLE Customer
ALTER COLUMN LastName DROP MASKED

Son olarak da kullanıcıya maskeli alanları görebilmesi için UNMASK yetkisi vereceğim.

GRANT UNMASK TO UserUNMASK

Yetki vermek, geri almak veya yasaklamak için kullanabilinecek komutlara ve daha fazlasına bu makalemden ulaşabilirsiniz.

Maskeleme hakkında bilinmesi gerekenler

  • Maskelenmiş veriler (UNMASK yetkisi olmayan kullanıcı tarafından) SELECT INTO veya INSERT INTO komutları kullanılarak aktarılmak istendiğinde, veriler maskelenmiş şekilde aktarılacaktır.
    * Aynı durum SQL Server Export ve Import aracı kullanıldığında da geçerlidir.
  • WRITE yetkisi bulunan kullanıcılar UNMASK yetkisi olmasa bile maskelenmiş alanlar üzerinde değişiklik yapabilirler.
  • Kullanıcıya verilen UNMASK yetkisi veritabanı bazında uygulanmaktadır. Kolon bazlı yetkilendirme işlemi yapılamamaktadır.

Yorum Gönderin

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

This site uses Akismet to reduce spam. Learn how your comment data is processed.