Derinlemesine yazılım eğitimleri için kanalımı takip edebilirsiniz...

SQL Server 2016 – Dynamic Data Masking

Merhaba,
Biliyorsunuz ki, yazılım dünyası her geçen günü bir sonraki günün hızında yaşamayı ve yaşatmayı seven bir dünyadır. Doğal olarak bu hızdan teknolojinin nasibini alması gibi biz developerlarda kendi payımıza düşeni almaktayız. İşte bu makalemizde SQL Server veritabanı yönetim sisteminin güncel 2016 versiyonunun ilk payını konuşuyor olacağız, Dynamic Data Masking özelliğini…

Dynamic Data Masking Nedir?

Adından da anlaşılacağı gibi dinamik veri maskeleme sistemidir. Veritabanımızda, ilişkisel tablolarımızda tuttuğumuz verileri tararken gösterilmesi istenen bilgiler dışındakileri maskeleme özelliğidir. Tabi ki de burada tablodaki bilgiden kastımız kolonlardır. Bir tablo create yahut alter işlemine tabi tutulurken hangi kolonun gizleneceğini artık Dynamic Data Masking özelliğiyle işaretleyebiliyoruz.

Konumuzu pratik olarak desteklemeden önce veri maskeleme kavramını biraz daha açacak, ayriyetten diğer bilmemiz gerekenler üzerinde teorik konuşacağız…

Öncelikle maskeleme kavramının detaylarına girelim. Elimizdeki bir veriyi maskelemeden kastımız, verinin orjinal halini, fiziksel yapısını değiştirmeden kullanıcıya bir kısmını göstermek yahut gizlemektir. Düşünün ki, bir alışveriş sitesinde kayıtlı bir kullanıcının her bilgisine(T.C. Kimlik No, Kredi Kartı Numarası, Telefon No vs.) kritik görevler dışındaki personellerin ulaşması ne kadar istenebilir? Böyle durumda kullanıcının özelini teşkil edecek bilgiler yetkisi olmayan kullanıcılara gösterilmemektedir. İşte burada yetkisi olmayan kullanıcıya karşı yapılandırılmış kısıtlama, aslında ilgili verilerin yokluğu anlamına gelmemekte, bilakis varlar ama gizlenmekte yani hazır konusuyken maskelenmektedirler.

Hatırlarsanız bu güne kadar veritabanı yönetimlerinde yetkiye sahip olmayan kişilerden gizlenecek verileri farklı bir strateji izleyerek gizliyorduk. Yetkisiz kişiye özel bir “View” oluşturuyor, oluşturulan bu view içerisinde ilgili tablonun gizli olmayan kolonları yerleştiriliyor ve çalışmayı gerçekleştirecek yetkisiz kullanıcıya bu view üzerinde sorgulama hakkı veriyorduk. İşte bu uzun ve zahmetli strateji yerine artık SQL Server 2016 ile gelen Dynamic Data Masking özelliği ile hiç yorulmadan aynı işi gerçekleştirebiliyoruz.

Veri maskeleme işlemi bir nevi güvenlik önlemi olsada bir başka açıdan da amaca dönük sorguların gerçekleştirilmesini sağlamaktır. Yani, yetkilendirme sınırı olan yahut sadece ilgili tablo üzerinde select yetkisine sahip olan bir kullanıcının X ile Y bilgilerine erişmesi yeterli lakin Z’ye ihtiyacı yoksa işte veri maskeleme ile bu kullanıcıya sadece X ve Y kolonlarındaki veriler gösterilecek, Z kolonu gizlenecektir. Bu şekilde amaca dönük, net ve kişisine göre lazım ve yeterli olan sorgularda çalışılmış olunacaktır.

Şimdi yavaşça pratik çalışmaya yaklaşırken Dynamic Data Masking özelliğiyle ilgili fonksiyonel parametrelerine değinmekte fayda vardır.

