mcrypt, GPG ve OpenSSL ile Dosya ve Dizin Şifreleme: Komut Satırında Veri Güvenliği

Yıllar önce bir müşterinin sunucusunda yaptığım denetimde şunu fark ettim: veritabanı yedekleri, düz metin olarak, herkesin okuyabileceği bir dizinde duruyordu. Şifreler, API anahtarları, müşteri verileri, hepsi açıkta. “Zaten sunucu güvenli” diye düşünülmüştü. Sunucu ele geçirildiğinde ise iş işten geçmişti. O günden beri şunu söylüyorum: veri güvenliği katmanlıdır ve dosya şifreleme bu katmanların en temellerindendir.

Bu yazıda Linux sistemlerde dosya ve dizin şifreleme için kullanılan üç temel aracı ele alacağız: mcrypt, GPG ve OpenSSL. Her birinin kendine özgü güçlü yanları var, hangi senaryoda hangisini kullanacağınızı bilmek ise hem zaman hem de baş ağrısı kurtarıyor.

Neden Komut Satırında Şifreleme?

GUI araçları var, cloud servisler var, ama sysadmin olarak işin gerçeği şu: bir script içinde, bir cron job’da veya SSH üzerinden çalışırken GUI’ye başvuramazsınız. Komut satırı araçları pipeline’lara girer, script’lere entegre olur, uzaktan çalıştırılabilir ve en önemlisi her dağıtımda mevcut ya da kolayca kurulabilir durumdadır.

mcrypt ile Şifreleme

mcrypt, klasik ama hâlâ birçok sistemde kullanılan bir şifreleme aracıdır. Özellikle eski sistemlerle çalışıyorsanız veya basit, hızlı simetrik şifrelemeye ihtiyacınız varsa işe yarar.

Kurulum

# Debian/Ubuntu
sudo apt-get install mcrypt

# RHEL/CentOS (EPEL gerekebilir)
sudo yum install epel-release && sudo yum install mcrypt

# Fedora
sudo dnf install mcrypt

Temel Kullanım

# Dosya şifreleme - şifre sorulacak
mcrypt gizli_dosya.txt

# Şifre çözme
mcrypt -d gizli_dosya.txt.nc

# Algoritma belirterek şifreleme
mcrypt -a rijndael-256 gizli_dosya.txt

# Script içinde kullanım için şifreyi doğrudan geçirme (dikkatli olun!)
echo "sifre123" | mcrypt --bare -q gizli_dosya.txt

Şifrelenmiş dosya varsayılan olarak .nc uzantısıyla kaydedilir. -a parametresiyle farklı algoritmalar seçebilirsiniz; rijndael-256, twofish, serpent gibi seçenekler mevcut.

mcrypt’in Zayıf Noktaları

Açıkça söylemek gerekirse, mcrypt artık aktif olarak geliştirilmiyor. Bazı dağıtımlarda paketten kaldırılmış durumda. Modern sistemlerde OpenSSL veya GPG tercih etmenizi öneririm. Ama bir müşterinin eski backup script’ini analiz etmeniz gerektiğinde mcrypt’i anlıyor olmak hayat kurtarıyor.

GPG ile Şifreleme

GPG (GNU Privacy Guard), hem simetrik hem de asimetrik şifreleme desteğiyle çok yönlü bir araçtır. İmzalama, anahtar yönetimi, e-posta güvenliği gibi konularda da kullanılır. Ciddiye aldığınız her şifreleme ihtiyacı için GPG’yi düşünün.

Simetrik Şifreleme

En basit kullanım şekli, tıpkı mcrypt gibi parola tabanlıdır:

# Simetrik şifreleme
gpg --symmetric --cipher-algo AES256 onemli_veri.tar.gz

# Çıktı dosya adını belirterek
gpg --symmetric --cipher-algo AES256 -o onemli_veri.tar.gz.gpg onemli_veri.tar.gz

# Script içinde kullanım (passphrase dosyadan)
gpg --batch --passphrase-file /root/.gpg_pass --symmetric dosya.txt

