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 | Özellikler | Script |
---|---|---|
Default | String veri türleri için XXXX şeklinde, orjinal veri 4 karakterden az ise X tane gözükecek şekilde maskelenir.Veri tipleri : char, nchar, varchar, nvarchar, text, ntext Numeric veri türleri için sıfır (0) olarak maskelenir.Veri tipleri : bigint, bit, decimal, int, money, numeric, smallint, smallmoney, tinyint, float, real Date ve Time veri tipleri için 01.01.1900 00:00:00.0000000 şeklinde maskelenmektedir.Veri tipleri : date, datetime2, datetime, datetimeoffset, smalldatetime, time Binary veri türü için tek bir byte 0 olarak maskelenmektedir.Veri tipleri : binary, varbinary, image | ALTER TABLE [Customer] ALTER COLUMN [Phone] ADD MASKED WITH (FUNCTION = 'default()') |
Email 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()') | |
Random | Veriyi 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 String | Veriyi 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
veyaINSERT 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ılarUNMASK
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.