SQL Server 2025’te TDE’yi Devre Dışı Bırakma ve Temizleme

Merhaba

Bu seride önce TDE’nin (Transparent Data Encryption) ne olduğunu ve tek bir veritabanına nasıl uygulandığını, ardından Always On Availability Group üzerinde nasıl yapılandırıldığını ele almıştık. Bu üçüncü ve son yazıda ters yöne gidiyoruz: TDE’yi güvenli biçimde nasıl devre dışı bırakır ve arkasında kalan anahtar/sertifika yapısını nasıl temizleriz? Always On ortamında devre dışı bırakma ise serinin son yazısının konusudur.

TDE’yi kapatmak, açmak kadar dikkat gerektirir. Yanlış sırayla yapılan bir temizlik, eski şifreli yedeklerinizi kurtarılamaz hale getirebilir. Bu yüzden her adımı sırasıyla ve nedenini anlayarak uygulayın.

Önce yedek alın: Şifrelemeyi kapatmadan önce veritabanının güncel bir tam yedeğini (full backup) alın. Ayrıca kullandığınız sertifikanın ve ö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. Bu işlem, tıpkı şifreleme gibi, veritabanının boyutuna bağlı olarak zaman alır ve I/O yükü oluşturur. İşlem tamamlanana kadar veritabanı çevrimiçi kalır ve kullanılabilir.

Şifre çözme durumunu, 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ış demektir.

Bölüm 1: Tek Bir Veritabanında TDE’yi Devre Dışı Bırakma

Bu senaryoda, Always On grubunda olmayan tek bir BAKICUBUK_DB3 veritabanını ele alıyoruz. Devre dışı bırakmayı somut göstermek için önce bu veritabanında TDE’yi kısaca etkinleştirecek, ardından adım adım kapatacağız. Zaten şifreli bir veritabanınız varsa doğrudan “Şifrelemeyi Kapatma” adımından başlayabilirsiniz.

Hazırlık: TDE’yi Etkinleştirme (zaten şifreliyse atlayın)

Aşağıdaki adımlar, BAKICUBUK_DB3 üzerinde TDE’yi hızlıca devreye alır. (Bu adımların ayrıntılı anlatımı serinin ilk yazısındadır.)

Önce mevcut master key olup olmadığını kontrol edin. Sorgu boş dönerse master key yoktur:

USE master;
GO
SELECT * FROM sys.symmetric_keys WHERE name = '##MS_DatabaseMasterKey##';
GO

Master key yoksa oluşturun. (Kontrol sorgusu bir satır döndürdüyse master key zaten vardır; bu adımı atlayın.)

USE master;
GO
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'Str0ng!MasterKey#TDE2026';
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 ve CREATE MASTER KEY adı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.

Ardından veritabanı için sertifikayı oluşturun.

USE master;
GO
CREATE CERTIFICATE BAKICUBUK_DB3_TDE_Cert
    WITH SUBJECT = 'TDE Certificate for BAKICUBUK_DB3',
    EXPIRY_DATE = '2031-12-31';
GO

Sertifikayı yedeklemeyi unutmayın (C:\TDE_Backup klasörü diskte mevcut olmalı):

USE master;
GO
BACKUP CERTIFICATE BAKICUBUK_DB3_TDE_Cert
    TO FILE = 'C:\TDE_Backup\BAKICUBUK_DB3_TDE_Cert.cer'
    WITH PRIVATE KEY (
        FILE = 'C:\TDE_Backup\BAKICUBUK_DB3_TDE_Cert.pvk',
        ENCRYPTION BY PASSWORD = 'Cert!PrivKey#Str0ngTDE2026'
    );
GO

Veritabanında DEK oluştur ve şifrelemeyi aç:

USE BAKICUBUK_DB3;
GO
CREATE DATABASE ENCRYPTION KEY
    WITH ALGORITHM = AES_256
    ENCRYPTION BY SERVER CERTIFICATE BAKICUBUK_DB3_TDE_Cert;