# Şifre çözme
gpg -d onemli_veri.tar.gz.gpg > onemli_veri.tar.gz

Asimetrik Şifreleme – Anahtar Çifti Oluşturma

Asimetrik şifreleme, özellikle birden fazla kişi veya sistem arasında şifreli veri alışverişi yapılacaksa çok daha güvenlidir:

# Anahtar çifti oluştur
gpg --full-generate-key

# Mevcut anahtarları listele
gpg --list-keys
gpg --list-secret-keys

# Public key'i dışa aktar
gpg --export --armor [email protected] > ali_public.asc

# Başkasının public key'ini içe aktar
gpg --import sunucu_backup_public.asc

Asimetrik Şifreleme Örneği

# Alıcının public key'iyle şifrele (sadece alıcı açabilir)
gpg --encrypt --recipient [email protected] veritabani_yedeği.sql

# Birden fazla alıcı
gpg --encrypt --recipient [email protected] --recipient [email protected] kritik_rapor.pdf

# Şifrele ve imzala (gönderen doğrulaması için)
gpg --encrypt --sign --recipient [email protected] dosya.txt

# Şifre çöz
gpg --decrypt veritabani_yedeği.sql.gpg > veritabani_yedeği.sql

Gerçek Dünya Senaryosu: Otomatik Yedek Şifreleme

Bizim ortamımızda her gece çalışan bir backup script’i var. Yedekler şirket içi bir GPG anahtarıyla şifreleniyor, sonra offsite storage’a atılıyor. Bu sayede storage tarafına erişim olsa bile veriler okunamıyor:

#!/bin/bash
# backup_encrypt.sh

BACKUP_DIR="/var/backups"
DATE=$(date +%Y%m%d)
DB_DUMP="/tmp/db_backup_${DATE}.sql"
RECIPIENT="[email protected]"

# Veritabanı dump al
mysqldump -u root -p"${DB_PASS}" tum_veritabanlari > "${DB_DUMP}"

# Sıkıştır ve şifrele
tar czf - "${DB_DUMP}" | gpg --encrypt --recipient "${RECIPIENT}" 
    --batch --trust-model always 
    -o "${BACKUP_DIR}/db_backup_${DATE}.tar.gz.gpg"

# Geçici dosyayı sil
rm -f "${DB_DUMP}"

# 30 günden eski yedekleri temizle
find "${BACKUP_DIR}" -name "*.gpg" -mtime +30 -delete

OpenSSL ile Şifreleme

OpenSSL, muhtemelen en yaygın kullanılan şifreleme kütüphanesidir ve komut satırı aracı olarak son derece güçlüdür. Neredeyse her Linux sisteminde zaten kurulu gelir. Hem dosya şifreleme hem de anahtar/sertifika yönetimi için kullanılabilir.

Simetrik Şifreleme

# AES-256-CBC ile şifreleme (salt kullanımıyla)
openssl enc -aes-256-cbc -salt -in gizli.txt -out gizli.txt.enc

# Şifre komut satırından (güvensiz, sadece test için)
openssl enc -aes-256-cbc -salt -in gizli.txt -out gizli.txt.enc -pass pass:SifreBurada

# Şifreyi dosyadan al (daha güvenli)
openssl enc -aes-256-cbc -salt -in gizli.txt -out gizli.txt.enc -pass file:/root/.enc_pass

# Şifre çözme
openssl enc -d -aes-256-cbc -in gizli.txt.enc -out gizli_cozulmus.txt

# Base64 encode ederek şifreleme (e-posta veya metin tabanlı aktarım için)
openssl enc -aes-256-cbc -salt -a -in gizli.txt -out gizli.b64.enc

-salt: Aynı şifre ile aynı içerik şifrelense bile farklı çıktı üretilmesini sağlar, rainbow table saldırılarına karşı önemlidir.

-a: Base64 encode uygular, binary yerine ASCII çıktı verir.

