Dynamic Data Masking(DDM) ile Hassas Verilerinize Erişimi Kısıtlayın

14 Kas by NURULLAH ÇAKIR

Dynamic Data Masking(DDM) ile Hassas Verilerinize Erişimi Kısıtlayın

Dynamic Data Masking SQL Server 2016 ile gelen bir özelliktir. Dynamic Data Masking ile yetkisiz kişilerin hassas verilerinize erişimini kısıtlayabilirsiniz.

 

SQL Server 2016 ile Microsoft verilerimizin güvenliği ile ilgili ciddi yenilikler sundu. Bunlardan öne çıkan iki özellik olarak Always Encrypted ve Row-Level Security kavramlarını aşağıdaki makalelerde bulabilirsiniz.

 

Always Encrypted Nedir ve Nasıl Kullanılır?“,

Row-Level Security ile Satır Bazında Kısıtlama

 

DDM ile verinin veritabanındaki halini update etmiş olmuyoruz. Sadece kritik kolonlarımızın select yetkisi olan kişilere bile görünmemesi için bir işlem uygulamış oluyoruz. Kritik kolonları görme ihtiyacı olan kullanıcılar için ekstra yetki verilmesi gerekiyor. Makalenin ilerleyen bölümlerinde scriptleri paylaşacağım.

 

Bu özellik gelmeden önce Column Level Encrypted ile de kolon seviyesinde şifreleme yapabiliyorduk. “Kolon Seviyesinde Şifreleme(Column Level Encryption)” isimli makalede detayları bulabilirsiniz.  İki makaleyi de okuyarak aradaki farkları anlayabilirsiniz.

 

Bir örnek yaparak devam edelim. Bir müşteri tablomuz olsun. Bu tabloda müşterinin TCKimlik numarası, email adresi, cep telefonu ve doğum tarihi gibi kritik bilgiler olsun. Müşteri temsilcisinin bu bilgileri görmesini istemeyebilirsiniz. Böyle bir durumda DDM’i kullanmak faydalı olacaktır.

 

DDM ile veriyi 4 farklı şifreleme methoduyla şifreleyebiliriz.

 

Default: Bu maskeleme yöntemi, maskelenecek kolonun veri tipine göre bir maskeleme yapılmasını sağlar.

 

Kolon binary, varbinary, image gibi bir veri tipiyse tek byte’lık 0 değeri ile maskeleme yapılır.

 

Date tipindeki veriler için 01.01.1900 00:00:00.0000000 değeri kullanılır.

 

String tipindeki veriler için XXXX değerini kullanır.

 

Numeric tipindeki veriler için boş bir değer kullanır.

 

Random: Numeric tipindeki verileri, random fonksiyonu ile belirtilen aralıktaki rastgele bir sayı değeri ile değiştirir.

 

Email: Email’in sadece ilk harfini alarak geri kalanını “XXX@XXXX.com” şeklinde şifreler.

 

Custom: Kendi şifreleme methodumuzla şifrelememize olanak verir. Örnek üzerinde nasıl kullanılacağını göstereceğmi

 

 

Aşağıdaki script ile tablomuzu oluşturarak içine birkaç örnek kayıt girelim. Bilgiler tamamen rastgele girilmiştir. Oradaki telefon numaralarını aramamalısınız. 🙂

CREATE TABLE [dbo].[Musteri](
[TCKimlikNo] [char](11) NULL,
[AdSoyad] [varchar](200) NULL,
[Email] [varchar](200) NULL,
[Telefon] [char](11) NULL,
[UrunBilgisi] [varchar](500) NULL,
[DogumTarihi] [datetime] NULL,
[CocukSayisi] [smallint] NULL
) ON [PRIMARY]
GO

USE [test]
GO

INSERT INTO [dbo].[Musteri]([TCKimlikNo],[AdSoyad],[Email],[Telefon],[UrunBilgisi],[DogumTarihi],[CocukSayisi])
   VALUES (16985463254, 'Nurullah ÇAKIR','nurullahcakir@gmail.com','09991111111','Mont','1980-01-01',2),
          (16985463255, 'Hakan GÜRBAŞLAR','hakangurbaslar@gmail.com','09992222222','Pantolon','1980-01-01',1),
          (16985463256, 'Faruk ERDEM','farukerdem@gmail.com','09993333333','Gömlek','1990-01-01',0)

 