GO

ALTER DATABASE BAKICUBUK_DB3 SET ENCRYPTION ON;
GO

Şifrelemenin tamamlandığını (encryption_state = 3) doğrulayın:

SELECT 
    DB_NAME(database_id) AS DatabaseName,
    encryption_state,
    percent_complete
FROM sys.dm_database_encryption_keys;
GO

encryption_state değerlerinin anlamı: 0 = anahtar yok, 1 = şifresiz, 2 = şifreleme devam ediyor, 3 = şifreleme tamamlandı4 = anahtar değişikliği sürüyor, 5 = şifre çözme devam ediyor.

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_complete sütunundan takip edebilirsiniz (bu sütun yalnızca encryption_state = 2 iken anlamlı değer gösterir, işlem bitince 0’a döner). Bu süre boyunca veritabanı çevrimiçi ve kullanılabilir durumda kalır; yalnızca ek I/O yükü oluşur, bu nedenle işlemi yoğun olmayan saatlerde başlatmanız önerilir. FULL recovery modelinde ilk şifreleme transaction log’unu büyütebilir; log yedeklerinizin bu sırada düzenli alındığından emin olun.

Artık BAKICUBUK_DB3 şifreli durumda. Şimdi asıl konumuz olan devre dışı bırakma adımlarına geçebiliriz.

Adım 1: Şifrelemeyi Kapatma

USE master;
GO
ALTER DATABASE BAKICUBUK_DB3 SET ENCRYPTION OFF;
GO

Adım 2: Şifre Çözme Durumunu İzleme

Şifre çözme işleminin ilerlemesini izleyin. encryption_state değeri 1 olana kadar bekleyin:

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 ediyor1 = şifre çözme tamamlandı (şifresiz). Değer 1 olmadan bir sonraki adıma geçmeyin.

Not: Veritabanı artık sys.dm_database_encryption_keys görünümünde encryption_state = 1 ile görünüyorsa şifre çözme bitmiştir. Bazı durumlarda DEK düşürüldükten sonra veritabanı bu görünümden tamamen kaybolur; bu normaldir.

Veritabanı artık sys.dm_database_encryption_keys görünümünde encryption_state = 1 ile görünüyorsa şifre çözme bitmiştir. Bazı durumlarda DEK düşürüldükten sonra veritabanı bu görünümden tamamen kaybolur; bu normaldir.

Adım 3: Database Encryption Key (DEK) Düşürme

Şifre çözme tamamlandıktan sonra, artık ihtiyaç duyulmayan DEK’i düşürün:

USE BAKICUBUK_DB3;
GO
DROP DATABASE ENCRYPTION KEY;
GO

Uyarı: DEK’i yalnızca encryption_state = 1 olduktan sonra düşürün. Şifre çözme sürerken (encryption_state = 5) DEK’i düşürmeye çalışırsanız hata alırsınız veya veritabanını erişilemez hale getirebilirsiniz.

Bu noktada BAKICUBUK_DB3 veritabanı tamamen şifresizdir. Sertifika ve master key hala instance üzerinde durur; bunların temizliği isteğe bağlıdır ve Bölüm 2‘de ele alınmıştır (dikkatli olunması gereken bir konudur).

Bölüm 2: Sertifika ve Master Key Temizliği (Dikkatli Olun)

Veritabanı şifresi kaldırıldıktan sonra sertifika ve master key hala instance üzerinde durur. Bunları silmek isteğe bağlıdır, ancak 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. Sertifikayı sildikten sonra, o döneme ait şifreli bir yedeği geri yüklemeniz gerekirse veri kalıcı olarak erişilemez hale gelir. Şüpheye düşerseniz sertifikayı silmeyin; yer kaplamıyor ve zararı yok.

Bu nedenle pratikte önerilen yaklaşım, sertifikayı silmek yerine yedeğini güvenli bir arşivde saklayıp instance üzerinde bırakmaktır. Yalnızca ilgili tüm şifreli yedeklerin saklama süresi (retention) dolduğunda temizliği düşünün.