-d: Decrypt modunda çalıştırır.

-pass file:/yol: Şifreyi dosyadan okur, komut satırı geçmişinde görünmesini engeller.

Asimetrik Şifreleme ile OpenSSL

Büyük dosyalar için doğrudan RSA şifrelemesi kullanmak pratik değil (RSA küçük veriler için tasarlanmış), bu yüzden hibrit yaklaşım kullanılır: veri simetrik anahtarla, o anahtar ise RSA ile şifrelenir.

# RSA anahtar çifti oluştur
openssl genrsa -out ozel_anahtar.pem 4096
openssl rsa -in ozel_anahtar.pem -pubout -out acik_anahtar.pem

# Rastgele simetrik anahtar oluştur
openssl rand -base64 32 > simetrik_anahtar.key

# Dosyayı simetrik anahtarla şifrele
openssl enc -aes-256-cbc -salt -in buyuk_dosya.tar.gz 
    -out buyuk_dosya.tar.gz.enc 
    -pass file:simetrik_anahtar.key

# Simetrik anahtarı RSA public key ile şifrele
openssl rsautl -encrypt -inkey acik_anahtar.pem -pubin 
    -in simetrik_anahtar.key -out simetrik_anahtar.key.enc

# Şifreli anahtar ve şifreli dosyayı karşı tarafa ilet
# Karşı taraf önce anahtarı çözer, sonra dosyayı açar

# Şifre çözme - önce simetrik anahtarı kurtar
openssl rsautl -decrypt -inkey ozel_anahtar.pem 
    -in simetrik_anahtar.key.enc -out simetrik_anahtar.key

# Sonra dosyayı aç
openssl enc -d -aes-256-cbc -in buyuk_dosya.tar.gz.enc 
    -out buyuk_dosya.tar.gz 
    -pass file:simetrik_anahtar.key

OpenSSL ile Dosya Bütünlüğü Doğrulama

Şifreleme kadar önemli olan bir diğer konu da dosyanın değiştirilip değiştirilmediğini anlamak:

# SHA256 hash oluştur
openssl dgst -sha256 onemli_dosya.tar.gz

# Hash'i dosyaya kaydet
openssl dgst -sha256 onemli_dosya.tar.gz > onemli_dosya.tar.gz.sha256

# Dosya bütünlüğünü doğrula
openssl dgst -sha256 -verify acik_anahtar.pem 
    -signature dosya.sig onemli_dosya.tar.gz

Dizinleri Şifreleme: Pratik Yaklaşımlar

Tek bir araçla bir dizini doğrudan şifreleyemezsiniz, önce arşivlemeniz gerekir. İşte yaygın yaklaşım:

# Dizini şifreli arşive al (GPG ile)
tar czf - /var/www/html/gizli_klasor | 
    gpg --symmetric --cipher-algo AES256 
    -o gizli_klasor_yedek.tar.gz.gpg

# Şifreyi çöz ve aç
gpg -d gizli_klasor_yedek.tar.gz.gpg | tar xzf - -C /hedef/dizin/

# OpenSSL ile dizin şifreleme
tar czf - /etc/ssl/private | 
    openssl enc -aes-256-cbc -salt 
    -pass file:/root/.backup_pass 
    -out ssl_private_yedek.tar.gz.enc

# Geri açma
openssl enc -d -aes-256-cbc 
    -pass file:/root/.backup_pass 
    -in ssl_private_yedek.tar.gz.enc | tar xzf -

EncFS ile Şeffaf Dizin Şifreleme

Eğer kalıcı ve şeffaf dizin şifreleme istiyorsanız EncFS harika bir seçenek:

# Kurulum
sudo apt-get install encfs

# Şifreli dizin oluştur
encfs /home/kullanici/.gizli_sifrelenmis /home/kullanici/gizli

# Mount et (şifre sorulacak)
encfs /home/kullanici/.gizli_sifrelenmis /home/kullanici/gizli

# Kullanım bitti, unmount et
fusermount -u /home/kullanici/gizli