Tablomuza select çektiğimizde aşağıdaki gibi bir sonuç gelecektir.

 

 

Default methodu ile TCKimlikNo kolonunu aşağıdaki script yardımıyla maskeleyelim.

ALTER TABLE Musteri 
ALTER COLUMN TCKimlikNo char(11) MASKED WITH (FUNCTION = 'default()');

 

Tablomuza tekrar select çektiğimizde yine tüm verileri şifrelenmemiş olarak göreceğiz. Çünkü sysadmin ve db_owner hakkına sahip kullanıcılar için bu işlem geçersiz.

 

Bir login oluşturalım ve veritabanında db_datareader yetkisi verelim. Daha sonra da bu login ile bu tabloya select çekmeyi deneyelim. “Login oluşturmak ve yetkilendirmek” isimli makaleden faydalanabilirsiniz.

 

Login’e db_datereader yetkisi vermek yerine GRANT ile de aşağıdaki şekilde yetkilendirebilirsiniz.

 

GRANT SELECT ON dbo.Musteri TO DDMUser

 

Aşağıda gördüğünüz gibi db_datareader hakkına sahip kullanıcı verileri maskelenmiş halde görüyor.

 

 

Email methodu ile aşağıdaki gibi maskeleyelim ve DDMUser ile tabloya tekrar select çekelim.

ALTER TABLE Musteri 
ALTER COLUMN Email varchar(200) MASKED WITH (FUNCTION = 'Email()');

 

Gördüğünüz gibi Email kolonunda sadece baş harfleri alarak geri kalanını “XXX@XXXX.com” şeklinde maskeledi.

 

 

Random methodu ile  CocukSayisi kolonunu aşağıdaki script yardımıyla maskeleyelim. Belirtilen kolonu 10 ile 30 arasında rastgele bir değer ile değiştiriyor.

 

ALTER TABLE Musteri 
ALTER COLUMN CocukSayisi smallint MASKED WITH (FUNCTION = 'random(10,30)');

 

Aşağıda gördüğünüz gibi Faruk evli olmamasına rağmen 26 çocuğu varmış gibi görünüyor. 🙂

 

 

Custom methodu ile AdSoyad kolonunu aşağıdaki script yardımıyla maskeleyelim. Bu yöntemle önce ilk 2 harfini sonra XXXX değerini, son olarak’ta son 2 harfini alarak maskeliyor.

 

ALTER TABLE Musteri 
ALTER COLUMN AdSoyad varchar(200) MASKED WITH (FUNCTION = 'partial(2,"XXXX",2)');

 

 

Sysadmin veya db_owner hakkına sahip olmayan bir kullanıcıya aşağıdaki script yardımıyla maskelenmiş verinin orijinal halini görme yetkisini verebiliriz.

 

GRANT UNMASK TO DDMUser

 

Aşağıdaki script yardımıyla da bu yetkiyi geri alabiliriz.

 

REVOKE UNMASK TO DDMUser

Tablo üzerindeki maskelemeyi aşağıdaki script yardımıyla kaldırabiliriz.

 

ALTER TABLE Musteri
ALTER COLUMN CocukSayisi DROP MASKED;

Maskeleme işlemlerini gerçekleştirebilmek için  ALTER ANY MASK yetkisine ihtiyacımız var. Veritabanına sağ tıklayarak properties dedikten sonra permission sekmesinden spesifik kullanıcılar için verilebilir.

Loading

One Comments “Dynamic Data Masking(DDM) ile Hassas Verilerinize Erişimi Kısıtlayın

  1. Emeğinize sağlık, internette gördüğüm en sade en anlaşılır anlatımlardan birisi olmuş. Çok işime yaradı teşekkür etmek istedim.

Bir yanıt yazın

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