Bu makalede Hassas olduğunu düşündüğümüz tablonun içindeki verinin kısmi ya da tamamının değiştirilmesi ya da kapatılması konusunu inceleyeceğiz.
Bahsi geçen özellik SQL Server 2016 yılında Microsoft tarafından tanıtıldı. Özellikle ilgili verilerin bazı uygulamalar ya da kullanıcılar tarafından okunmasının sakıncalı olduğu durumlarda bu veriler maskeleyerek gerçekleştirebiliriz. Bu makalede AdventureWorks2017 veri tabanı altında Production.Location tablosu kullanılmıştır.
Başlangıçta daha önce bizden başka birisi burada bu özelliği aktif etmiş ya da kullanıyor olabilir. Hem maskelenmiş kolon var mı hem de burada adım adım giderek nasıl eklendiğini göreceğiz.
Aşağıdaki sorgu ile ilgili veri tabanı üzerinde hangi tabloların hangi kolonlarında maskeleme özelliği var onu aşağıdaki script ile kontrol edebiliriz.
1 2 3 4 5 6 7 8 9 10 11 |
use master select c.name,tbl.name as table_name,c.is_masked , c.masking_function from sys.masked_columns as c join sys.tables as tbl on c.object_id = tbl.object_id where is_masked =1 |
1-)
Eğer tablo yok yeni oluşturuyor isek;
Maskelenmesini istediğimiz kolonları belirleyerek ve bu alanları type’larına göre maskeliyoruz.
Örn. String derğerler için; varchar==>partial, Integer Değerleri için, Int==> random yada default gibi.
Eğer tablo var ise;
Maskeleme yapmak istediğimiz kolona aşağıdaki script ile maskeleme özelliği katıyoruz. Biz aşağıda partial ve random olarak iki kolon için bu özellikleri göreceğiz.
Bunların dışında e-mail ve tarih alanları için ayrıca function kullanılabilir.
1 2 3 |
ALTER TABLE [AdventureWorks2017].[Production].[Location] ALTER COLUMN [Name]ADD MASKED WITH (FUNCTION = 'partial(1,"XXX",0)') ALTER TABLE [AdventureWorks2017].[Production].[Location] ALTER COLUMN [CostRate] ADD MASKED WITH (FUNCTION = 'default()') |
2-)
Eğer kullanıcı yok ise;
Aşağıdaki script ile kullanıcıyı oluşturuyoruz.
Maskeleme yapılmış tabloya oluşturulan kullanıcıda select yetkisi veriyoruz.
1 2 3 |
CREATE USER MaskUser WITHOUT LOGIN; GRANT SELECT ON [AdventureWorks2017].[Production].[Location] TO MaskUser; |
Burada önemli nokta eğer kullanıcı var olan bir kullanıcı ise kullanıcının sysadmin veya dbowner olmamasına dikkat edilmeli aksi takdirde kolon maskelense dahi kullanıcının yetkilerinde dolayı verileri normal hali ile görecektir.
Aşağıdaki script ile oluşturulan ya da var olan kullanıcının veriyi okuyup okuyamadığını test edilebilirsiniz.
1 2 3 |
EXECUTE AS USER = 'MaskUser'; select * from [AdventureWorks2017].[Production].[Location] |
1 2 3 |
revert; select * from [AdventureWorks2017].[Production].[Location] |
Eğer Kullanıcının maskeleme olan tabloda select yetkisi var ise;
Aşağıdaki script ile maskelemeyi aktifleştirebiliriz. Maskeleme aktifleştirildikten sonra aşağıdaki script ile test edebiliriz.
REVERT işlemi ile kullanıcıyı execute as olarak tanımlanan kullanıcıdan önceki kullanıcıya geri alabiliriz. Bu işlem bize eski eski kullanıcımız ile devam etmemizi sağlayacak.
1 2 3 4 5 6 7 |
REVOKE UNMASK TO MaskUser; EXECUTE AS USER = 'MaskUser'; select * from [AdventureWorks2017].[Production].[Location] REVERT; |
Eğer kullanıcının maskeleme olan tabloda verileri maskeli olarak görmesini istemiyor isek;
Aşağıdaki script ile bu özelliği kaldırabiliriz. Maskeleme kaldırdıktan sonra aşağıdaki script test edebiliriz. Aşağıdaki script ile testuser olan kullanıcıyı geri alabiliriz. Bu işlem bize eski eski kullanıcımız ile devam etmemizi sağlayacak.
1 2 3 4 5 6 7 |
GRANT UNMASK TO MaskUser; EXECUTE AS USER = 'MaskUser'; SELECT * FROM [AdventureWorks2017].[Production].[Location] REVERT; |
3-)
Eğer maskelediğimiz bir kolonu kaldırmak ister isek;
1 |
ALTER TABLE [AdventureWorks2017].[Production].[Location] ALTER COLUMN [Name] DROP MASKED; |
*Önemli Bilgiler
1.Maskeleme; Computed Column Üzerinde Çalışmaz.
2.Data Maskeleme yapıldığında Full-Text Index Çalışmaz.