Bu yapıda, /home/kullanici/gizli dizinine yazdığınız her şey otomatik olarak şifrelenerek /home/kullanici/.gizli_sifrelenmis dizininde saklanır. Sistemi kapattığınızda ya da unmount ettiğinizde şifreli dizine erişim olmadan veriler okunamaz.

Güvenlik İpuçları ve Dikkat Edilmesi Gerekenler

Yıllarca bu araçlarla çalıştıktan sonra edindiğim bazı pratik dersler var:

  • Şifreleri komut geçmişinde bırakmayın: history komutuyla komut geçmişi görüntülenebilir. Şifreyi her zaman dosyadan okuyun ya da ortam değişkeni kullanın.
# Kötü yol
openssl enc -aes-256-cbc -in dosya.txt -out dosya.enc -pass pass:Sifrem123

# İyi yol
export SIFRE="Sifrem123"
openssl enc -aes-256-cbc -in dosya.txt -out dosya.enc -pass env:SIFRE
unset SIFRE
  • Geçici dosyaları güvenli silin: Normal rm komutu verinin diskten kaldırıldığını garanti etmez. shred kullanın:
shred -u -z gecici_sifresiz_dosya.sql
  • Şifre dosyalarının izinleri: Şifre sakladığınız dosyaların izinleri 600 veya daha kısıtlayıcı olmalı:
chmod 600 /root/.enc_pass
ls -la /root/.enc_pass
# -rw------- 1 root root 32 Oca 15 10:23 /root/.enc_pass
  • Yedek anahtarları saklayın: GPG private key’inizi ya da OpenSSL özel anahtarınızı kaybederseniz şifreli veriye bir daha ulaşamazsınız. Anahtarları güvenli, farklı bir ortamda yedekleyin.
  • Şifreleme algoritması seçimi: AES-256 günümüz ihtiyaçları için yeterince güçlüdür. DES, 3DES, RC4 gibi eski algoritmalardan uzak durun.
  • OpenSSL sürümüne dikkat: Eski sürümlerde bazı algoritmalar deprecate edilmiş olabilir. openssl list -cipher-algorithms komutuyla desteklenen algoritmaları görebilirsiniz.

Hangi Aracı Ne Zaman Kullanmalı?

Yıllar içinde şöyle bir kullanım paterni oturdu bende:

mcrypt: Eski sistemlerde mevcut script’lerle çalışırken ya da analiz yaparken. Yeni projelerde tercih etmem.

GPG: Birden fazla kişi veya sistem arasında şifreli veri paylaşımı yapılacaksa, e-posta güvenliği gerekiyorsa, anahtar yönetimi altyapısı kurulacaksa. Uzun vadeli arşivler için de GPG iyi bir seçim çünkü ekosistemi geniş ve standartlaşmış.

OpenSSL: Script içi şifreleme, otomatik backup sistemleri, tek taraflı şifreleme (backup sunucu kendi kendine şifreler), sertifika yönetimi. Hemen her sistemde kurulu geldiği için bağımlılık sorunu yaratmaz.

Sonuç

Dosya şifreleme, sistem yönetiminin görmezden gelinmemesi gereken bir parçasıdır. “Sunucuya zaten kimse giremez” veya “ağ güvenli” gibi varsayımlar, derinlemesine savunma ilkesiyle çelişir. Veri ele geçirilse bile okunamaz olmalıdır.

Bu üç araçtan birini seçip iyi öğrenmek, hepsini yüzeysel bilmekten çok daha değerlidir. Benim tavsiyem şu: OpenSSL’i iyi öğrenin, GPG’yi anahtar yönetimi konusunda da kavrayın, mcrypt’i ise tanımlık düzeyde bilin. Ardından bu araçları mevcut backup, deployment ve veri aktarım süreçlerinize entegre edin.

Şifreleme bir alışkanlıktır. Sonradan eklemesi zahmetli, başından kurması ise çok daha kolaydır.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir