Veri kaybı her zaman donanım arızasından kaynaklanmaz. Bazen bir sunucuya yetkisiz erişim, bazen yanlış ellere geçen bir yedek diski, bazen de bulut depolama hesabınızın ele geçirilmesi işleri mahvedebilir. Yedek almak yetmez; o yedeğin şifreli olması gerekir. Bu yazıda zip ve gpg araçlarını kullanarak nasıl güvenli, şifreli arşivler oluşturabileceğinizi, bunları otomatize edebileceğinizi ve production ortamında nasıl kullanmanız gerektiğini ele alacağız.
Neden Şifreli Yedek?
Klasik tar.gz ya da sade zip arşivleri herhangi biri tarafından açılabilir. Sunucunuzu düzenli olarak yedekliyorsunuz, S3 bucket’ınıza ya da harici bir diske atıyorsunuz, güzel. Peki o bucket public hale gelirse? Ya da harici disk çalınırsa?
Şifreleme burada devreye giriyor. Şifreli bir arşiv, şifre ya da özel anahtar olmadan anlamsız baytlar yığınından ibaret. Saldırgan dosyayı ele geçirse bile içine ulaşamaz.
Günlük sysadmin hayatında en çok karşılaşılan iki senaryo şunlar:
- Hızlı ve basit: Birkaç dosyayı şifreli zip ile paketleyip güvenli şekilde aktarmak
- Kurumsal ve sağlam: GPG ile asimetrik şifreleme kullanarak otomatik yedekleme pipeline’ı kurmak
Her ikisini de detaylıca inceleyeceğiz.
zip ile Şifreli Arşiv Oluşturma
zip komutu, AES-256 şifreleme desteğiyle oldukça kullanışlı bir araç. Özellikle Windows tarafıyla uyumlu olması gerektiğinde ya da alıcının teknik bilgisi sınırlıysa tercih edilebilir.
Temel Kullanım
zip -e arsiv.zip dosya1.txt dosya2.conf
Bu komut sizi şifre girmeye davet eder. İki kez girmenizi ister, arşivi oluşturur. Ama dikkat: -e parametresi eski ZipCrypto algoritmasını kullanır. Bu algoritma 1990’lardan kalma ve güvenlik açıkları biliniyor.
AES-256 ile Güvenli Şifreleme
Modern ve güvenli yöntem için --encrypt yerine --password ile birlikte AES şifrelemesini açıkça belirtmek gerekiyor. Bunun için zip yerine zip komutunun -P parametresini değil, zipcloak ya da daha iyisi doğrudan AES destekli zip seçeneklerini kullanmalısınız.
Peki hangisi AES kullanıyor? Standart zip paketi -e ile sadece ZipCrypto kullanır. AES-256 için zip komutuna -e ve bunu destekleyen versiyon gerekiyor ya da 7z kullanmanız öneriliyor:
# 7zip ile AES-256 şifreli zip arşivi
7z a -tzip -mem=AES256 -p'GucluSifrem123!' arsiv.zip /etc/nginx/
# Şifre ile klasörü arşivleme, dizin yapısını koruma
7z a -tzip -mem=AES256 -mhe=on -p arsiv.zip /var/www/html/
-mhe=on parametresi header encryption’ı aktif eder; yani arşiv içindeki dosya adları bile şifrelenir. Şifre olmadan dosya adlarına bile ulaşamazsınız. Production’da bunu açık bırakmanızı öneririm.
Interaktif Olmayan Kullanım
Script içinde şifre girmek istemezsiniz. ZIPPASSWORD environment variable’ı ya da expect kullanabilirsiniz ama en temizi değişkeni environment’tan okumak:
#!/bin/bash
# Şifreyi environment variable'dan oku
ZIP_PASS="${BACKUP_ZIP_PASSWORD}"
if [ -z "$ZIP_PASS" ]; then
echo "HATA: BACKUP_ZIP_PASSWORD degiskeni tanimli degil!"
exit 1
fi
TARIH=$(date +%Y%m%d_%H%M%S)
ARSIV_ADI="yedek_${TARIH}.zip"
7z a -tzip -mem=AES256 -mhe=on -p"${ZIP_PASS}"
"/opt/yedekler/${ARSIV_ADI}"
/etc/
/var/www/
-xr!*.log
-xr!*.tmp
echo "Arşiv oluşturuldu: ${ARSIV_ADI}"
-xr!.log ve -xr!.tmp parametreleriyle log ve geçici dosyalar hariç tutuluyor. Gereksiz gigabaytları şifreli arşive doldurmaya gerek yok.
GPG ile Güvenli Şifreleme
GPG (GNU Privacy Guard), açık anahtar altyapısı kullanan çok daha güçlü bir araç. Simetrik ya da asimetrik şifreleme yapabilir. Yedekleme senaryolarında asimetrik şifreleme tercih edilir çünkü:
- Şifreleme için public key yeterlidir
- Yedekleme sunucusunda private key bulunmaz
- Sunucu ele geçirilse bile şifreli arşivler açılamaz
GPG Anahtarı Oluşturma
İlk adım anahtar çifti oluşturmak:
gpg --full-generate-key
Sizi interaktif bir menüye alır. Tercihler:
- Anahtar tipi: RSA and RSA (1. seçenek)
- Anahtar uzunluğu: 4096
- Geçerlilik süresi: 2y (2 yıl öneriliyor, production için)
- İsim ve e-posta: Gerçek bilgi girmek zorunda değilsiniz, tanımlayıcı bir isim yeterli
Oluşturduğunuz anahtarları listeleyin:
gpg --list-keys
gpg --list-secret-keys
Public Key’i Export Etmek
Yedekleme sunucusuna sadece public key yüklersiniz. Private key admin workstation’ında kalır:
# Public key'i dosyaya aktar
gpg --export --armor [email protected] > backup_public.asc
# Yedekleme sunucusunda import et
gpg --import backup_public.asc
# İmport edilen anahtarı listele
gpg --list-keys
GPG ile Simetrik Şifreleme
Hızlı ve basit kullanım için, anahtar çifti olmadan sadece şifre ile şifreleme:
# Dosyayı simetrik olarak şifrele (AES-256)
gpg --symmetric --cipher-algo AES256 --output yedek.tar.gz.gpg yedek.tar.gz
# Şifreyi doğrudan parametre olarak ver (script kullanımı için)
echo "SifremiGir" | gpg --batch --yes --passphrase-fd 0
--symmetric --cipher-algo AES256
--output yedek.tar.gz.gpg yedek.tar.gz
GPG ile Asimetrik Şifreleme (Önerilen Yöntem)
#!/bin/bash
# /opt/scripts/guvenli_yedek.sh
HEDEF_EMAIL="[email protected]"
YEDEK_DIZIN="/opt/yedekler"
KAYNAK_DIZINLER=("/etc" "/var/www" "/home")
TARIH=$(date +%Y%m%d_%H%M%S)
GECICI_ARSIV="/tmp/yedek_${TARIH}.tar.gz"
SIFIRLI_ARSIV="${YEDEK_DIZIN}/yedek_${TARIH}.tar.gz.gpg"
# Geçici tar.gz oluştur
tar -czf "${GECICI_ARSIV}"
--exclude='*.log'
--exclude='*.tmp'
--exclude='/etc/shadow'
"${KAYNAK_DIZINLER[@]}"
# GPG ile asimetrik şifrele
gpg --batch --yes
--trust-model always
--recipient "${HEDEF_EMAIL}"
--output "${SIFIRLI_ARSIV}"
--encrypt "${GECICI_ARSIV}"
# Geçici dosyayı güvenli sil
shred -vzu "${GECICI_ARSIV}"
echo "Şifreli yedek hazır: ${SIFIRLI_ARSIV}"
echo "Boyut: $(du -sh ${SIFIRLI_ARSIV} | cut -f1)"
--trust-model always parametresi script’in interaktif onay istemeden çalışmasını sağlar. Production’da bunu kullanmak kabul edilebilir çünkü hangi anahtarla şifreleneceğini zaten kontrol ediyorsunuz.
Şifreli Arşivi Açmak
Yedekten geri dönmek gerektiğinde, private key’in olduğu makinede:
# GPG ile şifreyi çöz
gpg --output yedek_geri.tar.gz --decrypt yedek_20240115_120000.tar.gz.gpg
# Arşivi aç
tar -xzf yedek_geri.tar.gz -C /tmp/geri_yukleme/
# Ya da tek satırda
gpg --decrypt yedek_20240115_120000.tar.gz.gpg | tar -xzf - -C /tmp/geri_yukleme/
Gerçek Dünya Senaryosu: Otomatik Günlük Yedekleme
Bir e-ticaret sitesi yönetiyorsunuz. Veritabanı, nginx config’leri ve uygulama dosyaları her gece yedeklenmeli, yedekler şifreli olmalı ve uzak sunucuya gönderilmeli. İşte production’a hazır bir script:
#!/bin/bash
# /opt/scripts/nightly_backup.sh
# Cron: 0 2 * * * /opt/scripts/nightly_backup.sh >> /var/log/nightly_backup.log 2>&1
set -euo pipefail
# Konfigürasyon
GPG_ANAHTAR="[email protected]"
YEDEK_DIZIN="/opt/yedekler"
UZAK_SUNUCU="backup.sirket.com"
UZAK_YOL="/backups/$(hostname)"
LOG_PREFIX="[$(date '+%Y-%m-%d %H:%M:%S')]"
TARIH=$(date +%Y%m%d)
GECICI_DIR=$(mktemp -d)
HATA_MAIL="[email protected]"
# Cleanup fonksiyonu
temizlik() {
local cikis_kodu=$?
if [ -d "${GECICI_DIR}" ]; then
shred -rzu "${GECICI_DIR}" 2>/dev/null || rm -rf "${GECICI_DIR}"
fi
if [ $cikis_kodu -ne 0 ]; then
echo "${LOG_PREFIX} HATA: Yedekleme başarısız! Çıkış kodu: ${cikis_kodu}" >&2
echo "Yedekleme başarısız - $(hostname) - $(date)" |
mail -s "YEDEK HATASI" "${HATA_MAIL}"
fi
}
trap temizlik EXIT
echo "${LOG_PREFIX} Yedekleme başlatılıyor..."
# Veritabanı dump
echo "${LOG_PREFIX} Veritabanı dump alınıyor..."
mysqldump --single-transaction
--routines
--triggers
--all-databases
--user=root
> "${GECICI_DIR}/veritabani_${TARIH}.sql"
# Nginx ve uygulama dosyaları
echo "${LOG_PREFIX} Dosyalar arşivleniyor..."
tar -czf "${GECICI_DIR}/dosyalar_${TARIH}.tar.gz"
--exclude='*.log'
--exclude='*/cache/*'
--exclude='*/tmp/*'
/etc/nginx/
/var/www/uygulama/
/etc/ssl/private/
/opt/uygulama/config/
# Her şeyi tek arşivde birleştir
tar -czf "${GECICI_DIR}/tam_yedek_${TARIH}.tar.gz"
-C "${GECICI_DIR}"
"veritabani_${TARIH}.sql"
"dosyalar_${TARIH}.tar.gz"
# GPG ile şifrele
echo "${LOG_PREFIX} GPG şifreleme yapılıyor..."
SIFIRLI_ARSIV="${YEDEK_DIZIN}/yedek_${TARIH}.tar.gz.gpg"
gpg --batch --yes
--trust-model always
--recipient "${GPG_ANAHTAR}"
--output "${SIFIRLI_ARSIV}"
--encrypt "${GECICI_DIR}/tam_yedek_${TARIH}.tar.gz"
# Bütünlük kontrolü için hash al
sha256sum "${SIFIRLI_ARSIV}" > "${SIFIRLI_ARSIV}.sha256"
# Uzak sunucuya gönder
echo "${LOG_PREFIX} Uzak sunucuya transfer ediliyor..."
rsync -avz --progress
"${SIFIRLI_ARSIV}"
"${SIFIRLI_ARSIV}.sha256"
"${UZAK_SUNUCU}:${UZAK_YOL}/"
# 30 günden eski yerel yedekleri sil
find "${YEDEK_DIZIN}" -name "yedek_*.gpg" -mtime +30 -delete
find "${YEDEK_DIZIN}" -name "*.sha256" -mtime +30 -delete
BOYUT=$(du -sh "${SIFIRLI_ARSIV}" | cut -f1)
echo "${LOG_PREFIX} Yedekleme tamamlandı. Boyut: ${BOYUT}"
Bu script hata durumunda mail atıyor, geçici dosyaları shred ile güvenli siliyor ve her yedek için SHA256 hash oluşturuyor. Hash sayesinde arşivin bozulmadığını ya da değiştirilmediğini doğrulayabilirsiniz.
Şifreli Arşivi Doğrulama
Yedek aldınız, güzel. Peki o yedek gerçekten açılabiliyor mu? Production’da en sık yapılan hata, yedeklerin hiç test edilmemesi. Şifreli arşivler için doğrulama adımları:
#!/bin/bash
# Arşivin bütünlüğünü ve açılabilirliğini test et
ARSIV="yedek_20240115.tar.gz.gpg"
HASH_DOSYA="${ARSIV}.sha256"
TEST_DIZIN=$(mktemp -d)
# Hash doğrulama
echo "Hash kontrol ediliyor..."
sha256sum -c "${HASH_DOSYA}"
# GPG ile test açma
echo "GPG şifresi çözülüyor..."
gpg --batch
--output "${TEST_DIZIN}/test.tar.gz"
--decrypt "${ARSIV}"
# Arşiv içeriğini listele (açmadan)
echo "Arşiv içeriği:"
tar -tzf "${TEST_DIZIN}/test.tar.gz"
# Temizlik
rm -rf "${TEST_DIZIN}"
echo "Doğrulama başarılı!"
Bu script’i haftalık cron’a ekleyin. Ayda bir de gerçek restore testi yapın. Yedekten geri yükleyemiyorsanız yedek almamışsınız demektir.
Güvenlik İpuçları
Şifreli arşiv oluştururken dikkat edilmesi gereken noktalar:
- Güçlü şifre kullanın: En az 20 karakter, büyük/küçük harf, rakam ve özel karakter. Parola yöneticisi kullanın.
- GPG private key’i güvende tutun: Private key’i asla yedekleme sunucusuna koymayın. Offline olarak, şifreli bir cihazda saklayın.
- Geçici dosyaları güvenli silin: Normal
rmdosyayı diskte bırakır.shred -vzu dosyakullanın. - Environment variable’da şifre saklayın: Şifreyi script içine yazmayın.
.envdosyasına yazın, dosyanın izinlerini600yapın. - Anahtar rotasyonu yapın: GPG anahtarlarınızın geçerlilik süresi olsun. 1-2 yılda bir yenileyin.
- Yedek anahtarı belirleyin: Birden fazla recipient ekleyebilirsiniz. Hem birincil admin hem de emergency key ile şifreleyin.
# Birden fazla alıcı ile şifreleme
gpg --batch --yes
--trust-model always
--recipient "[email protected]"
--recipient "[email protected]"
--output yedek.gpg
--encrypt kaynak.tar.gz
Bu sayede iki farklı private key ile arşivi açabilirsiniz. Bir admin tatildeyken diğeri işi yapabilir.
Sonuç
Şifreli yedek almak, plain yedek almaktan neredeyse hiç daha fazla çaba gerektirmiyor. zip ile hızlı ve basit, gpg ile kurumsal düzeyde güvenli arşivler oluşturabilirsiniz.
Pratik önerim şu: Kişisel projeler ve tek seferlik transferler için 7z ile AES-256 şifreli zip kullanın. Sunucu yedekleme ve CI/CD pipeline’larında mutlaka GPG ile asimetrik şifreleme tercih edin. Yedekleme sunucusunda private key bulunmaması, sunucunun ele geçirilmesi durumunda bile yedeklerinizin güvende kalmasını sağlar.
En önemlisi, aldığınız yedekleri test edin. Şifreli arşivin açılıp açılmadığını, içindeki dosyaların sağlam olup olmadığını düzenli aralıklarla kontrol edin. Gerçek bir felaket anında “bu yedek açılmıyor” cümlesini kurmamak için şimdiden vakit ayırın.