Yine de temizlik yapmaya karar verirseniz, sıra şu şekildedir:

Adım 1: Sertifikayı Silme

Önce sertifikanın hangi veritabanları tarafından kullanıldığını kontrol edin. Bu sorgu yalnızca DEK’i olan (şifreli) veritabanlarını listelediğinden, TDE’yi doğru kapatıp DEK’i düşürdüyseniz BAKICUBUK_DB3 artık burada görünmemelidir. Sorgunun bu sertifika için boş dönmesi, ona bağlı hiçbir şifreli veritabanı kalmadığı — yani sertifikanın güvenle silinebileceği — anlamına gelir:

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

Listede BAKICUBUK_DB3_TDE_Cert görünmüyorsa (yani bu sertifikaya bağlı bir satır yoksa) sertifikayı güvenle silebilirsiniz:

USE master;
GO
DROP CERTIFICATE BAKICUBUK_DB3_TDE_Cert;
GO

Not: Bu yazı tek (standalone) bir veritabanını ele aldığından sertifika tek bir instance üzerinde bulunur. Always On ortamında ise sertifika her replikada ayrı ayrı oluşturulmuş olur; o durumda silme işlemini her node üzerinde ayrı ayrı yapmanız gerekir. Always On üzerinde TDE’yi devre dışı bırakmayı serinin bir sonraki yazısında ele alıyoruz.

Adım 2: Master Key Silme (Genellikle Gerekmez)

Database Master Key (DMK), yalnızca bu sertifika için değil, instance üzerindeki başka sertifikalar ve şifreleme nesneleri için de kullanılıyor olabilir. Bu yüzden master key’i silmek çoğu zaman gerekli ve önerilen bir işlem değildir. Başka hiçbir şifreleme nesnesi kullanmadığınızdan kesinlikle eminseniz silebilirsiniz:
Yalnızca başka hiçbir şifreleme nesnesi kullanılmıyorsa

USE master;
GO
DROP MASTER KEY;
GO

Uyarı: Master key başka nesneler tarafından kullanılıyorsa DROP MASTER KEY hata verir. Emin değilseniz bu adımı atlayın; master key’in instance üzerinde kalması bir sorun teşkil etmez.

Devre Dışı Bırakma Sonrası Kontrol Listesi

TDE’yi kaldırdıktan sonra şu maddeleri gözden geçirin:

  • Veritabanı encryption_state = 1 durumunda mı?
  • Ş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)
  • tempdb durumu: Instance üzerindeki tüm kullanıcı veritabanları şifresiz hale geldiğinde, tempdb şifrelemesi bir sonraki SQL Server servis yeniden başlatmasında otomatik olarak kalkar. Bu, planlı bir bakım penceresinde gerçekleşir; TDE’yi kaldırdıktan sonra tempdb‘nin hemen şifresiz olmasını beklemeyin.

Sonuç

TDE’yi devre dışı bırakmak, teknik olarak birkaç komuttan ibaret olsa da, asıl risk sıralama ve temizlik tarafındadır. Şifrelemeyi kapatın, şifre çözmenin tamamlandığını (encryption_state = 1) doğrulayın, ardından DEK’i düşürün. Sertifika ve master key temizliğine ise en son ve en temkinli şekilde yaklaşın: bir sertifikayı silmek, ona bağlı eski yedekleri kalıcı olarak erişilemez kılar. Bu yüzden altın kural nettir: emin değilseniz sertifikayı silmeyin, yedeğini saklayın. Bu yazıda tek bir veritabanında TDE’yi kaldırmayı ele aldık; Always On Availability Group ortamında devre dışı bırakmanın kendine özgü inceliklerini (şifre çözmenin tüm replikalarda tamamlanmasını bekleme gibi) serinin son yazısında inceleyeceğiz.

 

 

 

 

 

Bir yanıt yazın

Başa Dön