SQL Server 2022 Security: Ledger’ı Biliyor Musunuz?
Güvenlik açısından, SQL Server’ın son sürümü olan SQL Server 2022’nin Ledger adlı bir özelliğe sahip olduğunu muhtemelen duyuyor veya görüyorsunuzdur.
Azure’da zaten kullanılıyor ancak Ledger nedir?
2 noktada şunu söyleyebiliriz:
- Ledger ve geçmiş veriler şeffaf bir şekilde yönetilir ve herhangi bir uygulama değişikliği olmadan koruma sunar. Bu özellik, denetim, adli tıp ve diğer amaçlar için SQL sorgularını desteklemek üzere geçmiş verileri ilişkisel bir biçimde tutar.
- Ledger ayrıca verilerin veritabanı veya sistem yöneticileri de dahil olmak üzere herhangi bir saldırgandan veya yüksek ayrıcalıklı kullanıcıdan korunmasıdır.
Microsoft, bizlere Ledger’ın nasıl çalıştığını anlatan bir şema paylaştı;
Tablonuzda herhangi bir değişiklik yapılırsa (DELETE,UPDATE), önceki değer history tablosuna gider.
Kullanılan teknoloji blockchaindir. Her kayıt şifrelenir ve önceki blok şifrelenir ve bir timestap(zaman damgası) bulunur.
Bu makalede , sadece şifreli taraf olmadan nasıl çalıştığını açıklayacağım.
İlk adımlarımıza başlayalım
LEDGER = ON seçeneğiyle doğrudan bir veritabanı oluşturuyoruz.
CREATE DATABASE [test_ledger]
CONTAINMENT = NONE
ON PRIMARY
( NAME = N'Product', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\DATA\test_ledger.mdf' , SIZE = 8192KB , MAXSIZE = UNLIMITED, FILEGROWTH = 65536KB )
LOG ON
( NAME = N'Product_log', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\DATA\test_ledger_log.ldf' , SIZE = 8192KB , MAXSIZE = 2048GB , FILEGROWTH = 65536KB )
WITH CATALOG_COLLATION = DATABASE_DEFAULT, LEDGER = ON
GO
Etkinleştirilip etkinleştirilmediğini sys.databases ile kolayca görebilirsiniz.
select name, is_ledger_on from sys.databases
OFF durumuna getirmek istediğimde ALTER database yapmaya çalışıyorum fakat bu noktada hata alıyorum.
Bu işlemden sonra, syntax bulunduran bir temporal tablosu oluşturuyorum ve ledger syntax ekliyorum:
CREATE TABLE [test_table_ledger]
(
Id int not null primary key clustered,
test1 varchar(10) NOT NULL,
test2 varchar(10) NOT NULL
)
WITH
(
SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.test_table_ledger_hist),
LEDGER = ON
)
SQL Server 2022’de görebileceğiniz gibi, tablo Updatable Ledger olarak tablolar kısmını gelmiştir ve ilişkili bir History tablosu vardır.
Bu 2 tabloya bir göz atacak olursak içlerinin boş olduğunu göreceğiz:
Tabloya 5 adet değer ekliyorum;
Insert işlemi yapıldığında değişiklik olmayacaktır, History tablosu mantıksal olarak boş gelecektir.
Şimdi, ilk satırı basit bir değişkenle güncellemesini yapacağım:
Gördüğünüz gibi, History tablosu eski değere sahip ve test_table_ledger tablosu yeni değerle güncellenmiştir.
Microsoft, Ledger view’i history tablosu için kullanmalı şeklinde öneriyor, doğrudan history tablosu için değil.
3 tane view ile bunları görmek mümkündür.
İlki sys.database_ledger_transactions ve bu makalede bunu ele alacağız.
Bu view bize veritabanı transaction geçmişini verir:
Özet geçecek olursak, Ledger aracılığıyla tablomun + _Ledger adıyla yeni bir view oluşturulur.
Bu durumda transaction türünü kolayca görebilirsiniz
Bu son view ve sys.database_ledger_transactions, işlemlerini yapabiliyorsunuz.
Benim oluşturduğum case’de 6 tane INSERT 1 tane de DELETE işlemi gözükmektedir.
select dlt.commit_time, dlt.principal_name, test.id,test.test1, test.test2, test.ledger_operation_type_desc
from test_table_ledger_Ledger test join sys.database_ledger_transactions dlt on test.ledger_transaction_id = dlt.transaction_id
Ledger konusunu kısaca ele aldık daha birçok detay bulunmaktadır. Bir sonraki makalede görüşmek üzere.
Sizlere faydalı olmasını dilerim…
Referanslar