Dynamic Data Masking; default, email, ve partial olmak üzere üç adet fonksiyonel parametre eşliğinde çalışmaktadır.

  • default
    Bu fonksiyonel parametre ile eldeki metinsel veriler XXXX formatında gizlenebilmektedir. Eğer verinin boyutu 4 karakterden daha az ise karakter sayısı kadar X kullanılmakta, veri boyutu 4’ü aştığı vakit maximum 4 adet X kullanılmaktadır. char, nchar, varchar, nvarchar vs. gibi metinsel tipleri desteklemektedir.Sayısal veriler üzerinde 0, tarihsel veriler üzerinde 01.01.2000 00:00:00.0000000 değerleri kullanılmaktadır.Eğer maskelenen veri binary veri ise 0 değerinin ASCII karşılığını kullanmaktadır.
  • email
    E-Maillerde maskeleme işlemini kullanacağımız fonksiyonel parametremizdir.
    Örneğin; “gncy@gencayyildiz.com” mail adresini “gXXX@XXXX.com” formatında maskelemektedir.
  • partial
    Diğer iki formata karşılık kendi özgün formatımızı oluşturmamızı sağlayan fonksiyonel parametredir.
    Aşağıdaki prototipi inceleyiniz.

    Partial(3, H, 2)
    

    Yukarıdaki prototip kullanımında fonksiyonumuza verdiğimiz parametreler soldan sağa sırasıyla; ilk 3 karakterin gizlenmeyeceğini, maskelemede H karakterinin kullanılacağını ve son 2 karakterin de gizlenmeyeceğini belirlemiş oluyoruz.

Artık konumuzla alakalı vermemiz gereken teorik bilgimiz kalmadığına göre pratik olarak makalemize devam edebiliriz.

Öncelikle yukarılarda bahsettiğim gibi Dynamic Data Masking özelliğini yeni oluşturacağımız yahut var olan tablolar üzerinde uygulayabileceğimizi tekrardan hatırlatırım.

Öncelikle Dynamic Data Masking özelliğini bir kolona aşağıdaki prototipte olduğu gibi uygulamaktayız.

CREATE TABLE [TABLO ADI]
(
	[KOLON ADI] [KOLON TİPİ] MASKED WITH (FUNCTION = 'default()')
)

Gördüğünüz gibi kolon adı ve tipini belirledikten sonra “MASKED WITH (FUNCTION = ‘default()’)” komutu ile ilgili kolonu sadece select yetkisine sahip kişiye karşı maskelemiş oluyoruz.

Hadi gelin bu işlemi tam gerçekleştirelim.

CREATE TABLE OGRENCILER
(
	OgrenciID INT PRIMARY KEY IDENTITY,
	Adi NVARCHAR(10) MASKED WITH (FUNCTION = 'default()') NULL,
	SoyAdi NVARCHAR(10) MASKED WITH (FUNCTION = 'default()') NULL,
	Memleketi NVARCHAR(10) MASKED WITH (FUNCTION = 'default()') NULL,
	TCNo int MASKED WITH (FUNCTION = 'default()') NULL,
	Sube NVARCHAR(1) MASKED WITH (FUNCTION = 'default()') NULL,
	EMail NVARCHAR(MAX) MASKED WITH (FUNCTION = 'email()') NULL,
	Hakkinda NVARCHAR(MAX) MASKED WITH (FUNCTION = 'partial(3, "H", 2)') NULL,
	DogumTarihi DATETIME MASKED WITH (FUNCTION = 'default()') NULL
)

Gördüğünüz gibi bu şekilde bir tablo tasarladım ve mümkün mertebe tüm fonksiyonel parametrelerimizi kullanmaya çalıştım. Şimdi tablomuzda çalışmamızın neticesini görebilmemiz için aşağıdaki öğrencileri ekleyelim.

INSERT OGRENCILER VALUES('Gençay', 'Yıldız', 'Artvin', 1234, 'A', 'gncy@gencayyildiz.com', 'Türk Milletine Canım Feda Olsun...', '1992-09-05')
INSERT OGRENCILER VALUES('Gizem', 'Işık', 'Malatya', 1234, 'B', 'gizem@isik.com', 'Ahh O Gözlerinn...', '1975-09-05')

