Merhaba
Bu seride TDE’nin (Transparent Data Encryption) tüm yaşam döngüsünü ele aldık: ne olduğunu, tek bir veritabanına ve Always On grubuna nasıl uygulandığını, mevcut bir grup veritabanının nasıl şifrelendiğini ve sertifikanın nasıl döndürüldüğünü, son olarak da tek bir veritabanında TDE’nin nasıl kapatıldığını gördük. Bu son yazıda ise en dikkat gerektiren senaryoyu ele alıyoruz: bir Availability Group içindeki veritabanında TDE’yi güvenli biçimde devre dışı bırakmak.
Tek sunucudaki mantık burada da geçerlidir, ancak kritik bir fark vardır: şifre çözme işleminin tüm replikalarda tamamlandığını doğrulamadan bir sonraki adıma geçemezsiniz. Aksi halde ikincil replika tutarsız duruma düşebilir.
Önce yedek alın: Şifrelemeyi kapatmadan önce veritabanının güncel bir tam yedeğini (full backup) alın ve sertifikanın/özel anahtarının yedeğinin elinizde olduğundan emin olun. Eski şifreli yedekleri geri yüklemek için bunlara ihtiyacınız olabilir.
TDE Kapatılırken Ne Olur?
ALTER DATABASE ... SET ENCRYPTION OFF komutu şifrelemeyi anında kaldırmaz; SQL Server veritabanının tüm sayfalarını arka planda yeniden yazarak şifreyi çözer. Always On ortamında bu işlem hem Primary hem de tüm ikincil replikalarda gerçekleşir. İşlem tamamlanana kadar veritabanı çevrimiçi kalır. Durumu sys.dm_database_encryption_keys görünümündeki encryption_state değerinden takip ederiz; bu değer 1 olduğunda (şifresiz) işlem tamamlanmıştır.
Temel kural şudur: Şifrelemeyi yalnızca Primary üzerinde kapatırsınız; değişiklik otomatik olarak tüm replikalara yayılır. Ancak DEK’i düşürmeden önce, şifre çözmenin tüm replikalarda bittiğini teyit etmeniz gerekir.
Ortam:
- Birincil Replika (Primary):
W25SQL25NOD1 - İkincil Replika (Secondary):
W25SQL25NOD2 - AG Grubu:
SQL25HAG - Veritabanı:
BAKICUBUK_DB2
Adım 1: Rolleri Doğrulama
Her zaman olduğu gibi, önce hangi node’un Primary olduğunu doğrulayın. Roller bir failover sonrasında yer değiştirmiş olabilir; komutları yanlış node’da çalıştırmamak için bu kontrol önemlidir:
Her iki node’da da çalışır:
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ı:
Adım 2: Mevcut Şifreleme Durumunu Kontrol Etme
Şifrelemeyi kapatmadan önce, veritabanının gerçekten şifreli olduğunu ve mevcut durumunu görmek iyi bir pratiktir. Aşağıdaki sorguyu Primary üzerinde çalıştırın:
W25SQL25NOD1 (Primary) üzerinde
SELECT
DB_NAME(database_id) AS DatabaseName,
encryption_state,
percent_complete,
key_algorithm,
key_length
FROM sys.dm_database_encryption_keys;
GO
BAKICUBUK_DB2 için encryption_state değeri 3 görünüyorsa veritabanı tam olarak şifrelidir ve devre dışı bırakma işlemine geçebilirsiniz. (Değer 3 dışında bir şeyse örneğin 2 ise şifreleme hala sürüyordur; önce onun bitmesini bekleyin.)
Adım 3: Primary Üzerinde Şifrelemeyi Kapatma
Şifrelemeyi kapatma komutu yalnızca Primary üzerinde çalıştırılır:
W25SQL25NOD1 (Primary) üzerinde
USE master;
GO
ALTER DATABASE BAKICUBUK_DB2 SET ENCRYPTION OFF;
GO
Adım 4: Tüm Replikalarda Şifre Çözmeyi Bekleme
Bu adım, Always On senaryosunun en kritik kısmıdır. Şifre çözmenin hem Primary hem Secondary üzerinde tamamlandığını ayrı ayrı doğrulayın. Aşağıdaki sorguyu her iki node’da da çalıştırın; ikisinde de encryption_state = 1 görülmelidir:
Her iki node’da ayrı ayrı çalıştırın
SELECT
DB_NAME(database_id) AS DatabaseName,
encryption_state,
percent_complete
FROM sys.dm_database_encryption_keys;
GO
encryption_state değerlerinin anlamı: 3 = şifreli, 5 = şifre çözme devam ediyor, 1 = şifre çözme tamamlandı (şifresiz).
Uyarı: Secondary replikada şifre çözme henüz sürerken DEK’i Primary’de düşürürseniz, ikincil replika veritabanı tutarsız duruma düşebilir ve senkronizasyon bozulabilir. Her iki tarafta da
encryption_state = 1görmeden bir sonraki adıma geçmeyin.
W25SQL25NOD1 (Primary) üzerindeki komut çıktısı:
W25SQL25NOD2 (Secondary) üzerindeki komut çıktısı:
Secondary replikada şifre çözme henüz sürerken DEK’i Primary’de düşürürseniz, ikincil replika veritabanı tutarsız duruma düşebilir ve senkronizasyon bozulabilir. Her iki tarafta da encryption_state = 1 görmeden bir sonraki adıma geçmeyin.
Adım 5: DEK Düşürme
Her iki replikada da şifre çözme tamamlandıktan sonra, DEK’i Primary üzerinde düşürün. Değişiklik replikalara otomatik olarak yayılır:
W25SQL25NOD1 (PRIMARY) üzerinde
USE BAKICUBUK_DB2;
GO
DROP DATABASE ENCRYPTION KEY;
GO
Adım 6: Doğrulama
Veritabanının artık şifresiz olduğunu ve AG’nin sağlıklı çalıştığını 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 (veya asenkron modda SYNCHRONIZING) ve is_suspended = 0 olmalıdır. Veritabanı artık grup içinde şifresiz olarak çalışmaktadır.
W25SQL25NOD1 (Primary) üzerindeki komut çıktısı:
W25SQL25NOD2 (Secondary) üzerindeki komut çıktısı:
Adım 7: Sertifika Temizliği (İsteğe Bağlı, Dikkatli Olun)
Şifreleme kaldırıldıktan sonra sertifika ve master key her iki replikada da durur. Bunların silinmesi isteğe bağlıdır ve son derece dikkatli yaklaşılması gereken bir işlemdir.
En kritik uyarı: Sertifikayı silmeden önce, o sertifikayla şifrelenmiş hiçbir eski yedeğinizin (.bak) kalmadığından kesinlikle emin olun. TDE etkinken alınmış yedekler, ilgili sertifika olmadan asla geri yüklenemez. Şüpheye düşerseniz sertifikayı silmeyin; yedeğini güvenli bir arşivde saklayıp instance üzerinde bırakın.
Silmeye karar verirseniz, önce sertifikanın hiçbir DEK tarafından kullanılmadığını doğrulayın. Bu sorgu yalnızca DEK’i olan (şifreli) veritabanlarını listeler; TDE’yi doğru kapattıysanız BAKICUBUK_DB2 artık burada görünmemeli, dolayısıyla BAKICUBUK_DB2_TDE_Cert bu listede yer almamalıdır:
USE master;
GO
SELECT
DB_NAME(dek.database_id) AS DatabaseName,
c.name AS CertificateName
FROM sys.dm_database_encryption_keys dek
JOIN sys.certificates c ON dek.encryptor_thumbprint = c.thumbprint;
GO
Sorgu boş dönüyorsa, sertifikayı her iki replikada da ayrı ayrı silin, çünkü Always On kurulumunda sertifika her node üzerinde ayrı ayrı oluşturulmuştu:
Hem W25SQL25NOD1 (Primary) hem W25SQL25NOD2 (Secondary) üzerinde ayrı ayrı
USE master;
GO
DROP CERTIFICATE BAKICUBUK_DB2_TDE_Cert;
GO
Master key’i silmek çoğu zaman gerekli değildir; aynı master key instance üzerindeki diğer sertifikaları da koruyor olabilir. Emin değilseniz master key’e dokunmayın.
W25SQL25NOD1 (Primary) üzerinde
W25SQL25NOD2 (Secondary) üzerinde
Devre Dışı Bırakma Sonrası Kontrol Listesi
- Veritabanı her iki replikada da
encryption_state = 1durumunda mı (ya da DEK düşürüldüğü için listede hiç görünmüyor mu)? - Always On senkronizasyonu sağlıklı mı? (
SYNCHRONIZED/is_suspended = 0) - Şifre çözme sonrası güncel bir tam yedek aldınız mı? (Artık şifresiz olan yeni bir temel yedek)
- Silmeden önce sakladığınız sertifika yedeği güvenli bir arşivde duruyor mu? (Eski şifreli yedekler için)
- Bir failover testiyle veritabanının yeni Primary üzerinde de şifresiz ve sağlıklı açıldığını doğruladınız mı?
İlk iki maddeyi aşağıdaki iki sorguyla doğrulayabilirsiniz.
Şifreleme durumu: Bu sorguyu hem W25SQL25NOD1 hem W25SQL25NOD2 üzerinde ayrı ayrı çalıştırın:
SELECT
DB_NAME(database_id) AS DatabaseName,
encryption_state
FROM sys.dm_database_encryption_keys;
GO
BAKICUBUK_DB2 bu listede ya encryption_state = 1 ile görünür ya da (DEK düşürüldüğü için) hiç görünmez; ikisi de veritabanının artık şifresiz olduğu anlamına gelir. Instance üzerinde başka şifreli veritabanı da yoksa sorgu tamamen boş dönebilir — bu da normaldir ve tüm şifrelemelerin kaldırıldığını gösterir.
W25SQL25NOD1 (Primary) üzerinde
W25SQL25NOD2 (Secondary) üzerinde
Senkronizasyon durumu: Herhangi bir replikada çalıştırın:
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
BAKICUBUK_DB2 satırında synchronization_state_desc değeri SYNCHRONIZED (asenkron modda SYNCHRONIZING) ve is_suspended değeri 0 olmalıdır. Şifreyi kaldırma işlemi Always On senkronizasyonunu bozmaz; veritabanı şifresiz haliyle replikalar arasında senkron çalışmaya devam eder.
W25SQL25NOD1 (Primary) üzerinde
W25SQL25NOD2 (Secondary) üzerinde
Sonuç
Always On ortamında TDE’yi devre dışı bırakmak, tek sunucudaki işlemin üzerine tek bir kritik kural ekler: şifrelemeyi yalnızca Primary’de kapatın, ama DEK’i düşürmeden önce şifre çözmenin tüm replikalarda tamamlandığını mutlaka doğrulayın. Bu sırayı atladığınızda senkronizasyon bozulabilir. Sertifika temizliğine ise, tıpkı tek sunucuda olduğu gibi, en temkinli biçimde yaklaşın; bir sertifikayı silmek ona bağlı eski yedekleri kalıcı olarak erişilemez kılar. Bu beş yazılık seriyle TDE’nin tüm yaşam döngüsünü kurma, Always On’a taşıma, mevcut veritabanını şifreleme ve rotasyon, ve her iki ortamda kaldırma baştan sona ele almış olduk.
Başka bir yazımızda görüşmek dileğiyle…

