Bir gün ofise geliyorsun, sunucu odasının kapısı açık, disk çıkarılmış. Ya da daha kötüsü: bulut ortamında bir snapshot yanlış kişinin eline geçmiş. Disk şifrelenmemişse, o diskdeki her şey açık kitap gibi okunabilir. İşte tam bu yüzden LUKS (Linux Unified Key Setup) her ciddi sistem yöneticisinin araç kutusunda olması gereken bir teknoloji.
Bu yazıda LUKS’u sıfırdan kurarak gerçek dünya senaryolarında nasıl kullanacağını, tuzaklardan nasıl kaçınacağını ve production ortamlarında şifreli disk yönetimini nasıl yapacağını ele alacağız.
LUKS Nedir ve Neden Önemlidir
LUKS, Linux’ta blok cihazı şifreleme için standart haline gelmiş bir spesifikasyondur. dm-crypt kernel modülü üzerine inşa edilmiştir ve cryptsetup aracıyla yönetilir. Temel felsefesi şudur: diskin tamamını ya da belirli bir bölümünü şifreleyerek, fiziksel erişim olsa bile veriyi okunamaz hale getirmek.
Peki neden LUKS özellikle tercih edilir? Çünkü:
- Birden fazla anahtar yuvası destekler (8 yuva, LUKS2’de 32). Yani aynı şifreli bölümü birden fazla parola veya anahtar dosyasıyla açabilirsin.
- Metadata başlığı diskin başında saklanır, bu da farklı sistemlerle taşınabilirlik sağlar.
- Algoritma bağımsızdır: AES, Serpent, Twofish gibi farklı şifreleme algoritmalarını seçebilirsin.
- LUKS2 ile birlikte gelen Argon2id key derivation fonksiyonu, brute-force saldırılarına karşı çok daha dayanıklıdır.
Kurulum Öncesi Hazırlık
Başlamadan önce gerekli araçların sistemde olduğundan emin olalım:
# Debian/Ubuntu sistemlerde
apt install cryptsetup cryptsetup-bin
# RHEL/CentOS/AlmaLinux sistemlerde
dnf install cryptsetup
# Mevcut versiyonu kontrol et
cryptsetup --version
Hangi diskin şifreleneceğini belirlemek için önce mevcut disk yapısını gözden geçirelim:
lsblk -f
fdisk -l
ls -la /dev/disk/by-id/
Önemli uyarı: Şifreleme işlemi mevcut veriyi siler. Eğer var olan bir disk bölümünü şifreleyeceksen, önce yedeğini al. /dev/sdb gibi bir diski örnek alarak devam edeceğiz.
Yeni Bir LUKS Container Oluşturma
En temiz senaryo: yeni bir disk veya bölüm üzerinde LUKS kurulumu.
# Diski rastgele veriyle doldur (opsiyonel ama önerilir - eski veri izlerini temizler)
dd if=/dev/urandom of=/dev/sdb bs=4M status=progress
# LUKS2 formatında şifreli container oluştur
cryptsetup luksFormat --type luks2
--cipher aes-xts-plain64
--key-size 512
--hash sha512
--iter-time 3000
/dev/sdb
Komutu çalıştırdığında büyük harflerle YES yazman istenir. Bu kasıtlı bir önlemdir, dikkatli ol.
Parametreleri açıklayalım:
- –type luks2: Modern LUKS2 formatını kullan (LUKS1’e göre daha güçlü key derivation)
- –cipher aes-xts-plain64: AES şifrelemesi, XTS modunda. Disk şifrelemesi için önerilen mod
- –key-size 512: XTS modunda 512 bit = 256 bit efektif anahtar boyutu
- –hash sha512: Parola türetme için SHA-512
- –iter-time 3000: Anahtar türetme için harcanan milisaniye (daha yüksek = daha güvenli ama açılış biraz yavaşlar)
Container’ı açmak için:
# "encrypted_data" ismiyle /dev/mapper/ altında görünür hale getir
cryptsetup open /dev/sdb encrypted_data
# Açık mı kontrol et
ls -la /dev/mapper/encrypted_data
cryptsetup status encrypted_data
Açtıktan sonra artık normal bir blok cihaz gibi davranabilirsin:
# Dosya sistemi oluştur
mkfs.ext4 /dev/mapper/encrypted_data
# Mount et
mkdir -p /mnt/secure
mount /dev/mapper/encrypted_data /mnt/secure
# Kullan...
# İşin bitince unmount et ve kapat
umount /mnt/secure
cryptsetup close encrypted_data
LUKS Başlık Bilgilerini İnceleme
Bir LUKS container hakkında detaylı bilgi almak sysadmin’in günlük rutininin parçası olmalı:
# Detaylı başlık bilgisi
cryptsetup luksDump /dev/sdb
# Hangi slotların kullanıldığını görmek için
cryptsetup luksDump /dev/sdb | grep -E "Slot|State"
# LUKS2 token ve keyslot özeti
cryptsetup luksDump --dump-json-metadata /dev/sdb 2>/dev/null | python3 -m json.tool
luksDump çıktısında dikkat etmen gereken alanlar:
- Keyslots: Hangi slotlarda anahtar olduğunu gösterir. LUKS2’de
ENABLEDveyaDISABLEDolarak görünür - Version: LUKS1 mi LUKS2 mi olduğunu söyler
- UUID: Container’ın eşsiz kimliği.
/etc/crypttab‘a yazarken kullanırsın
Birden Fazla Anahtar Yönetimi
LUKS’un en güçlü özelliklerinden biri birden fazla anahtar desteklemesi. Bunu şöyle düşün: sistem yöneticisi parolası, yedek kurtarma anahtarı ve bir anahtar dosyası, hepsi aynı container’ı açabilir.
# İkinci bir parola ekle (ikinci key slot'a)
cryptsetup luksAddKey /dev/sdb
# Anahtar dosyası oluştur ve ekle
dd if=/dev/urandom bs=512 count=1 of=/root/backup.keyfile
chmod 400 /root/backup.keyfile
cryptsetup luksAddKey /dev/sdb /root/backup.keyfile
# Anahtar dosyasıyla container'ı aç
cryptsetup open /dev/sdb encrypted_data --key-file /root/backup.keyfile
# Belirli bir slot'u kaldır (önce hangi slotta olduğunu bilmen lazım)
cryptsetup luksKillSlot /dev/sdb 1
# Mevcut parolayla açık bir container'ın parolasını değiştir
cryptsetup luksChangeKey /dev/sdb
Kritik tavsiye: LUKS başlığını mutlaka yedekle. Başlık bozulursa tüm veri erişilemez olur:
# Başlığı yedekle
cryptsetup luksHeaderBackup /dev/sdb --header-backup-file /secure-backup/sdb-luks-header.img
# Gerekirse başlığı geri yükle
cryptsetup luksHeaderRestore /dev/sdb --header-backup-file /secure-backup/sdb-luks-header.img
Sistem Başlangıcında Otomatik Mount: /etc/crypttab ve /etc/fstab
Prod ortamında her seferinde manuel açmak istemezsin. Özellikle veri diskleri için otomatik açılış ve mount kurulumu şart.
/etc/crypttab dosyasının formatı şöyledir:
# UUID ile crypttab girişi oluştur
DISK_UUID=$(cryptsetup luksDump /dev/sdb | grep "UUID" | awk '{print $2}')
echo "encrypted_data UUID=${DISK_UUID} /root/backup.keyfile luks" >> /etc/crypttab
# Anahtar dosyası yoksa (parola sorulsun istiyorsan) none yaz
echo "encrypted_data UUID=${DISK_UUID} none luks" >> /etc/crypttab
Ardından /etc/fstab‘a mount noktasını ekle:
echo "/dev/mapper/encrypted_data /mnt/secure ext4 defaults,nofail 0 2" >> /etc/fstab
# Test et
systemctl daemon-reload
mount -a
nofail seçeneği önemli: Eğer şifreli disk bir nedenden açılamazsa, sistem yine de boot etmeye devam eder. Production sunucularında bunu ihmal etme.
Gerçek Dünya Senaryosu: Veritabanı Diskini Şifreleme
Diyelim ki PostgreSQL veritabanının veri dizinini ayrı bir şifreli diske taşıyacaksın. Bu senaryo çok yaygın ve dikkat gerektiriyor.
# 1. Yeni diski hazırla
cryptsetup luksFormat --type luks2 /dev/sdc
cryptsetup open /dev/sdc pgdata_enc
mkfs.xfs /dev/mapper/pgdata_enc
# 2. Geçici mount noktası oluştur
mkdir /mnt/pgdata_new
mount /dev/mapper/pgdata_enc /mnt/pgdata_new
# 3. PostgreSQL'i durdur
systemctl stop postgresql
# 4. Mevcut veriyi kopyala (rsync ile, izinleri koru)
rsync -avz --progress /var/lib/postgresql/ /mnt/pgdata_new/
# 5. Eski dizini yeniden adlandır (yedek olarak tut şimdilik)
mv /var/lib/postgresql /var/lib/postgresql.old
# 6. Yeni mount noktasını ayarla
umount /mnt/pgdata_new
rmdir /mnt/pgdata_new
mkdir /var/lib/postgresql
mount /dev/mapper/pgdata_enc /var/lib/postgresql
# 7. Sahipliği düzelt
chown -R postgres:postgres /var/lib/postgresql
# 8. crypttab ve fstab güncelle, sonra servisi başlat
systemctl start postgresql
systemctl status postgresql
Bu senaryoda anahtar dosyası kullanarak otomatik açılışı konfigüre etmek mantıklı, çünkü veritabanı sunucusunun reboot sonrası elle müdahale olmadan ayağa kalkması gerekiyor.
LUKS ile Swap Alanını Şifreleme
Çoğu sysadmin bunu atlar ama swap alanı ciddi bir güvenlik açığı olabilir. Belleğe yazılan hassas veriler (parolalar, şifreleme anahtarları) swap’a sızabilir.
# /etc/crypttab'a geçici (her boot'ta yeni anahtar) swap girişi ekle
echo "swap_enc /dev/sdX /dev/urandom swap,cipher=aes-xts-plain64,size=512" >> /etc/crypttab
# /etc/fstab'da swap tanımını güncelle
# Eski satırı yorum satırına al:
# UUID=... swap swap defaults 0 0
# Yeni satır ekle:
echo "/dev/mapper/swap_enc none swap sw 0 0" >> /etc/fstab
Bu konfigürasyonla her sistem başlangıcında swap için yeni bir rastgele anahtar üretilir. Swap içeriği her reboot’ta sıfırdan şifrelenir, dolayısıyla önceki oturumdan kalan veri okunamaz.
Performans Değerlendirmesi
Şifreleme performansı üzerinde ciddi bir etki yapar mı? Bunu ölçmek için:
# Cryptsetup dahili benchmark
cryptsetup benchmark
# Gerçek disk hızını test et (şifreli vs şifresiz)
# Önce şifresiz:
hdparm -tT /dev/sdb
# Şifreli container üzerinde:
cryptsetup open /dev/sdb test_bench
hdparm -tT /dev/mapper/test_bench
cryptsetup close test_bench
# AES-NI donanım desteğini kontrol et (modern CPU'larda olmalı)
grep -m1 aes /proc/cpuinfo
Modern CPU’ların büyük çoğunluğunda AES-NI donanım hızlandırması bulunur. Bu sayede şifreleme yükü neredeyse sıfıra iner, genellikle %1-3 oranında bir performans kaybı görürsün. AES-NI yoksa bu oran %20-30’a çıkabilir.
LUKS Container’ı Yeniden Boyutlandırma
Disk doldu ve genişletmen gerekiyor. LUKS bu senaryoyu destekler:
# Önce container'ı kapat
umount /mnt/secure
cryptsetup close encrypted_data
# Fiziksel diski genişlet (LVM kullanıyorsan lvextend, partition ise parted/growpart)
# Örnek: LVM üzerinde
lvextend -L +50G /dev/vg0/data_lv
# LUKS container'ı yeni boyutu tanısın
cryptsetup open /dev/vg0/data_lv encrypted_data
cryptsetup resize encrypted_data
# Dosya sistemini de genişlet
resize2fs /dev/mapper/encrypted_data # ext4 için
xfs_growfs /mnt/secure # xfs için (mount ediliyken yapılır)
Güvenlik Sertleştirme Tavsiyeleri
LUKS’u kurdun, iyi. Ama birkaç ek önlem almadan işi yarım bırakmış olursun:
Anahtar dosyası güvenliği için:
# Anahtar dosyasını sadece root okuyabilsin
chmod 400 /root/luks.keyfile
chattr +i /root/luks.keyfile # Değiştirilemez yap
# Anahtar dosyasının tmpfs gibi şifreli bir yerde durması daha iyidir
# Ya da TPM ile entegrasyon düşünülebilir (clevis/tang ile)
LUKS başlık güvenliği:
- Detached header kullanabilirsin: Başlığı diskten ayırarak farklı bir yerde (USB, ağ) tutarsın. Disk çalınsa bile başlık olmadan açılamaz.
# Detached header ile format
cryptsetup luksFormat --type luks2 --header /secure/external-header.img /dev/sdb
# Açarken header'ı belirt
cryptsetup open --header /secure/external-header.img /dev/sdb encrypted_data
Zayıf parola tespiti:
# Mevcut parolanın ne kadar hızlı kırılabileceğini test et
# (sadece test ortamında kullan)
cryptsetup luksDump /dev/sdb | grep "Iterations"
# Iterations değeri düşükse iter-time ile yeniden format gerekebilir
Genel sertleştirme kontrol listesi:
- LUKS başlık yedeğini şifreli, farklı bir lokasyonda tut
- Anahtar dosyalarını asla şifresiz e-posta veya Slack ile gönderme
- Test ve prod ortamları için farklı anahtarlar kullan
- Yedekleri şifreli container içinde sakla, yoksa şifrelemenin anlamı kalmaz
cryptsetup benchmarkile periyodik olarak sistemi test etauditdile LUKS container açma/kapama olaylarını logla
Sorun Giderme
Gerçek hayatta en sık karşılaşılan sorunlar ve çözümleri:
“Device is busy” hatası:
# Kimin kullandığını bul
fuser -mv /dev/mapper/encrypted_data
lsof /mnt/secure
# Güvenli umount
umount -l /mnt/secure # Lazy unmount
cryptsetup close encrypted_data
“No key available” hatası:
# Hangi slotların dolu olduğunu kontrol et
cryptsetup luksDump /dev/sdb
# Doğru anahtar dosyasını mı kullanıyorsun?
cryptsetup open /dev/sdb test --key-file /root/keyfile --verbose
# Parola denemesi
cryptsetup open /dev/sdb test --verbose
Bozuk LUKS başlığı durumunda:
# Yedekten geri yükle
cryptsetup luksHeaderRestore /dev/sdb --header-backup-file /backup/sdb-header.img
# Başlık yoksa ve LUKS1 kullanıyorsan (son çare)
# cryptsetup-reencrypt ile bazı durumlarda kurtarma mümkün
# Ama en iyi çözüm yedek almaktı...
systemd boot sırasında parola soran ekran:
/etc/crypttab‘da anahtar dosyası yolu yanlışsa sistem boot sırasında parola ister. Bunu çözmek için:
# Recovery mode'da boot et
# crypttab'ı düzelt
nano /etc/crypttab
# Anahtar dosyasının varlığını kontrol et
ls -la /root/luks.keyfile
# initramfs'ı güncelle
update-initramfs -u -k all # Debian/Ubuntu
dracut --force # RHEL/Rocky
LUKS2 ve Clevis/Tang ile Ağ Tabanlı Otomatik Açılış
Kurumsal ortamlarda TPM veya ağ tabanlı anahtar yönetimi çok daha güvenli bir alternatif sunar. Tang sunucusu çalıştığı sürece disk otomatik açılır, Tang erişilemez olduğunda açılmaz.
# Tang sunucusunu kur (anahtar sunucusu rolündeki makinede)
dnf install tang
systemctl enable --now tangd.socket
# İstemci tarafında clevis kur
dnf install clevis clevis-luks clevis-dracut
# LUKS container'ı Tang ile bağla
clevis luks bind -d /dev/sdb tang '{"url":"http://tang-server:7500"}'
# initramfs'ı güncelle
dracut -fv
# Test: Tang sunucusu erişilebilir mi?
clevis luks unlock -d /dev/sdb
Bu yaklaşım özellikle veri merkezi ortamlarında, fiziksel güvenliğin sağlandığı ama disklerin çalınma riskine karşı korunması gereken durumlarda kullanılır.
Sonuç
LUKS, doğru uygulandığında güçlü ve esnek bir disk şifreleme çözümü sunar. Temel kurulum birkaç komutla yapılsa da production ortamında dikkat edilmesi gereken birçok nokta var: başlık yedekleme, anahtar yönetimi, otomatik açılış konfigürasyonu ve performans dengesi.
En sık yapılan hatalar şunlar: LUKS başlığını yedeklememek (header bozulunca tüm veri gider), swap şifrelemesini atlamak, anahtar dosyalarını güvenli olmayan yerlerde saklamak ve yedekleri şifresiz tutmak.
Eğer şu an üretimde şifrelenmemiş diskler varsa, bir bakım penceresi planla ve bu işe başla. Bir sonraki adım olarak TPM tabanlı otomatik kilit açma veya Tang/Clevis entegrasyonunu araştırmanı öneririm; bu ikisi kurumsal ortamlarda güvenlik ile kullanılabilirliği en iyi dengeleyen yaklaşımlardır.
Disk şifrelemesi “birisi diski çalarsa ne olur” sorusuna verilen cevaptır. Bu soruyu sormamış olmak, bir gün pişman olacağın bir lüks haline gelebilir.