Şimdi bir select sorgusu çalıştıralım.

SELECT * FROM OGRENCILER

SQL Server 2016 - Dynamic Data Masking

Sadece select sorgusuyla yetkilendirilmiş bir kullanıcı ayarlamadığımızdan dolayı maskelenmemiş taze verilerle karşılaştık.

CREATE USER YETKILIUSER WITHOUT LOGIN
GO
GRANT SELECT ON OGRENCILER TO YETKILIUSER

Yukarıdaki gibi istediğiniz isimde bir kullanıcı ayarlayabilir ve “OGRENCILER” tablosuna özel o kullanıcıya sadece select yetkilendirmesi yapabilirsiniz.

EXECUTE AS USER = 'YETKILIUSER'

SELECT * FROM OGRENCILER

Bu şekilde de yetkilendirme yaptığımız kullanıcı ile tekrardan tablomuzu sorgulatıyoruz ve aşağıdaki sonucu elde ediyoruz.
SQL Server 2016 - Dynamic Data Masking

İşte gördüğünüz gibi verilerimiz ayarladığımız şekilde maskelendirilerek gelmektedir.

Şimdi sıra maskeleme işlemi için bir tabloyu güncellemeye geldi.

ALTER TABLE OGRENCILER
ADD EKKOLON NVARCHAR(MAX) MASKED WITH (FUNCTION = 'partial(3, "XXX", 0)')

“OGRENCILER” tablosuna “EKKOLON” isimli bir kolon eklenmekte ve kendi formatımızda maskeleme uygulanmaktadır.

ALTER TABLE OGRENCILER
ALTER COLUMN EKKOLON ADD MASKED WITH (FUNCTION = 'partial(2, "AAA", 4)')

Burdada var olan bir kolon üzerinde maskeleme işlemi yapmış olduk. Sorguya “ADD” komutunun eklendiğine dikkatinizi çekerim.

Şimdi yeniden sorgulama yapalım ve gelen sonucu inceleyelim.

EXECUTE AS USER = 'YETKILIUSER'
SELECT * FROM OGRENCILER

SQL Server 2016 - Dynamic Data Masking

Şimdide var olan maskeyi kaldıralım.

ALTER TABLE OGRENCILER
ALTER COLUMN EKKOLON DROP MASKED

Evet, şimdide tekrardan sorgumuzun sonucuna bakalım.

EXECUTE AS USER = 'YETKILIUSER'
SELECT * FROM OGRENCILER

SQL Server 2016 - Dynamic Data Masking

Gördüğünüz gibi kolonumuzdan maskelemeyi bu şekilde kaldırmış bulunmaktayız. Tabi burada yapmış olduğumuz işlem neticesinde tüm kullanıcılara maskeleme kaldırılmıştır. Eğer ki, maskelemenin istediğiniz kullanıcılarda pasifize edilmesini istiyorsanız ilgili kullanıcıya UNMASKED yetkisini vermelisiniz. Bu işlemide bildiğimiz yetkilendirme işlemiyle gerçekleştirebiliyoruz.

GRANT UNMASK TO YETKILIUSER;

EXECUTE AS USER = 'YETKILIUSER'
SELECT * FROM OGRENCILER

SQL Server 2016 - Dynamic Data Masking

“YETKILIUSER” isimli kullanıcıya verilen UNMASK yetkisi sayesinde görüldüğü gibi kullanıcının select sorgusu neticeleri maskelemeye tabii tutulmamaktadır.

SQL Server 2016’nın yeniliklerinden Dynamic Data Masking özelliğini yeterince detaylandırdığımızı umuyorum. Diğer yeniliklerde görüşmek üzere diyor, bol bol faydalanmanızı diliyorum…

Esen kalın…
İyi çalışmalar…

Bunlar da hoşunuza gidebilir...

1 Cevap

  1. Taner dedi ki:

    Son gün veya son 1 hafta içinde kaydı bulunan kişileri maskelemesin bunu yapmak mümkün müdür ?

Taner için bir yanıt yazın Yanıtı iptal et

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir