Merhaba
Bu seride şu ana kadar TDE’nin ne olduğunu, tek bir veritabanına nasıl uygulandığını ve şifreli bir veritabanının Always On Availability Group’a nasıl eklendiğini ele aldık. Bu yazıda iki yaygın operasyonel senaryoya odaklanıyoruz: halihazırda bir Availability Group içinde çalışan bir veritabanını sonradan şifrelemek ve süresi dolmak üzere olan TDE sertifikasını Always On ortamında yenilemek (rotasyon).
Bu yazı, TDE temellerini ve Always On üzerinde sertifika taşıma mantığını bildiğinizi varsayar. Ortam bilgileri önceki yazılarla aynıdır:
- Birincil Replika (Primary):
W25SQL25NOD1 - İkincil Replika (Secondary):
W25SQL25NOD2 - AG Grubu:
SQL25HAG - Veritabanı:
BAKICUBUK_DB2(grupta halihazırda şifresiz çalışıyor) - TDE Sertifikası:
BAKICUBUK_DB2_TDE_Cert
İşlemlere başlamadan önce: Hangi node’un Primary hangisinin Secondary olduğunu doğrulayın. Roller bir failover sonrasında yer değiştirmiş olabilir:
Her iki node’da da çalıştırın:
SELECT
ag.name AS AG_Name,
ar.replica_server_name,
ars.role_desc
FROM sys.availability_groups ag
JOIN sys.availability_replicas ar ON ag.group_id = ar.group_id
JOIN sys.dm_hadr_availability_replica_states ars
ON ar.replica_id = ars.replica_id;
GO
W25SQL25NOD1 (Primary) üzerindeki komut çıktısı:

W25SQL25NOD2 (Secondary) üzerindeki komut çıktısı:

Bölüm 1: Mevcut Bir AG Veritabanına TDE Uygulamak
Şifreli bir veritabanını gruba eklemek yerine, çoğu zaman zaten grupta çalışan bir veritabanını sonradan şifrelemek istersiniz. Bu senaryonun avantajı şudur: anahtar altyapısını (master key ve sertifika) her iki replikada bir kez kurduktan sonra, yalnızca DEK oluşturup şifrelemeyi açmanız yeterlidir. Veritabanı zaten grup içinde olduğundan ayrıca “gruba ekleme” adımına gerek kalmaz.
Adım 1: Anahtar Altyapısını Kurma
Bu senaryoda, grupta halihazırda şifresiz olarak çalışan BAKICUBUK_DB2 veritabanını şifreleyeceğiz ve bunun için BAKICUBUK_DB2_TDE_Cert adında yeni bir sertifika kullanacağız. Devam etmeden önce her iki replikada da master key ve bu sertifikanın bulunması gerekir.
1a. Birincil replika – Master Key (yoksa oluşturun):
İnstance üzerinde zaten bir master key varsa (örneğin daha önce başka bir TDE veritabanı için oluşturduysanız) bu adımı atlayın:
W25SQL25NOD1 (Primary) üzerinde
USE master;
GO

Mevcut master key kontrolü (boş dönerse yoktur)
SELECT * FROM sys.symmetric_keys WHERE name = '##MS_DatabaseMasterKey##';
GO
Hatırlatma: Bu seriyi baştan takip ediyorsanız, master key’i
W25SQL25NOD1üzerinde büyük olasılıkla Always On üzerinde TDE yapılandırması yazısında zaten oluşturmuştunuz. Bu durumda yukarıdaki kontrol sorgusu bir satır döner veCREATE MASTER KEYadımını atlarsınız.
Master key zaten varsa: İnstance üzerinde bir Database Master Key zaten varsa (Örneğin BAKICUBUK_DB1 için daha önce oluşturduysanız) yeni bir tane oluşturmayın bir instance’ta yalnızca bir master key bulunur ve aynı master key o instance’taki tüm sertifikaları korur. Bu durumda yukarıdaki CREATE MASTER KEY satırını atlayıp doğrudan sertifika oluşturma adımına (1b) geçin. Yalnızca şu iki noktaya dikkat edin: mevcut master key’in parolasını bildiğinizden ve bir yedeğinin (BACKUP MASTER KEY) alınmış olduğundan emin olun. Bu ikisi, felaket kurtarma ve sunucu taşıma senaryolarında gereklidir. Aynı durum ikincil replika (1d) için de geçerlidir.

Yoksa W25SQL25NOD1 (Primary) üzerinde oluşturun
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'Str0ng!MasterKey#TDE2026';
GO
Master key zaten varsa: İnstance üzerinde bir Database Master Key zaten varsa (örneğin
BAKICUBUK_DB1için daha önce oluşturduysanız) yeni bir tane oluşturmayın bir instance’ta yalnızca bir master key bulunur ve aynı master key o instance’taki tüm sertifikaları korur. Bu durumda yukarıdakiCREATE MASTER KEYsatırını atlayıp doğrudan sertifika oluşturma adımına (1b) geçin. Yalnızca şu iki noktaya dikkat edin: mevcut master key’in parolasını bildiğinizden ve bir yedeğinin (BACKUP MASTER KEY) alınmış olduğundan emin olun. Bu ikisi, felaket kurtarma ve sunucu taşıma senaryolarında gereklidir. Aynı durum ikincil replika (1d) için de geçerlidir.
1b. Birincil replika – Sertifika oluşturma.
W25SQL25NOD1 (Primary) üzerinde
USE master;
GO
CREATE CERTIFICATE BAKICUBUK_DB2_TDE_Cert
WITH SUBJECT = 'TDE Certificate for BAKICUBUK_DB2',
EXPIRY_DATE = '2031-12-31';
GO

1c. Birincil replika – Sertifikayı yedekleme.
Şifrelemeyi açmadan önce sertifikayı ve özel anahtarını yedekleyin; bu dosyalar ikincil replikaya taşımak için de gereklidir. C:\TDE_Backup klasörünün diskte var olduğundan emin olun:
W25SQL25NOD1 (Primary) üzerinde
USE master;
GO
BACKUP CERTIFICATE BAKICUBUK_DB2_TDE_Cert
TO FILE = 'C:\TDE_Backup\BAKICUBUK_DB2_TDE_Cert.cer'
WITH PRIVATE KEY (
FILE = 'C:\TDE_Backup\BAKICUBUK_DB2_TDE_Cert.pvk',
ENCRYPTION BY PASSWORD = 'Cert!PrivKey#Str0ngTDE2026'
);
GO

1d. İkincil replika – Master Key (yoksa oluşturun). Tıpkı birincil replikada olduğu gibi, önce W25SQL25NOD2 üzerinde master key olup olmadığını kontrol edin; boş dönerse oluşturun, doluysa bu adımı atlayın:
W25SQL25NOD2 (Secondary) üzerinde
USE master;
GO

Mevcut master key kontrolü (boş dönerse yoktur)
SELECT * FROM sys.symmetric_keys WHERE name = '##MS_DatabaseMasterKey##';
GO
Hatırlatma:
W25SQL25NOD2üzerindeki master key’i de daha önce Always On üzerinde TDE yapılandırması yazısında oluşturmuştuysanız, kontrol sorgusu bir satır döner ve bu adımı atlarsınız.

Yoksa oluşturun
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'Str0ng!MasterKey#TDE2026';
GO
Hatırlatma:
W25SQL25NOD2üzerindeki master key’i de daha önce Always On üzerinde TDE yapılandırması yazısında oluşturmuştuysanız, kontrol sorgusu bir satır döner ve bu adımı atlarsınız.
1e. İkincil replika – Sertifikayı dosyadan oluşturma.
Birincil replikada üretilen .cer ve .pvk dosyalarını W25SQL25NOD2 sunucusundaki C:\TDE_Backup klasörüne kopyalayın. Parolanın, 1c’de kullandığınızla aynı olması gerekir:
W25SQL25NOD2 (Secondary) üzerinde
USE master;
GO
CREATE CERTIFICATE BAKICUBUK_DB2_TDE_Cert
FROM FILE = 'C:\TDE_Backup\BAKICUBUK_DB2_TDE_Cert.cer'
WITH PRIVATE KEY (
FILE = 'C:\TDE_Backup\BAKICUBUK_DB2_TDE_Cert.pvk',
DECRYPTION BY PASSWORD = 'Cert!PrivKey#Str0ngTDE2026'
);
GO

1f. Doğrulama – thumbprint karşılaştırma.
Her iki node’da aşağıdaki sorguyu çalıştırın; thumbprint değerleri birebir aynı olmalıdır:
SELECT name, thumbprint
FROM sys.certificates
WHERE name = 'BAKICUBUK_DB2_TDE_Cert';
GO
W25SQL25NOD1 (Primary) üzerindeki komut çıktısı:

W25SQL25NOD2 (Secondary) üzerindeki komut çıktısı:

Adım 2: Primary Üzerinde DEK Oluşturma ve Şifrelemeyi Açma
Anahtar altyapısı hazırsa, Primary replika üzerinde DEK oluşturup şifrelemeyi etkinleştirin:
W25SQL25NOD1 (Primary) üzerinde
USE BAKICUBUK_DB2;
GO
CREATE DATABASE ENCRYPTION KEY
WITH ALGORITHM = AES_256
ENCRYPTION BY SERVER CERTIFICATE BAKICUBUK_DB2_TDE_Cert;
GO
ALTER DATABASE BAKICUBUK_DB2 SET ENCRYPTION ON;
GO
DEK ve sertifika her iki replikada mevcut olduğundan, şifreleme otomatik olarak ikincil replikaya da yansır. Ayrıca bir ekleme/restore işlemine gerek yoktur.

Adım 3: Şifreleme Durumunu İzleme
Şifreleme ilerlemesini izleyin; encryption_state değeri 3 olduğunda tamamlanmıştır:
SELECT
DB_NAME(database_id) AS DatabaseName,
encryption_state,
percent_complete
FROM sys.dm_database_encryption_keys;
GO
Not: İlk şifreleme, veritabanının tüm sayfalarının yeniden yazılmasını gerektirdiğinden veritabanı boyutuna bağlı olarak zaman alır, birkaç GB’lık bir veritabanında dakikalar, çok büyük veritabanlarında saatler sürebilir. İlerlemeyi
percent_completesütunundan takip edebilirsiniz. Bu süre boyunca veritabanı çevrimiçi kalır ve Always On senkronizasyonu sürer; şifreleme yükü ek I/O oluşturacağından işlemi yoğun olmayan saatlerde başlatmanız önerilir. Ayrıca büyük bir veritabanının ilk şifrelemesi transaction log’unu büyütüp replikalar arasındaki log gönderimini (log send queue) artırabilir; senkronizasyon gecikmesini bu sırada izlemekte fayda vardır.

Adım 4: Doğrulama
Şifreleme tamamlandıktan sonra hem senkronizasyonun sağlıklı olduğunu hem de veritabanının her iki replikada şifreli olduğunu doğrulayın:
Senkronizasyon durumu
SELECT
ag.name AS AG_Name,
DB_NAME(drs.database_id) AS DatabaseName,
ar.replica_server_name,
drs.synchronization_state_desc,
drs.is_suspended
FROM sys.dm_hadr_database_replica_states drs
JOIN sys.availability_replicas ar ON drs.replica_id = ar.replica_id
JOIN sys.availability_groups ag ON drs.group_id = ag.group_id;
GO
synchronization_state_desc değeri SYNCHRONIZED ve is_suspended = 0 olmalıdır. Dilerseniz bir failover testiyle şifreli veritabanının yeni Primary üzerinde de sorunsuz açıldığını doğrulayabilirsiniz (failover adımları “Always On üzerinde TDE” yazısında ayrıntılı olarak anlatılmıştır).

Bölüm 2: Always On Üzerinde Sertifika Rotasyonu
TDE sertifikalarının bir geçerlilik süresi vardır ve süre dolmadan önce yenilenmesi (rotasyon) iyi bir pratiktir. Süresi dolmuş bir sertifika veritabanının çalışmasını engellemez, ancak yeni yedekler için güncel bir sertifika bulundurmak güvenlik ve operasyonel süreklilik açısından önemlidir.
Always On ortamında rotasyonun tek sunucudan farkı şudur: yeni sertifikanın da, tıpkı ilk kurulumdaki gibi, ikincil replikalara taşınması gerekir. Aksi halde failover sonrasında yeni Primary, yeni sertifikayı bulamaz.
Bu bölümde, Bölüm 1’de BAKICUBUK_DB2 için oluşturduğumuz BAKICUBUK_DB2_TDE_Cert sertifikasını yeni bir sertifikayla değiştireceğiz. Önce mevcut sertifikaların bitiş tarihini kontrol edin:
SELECT name, subject, expiry_date
FROM sys.certificates
WHERE pvt_key_encryption_type = 'MK';
GO
Adım 1: Birincil Instance — Yeni Sertifika Oluşturma ve Yedekleme
W25SQL25NOD1 (Primary) üzerinde
USE master;
GO
CREATE CERTIFICATE BAKICUBUK_DB2_TDE_Cert_New
WITH SUBJECT = 'TDE Certificate Rotation 2026',
EXPIRY_DATE = '2031-12-31';
GO
BACKUP CERTIFICATE BAKICUBUK_DB2_TDE_Cert_New
TO FILE = 'C:\TDE_Backup\BAKICUBUK_DB2_TDE_Cert_New.cer'
WITH PRIVATE KEY (
FILE = 'C:\TDE_Backup\BAKICUBUK_DB2_TDE_Cert_New.pvk',
ENCRYPTION BY PASSWORD = 'NewCert!PrivKey#TDE2026'
);
GO
Adım 2: İkincil Instance — Yeni Sertifikayı Oluşturma
.cer ve .pvk dosyalarını W25SQL25NOD2‘ye kopyalayın ve yeni sertifikayı orada oluşturun. Parolanın, Adım 1’de kullandığınızla aynı olması gerekir:
W25SQL25NOD2 (Secondary) üzerinde
USE master;
GO
CREATE CERTIFICATE BAKICUBUK_DB2_TDE_Cert_New
FROM FILE = 'C:\TDE_Backup\BAKICUBUK_DB2_TDE_Cert_New.cer'
WITH PRIVATE KEY (
FILE = 'C:\TDE_Backup\BAKICUBUK_DB2_TDE_Cert_New.pvk',
DECRYPTION BY PASSWORD = 'NewCert!PrivKey#TDE2026'
);
GO
Adım 3: Birincil Instance — DEK’i Yeni Sertifikaya Döndürme
W25SQL25NOD1 (Primary) üzerinde
USE BAKICUBUK_DB2;
GO
ALTER DATABASE ENCRYPTION KEY
ENCRYPTION BY SERVER CERTIFICATE BAKICUBUK_DB2_TDE_Cert_New;
GO
Değişikliğin uygulandığını, DEK’in artık yeni sertifikaya bağlı olduğunu doğrulayın:
SELECT
DB_NAME(database_id) AS DatabaseName,
c.name AS CertificateName,
c.expiry_date
FROM sys.dm_database_encryption_keys dek
JOIN sys.certificates c ON dek.encryptor_thumbprint = c.thumbprint;
GO
Adım 4: Doğrulama ve Failover Testi
AG’nin sağlıklı olduğunu doğrulayın ve bir failover testiyle yeni sertifikanın ikincil replikada da geçerli olduğunu (yani failover sonrası veritabanının açılabildiğini) teyit edin. Failover adımlarının ayrıntısı “Always On üzerinde TDE yapılandırması” yazısındadır.
Önemli: Eski sertifikayı hemen silmeyin. Rotasyondan önce alınmış şifreli yedekleri geri yükleyebilmek için eski sertifikanın bir süre daha saklanması gerekir. Yeni sertifika yalnızca rotasyon sonrası alınan yedekler için kullanılır. Eski sertifikayı, ona bağlı tüm yedeklerin saklama süresi (retention) dolduktan sonra temizlemeyi düşünebilirsiniz.
Sonuç
Bu yazıda, gerçek hayatta en sık karşılaşılan iki Always On + TDE operasyonunu ele aldık: mevcut bir grup veritabanını yerinde şifrelemek ve süresi dolan sertifikayı kesintisiz biçimde yenilemek. Her iki senaryoda da altın kural aynıdır: anahtar ve sertifika, tüm replikalarda tutarlı olmalıdır. Bir sonraki (ve serinin son) yazısında, TDE’yi güvenli biçimde devre dışı bırakmayı ve arkasında kalan anahtar yapısını temizlemeyi ele alacağız.
Başka bir yazımızda görüşmek dileğiyle…