Arşiv Dosyalarının Bütünlüğünü Doğrulama: md5sum, sha256sum ve tar –verify Kullanımı
Yıllarca production ortamlarında çalıştıktan sonra şunu öğrendim: “Dosya geldi, dosya var” demek yeterli değil. Özellikle yedeklemeler, yazılım paketleri veya uzak sunucudan transfer ettiğiniz arşivler söz konusu olduğunda, o dosyanın içinin sağlam olduğunu kanıtlamanız gerekiyor. Bir keresinde gece yarısı disaster recovery sırasında açmaya çalıştığımız tar arşivinin yarısının bozuk olduğunu fark ettik. O anı yaşamanıza gerek yok. Bütünlük doğrulama araçlarını öğrenin, hayatınız kolaylaşsın.
Neden Bütünlük Doğrulama?
Bir arşiv dosyası birçok sebepten bozulabilir. Ağ transferi sırasında bit flip olabilir, disk üzerinde bad sector gelişebilir, depolama sistemindeki silent data corruption hataları fark edilmeden birikebilir. Ya da daha kötüsü: birileri dosyayı değiştirmiş olabilir. Bu son senaryo güvenlik açısından kritik.
Checksum doğrulama bu sorunların hepsine karşı ilk savunma hattınızdır. MD5 artık kriptografik güvenlik açısından önerilmese de bütünlük kontrolü için hala pratik ve hızlıdır. SHA256 ise hem bütünlük hem güvenlik için günümüzün standartıdır. tar --verify ise arşiv içeriğinin dosya sistemindekiyle eşleşip eşleşmediğini kontrol eden daha spesifik bir araçtır.
md5sum ile Temel Kullanım
md5sum komutu bir dosyanın 128-bit hash değerini üretir. Basit ama etkili.
# Tek bir dosyanın hash'ini üret
md5sum backup_2024.tar.gz
# Çıktı şuna benzer:
# a1b2c3d4e5f6789012345678901234ab backup_2024.tar.gz
Hash değerini bir dosyaya kaydetmek için:
# Hash değerini checksum dosyasına yaz
md5sum backup_2024.tar.gz > backup_2024.tar.gz.md5
# Birden fazla dosyayı tek seferde hashle
md5sum *.tar.gz > tum_yedekler.md5
# Oluşturulan md5 dosyasının içeriği:
cat tum_yedekler.md5
Doğrulama aşamasında -c flagini kullanıyorsunuz:
# Daha önce oluşturduğunuz checksum dosyasıyla doğrula
md5sum -c backup_2024.tar.gz.md5
# Başarılı çıktı:
# backup_2024.tar.gz: OK
# Bozuk dosyada çıktı:
# backup_2024.tar.gz: FAILED
# md5sum: WARNING: 1 computed checksum did NOT match
-c parametresini kullanırken dikkat edilmesi gereken bir şey var: checksum dosyasının hangi dizinde oluşturulduğu önemli. Eğer checksum dosyası farklı bir dizinde oluşturulduysa, orijinal dosyanın yolu da checksum içinde farklı görünebilir. Bu yüzden mümkünse checksum dosyasını arşiv dosyasıyla aynı dizinde tutun.
--quiet parametresi sadece hatalı dosyaları gösterir, başarılıları gizler. Toplu doğrulamada oldukça kullanışlı:
md5sum --quiet -c tum_yedekler.md5
sha256sum ile Güvenli Doğrulama
MD5’in 128-bit hash ürettiğini söyledik. SHA256 ise 256-bit üretir ve kriptografik olarak çok daha güçlüdür. Yazılım dağıtımlarında, güvenlik güncellemelerinde ve sisteme yükleyeceğiniz her şeyde SHA256 kullanmanızı tavsiye ederim.
# SHA256 hash üret
sha256sum linux-6.6.tar.gz
# Çıktı:
# 3a7c8d9e2f1b4c5a6d7e8f9012345678901234567890abcdef1234567890abcd linux-6.6.tar.gz
Kullanım açısından md5sum ile neredeyse birebir aynı:
# Hash dosyası oluştur
sha256sum backup_2024.tar.gz > backup_2024.tar.gz.sha256
# Doğrula
sha256sum -c backup_2024.tar.gz.sha256
# Birden fazla dosya için
sha256sum -c tum_checksum.sha256 --quiet
Gerçek dünya senaryosuna bakalım. Bir yazılım sağlayıcısı size hem tar.gz dosyasını hem de SHA256 checksum dosyasını gönderdi. Doğrulama şu şekilde yapılır:
# Sağlayıcının gönderdiği checksum dosyası: uygulama_v2.1.sha256
cat uygulama_v2.1.sha256
# 8a9b0c1d2e3f4a5b6c7d8e9f0a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b uygulama_v2.1.tar.gz
# İndirdiğiniz dosyayı doğrulayın
sha256sum -c uygulama_v2.1.sha256
# uygulama_v2.1.tar.gz: OK
Eğer doğrulamak istediğiniz hash değeri sizin ürettiğiniz checksum dosyasında değil de bir web sitesinde ya da dökümanda yazıyorsa, echo ile anlık karşılaştırma yapabilirsiniz:
# Beklenen hash değeri
BEKLENEN="8a9b0c1d2e3f4a5b6c7d8e9f0a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b"
# Hesaplanan hash değeri
HESAPLANAN=$(sha256sum uygulama_v2.1.tar.gz | awk '{print $1}')
# Karşılaştır
if [ "$BEKLENEN" = "$HESAPLANAN" ]; then
echo "Dogrulama basarili"
else
echo "UYARI: Hash eslesmedi! Dosya bozuk veya degistirilmis olabilir."
exit 1
fi
tar –verify ile Arşiv Tutarlılığı
tar komutunun kendi içinde bir doğrulama mekanizması var. --verify ya da kısa formuyla -W flagini kullanarak, bir arşiv oluşturulurken ya da sonrasında içeriklerin bozulmadığını kontrol edebilirsiniz.
Önce temel kullanıma bakalım:
# Arşiv oluştururken aynı anda doğrula
tar -cvWf backup.tar /etc/
# -W parametresi: Arşiv yazıldıktan sonra dosyaları tek tek doğrular
# Çıktıda her dosya için "Verify..." satırı görürsünüz
Mevcut bir arşivi doğrulamak için:
# Arşivi açmadan sadece içeriğini doğrula
tar --compare --file=backup.tar -C /
# Ya da kısa formda
tar -df backup.tar -C /
# Bu komut, arşiv içindeki dosyaları diskteki dosyalarla karşılaştırır
# Fark varsa rapor eder
--compare (-d) ile --verify (-W) arasındaki farkı anlamak önemli:
- –verify (-W): Arşiv oluştururken kullanılır, yazan ile okunan bloğu karşılaştırır. Tape veya yazma hatası olup olmadığını kontrol eder.
- –compare (-d): Mevcut arşivi diskteki gerçek dosyalarla karşılaştırır. Arşiv alındıktan sonra dosyaların değişip değişmediğini anlamak için kullanılır.
Pratikte en çok işinize yarayan senaryo şu: Backup aldınız, aylar sonra geri dönüp “Bu backup gerçekten sağlam mı?” diye kontrol etmek istiyorsunuz.
# Arşivin içeriğini listele, bütünlük sorunlarını tespit et
tar -tvf backup.tar.gz
# t: list (içerik listesi)
# v: verbose
# f: dosya adı
# Çıktıda herhangi bir hata yoksa arşiv okuma açısından sağlam demektir
# Çıktı hata vermeden tamamlanmazsa arşiv bozuktur
Gzip ile sıkıştırılmış arşivlerde --verify doğrudan çalışmaz çünkü gzip bunu desteklemez. Bunun yerine şu yaklaşımı kullanabilirsiniz:
# Gzip bütünlüğünü test et
gzip -t backup.tar.gz && echo "Gzip katmani saglam"
# Sonra tar içeriğini listele
tar -tzf backup.tar.gz > /dev/null && echo "Tar icerigi saglam"
# İkisini birden
gzip -t backup.tar.gz && tar -tzf backup.tar.gz > /dev/null && echo "Arsiv tamamen saglam"
Gerçek Dünya: Otomatik Yedek Doğrulama Scripti
Şimdi bunları birleştirelim. Aşağıdaki script, backup dizininizdeki tüm tar.gz arşivlerini hem gzip hem içerik açısından kontrol eder, hem de SHA256 checksum üretip saklar:
#!/bin/bash
BACKUP_DIR="/opt/backups"
LOG_FILE="/var/log/backup_verify.log"
CHECKSUM_DIR="/opt/backups/checksums"
TARIH=$(date '+%Y-%m-%d %H:%M:%S')
HATALI=0
mkdir -p "$CHECKSUM_DIR"
echo "[$TARIH] Dogrulama basladi" >> "$LOG_FILE"
for arsiv in "$BACKUP_DIR"/*.tar.gz; do
dosya_adi=$(basename "$arsiv")
checksum_dosyasi="$CHECKSUM_DIR/${dosya_adi}.sha256"
# Gzip katmanını test et
if ! gzip -t "$arsiv" 2>/dev/null; then
echo "[$TARIH] HATA: $dosya_adi - Gzip bozuk" >> "$LOG_FILE"
HATALI=$((HATALI + 1))
continue
fi
# Tar içeriğini doğrula
if ! tar -tzf "$arsiv" > /dev/null 2>&1; then
echo "[$TARIH] HATA: $dosya_adi - Tar icerigi bozuk" >> "$LOG_FILE"
HATALI=$((HATALI + 1))
continue
fi
# Checksum dosyası yoksa oluştur, varsa doğrula
if [ ! -f "$checksum_dosyasi" ]; then
sha256sum "$arsiv" > "$checksum_dosyasi"
echo "[$TARIH] BILGI: $dosya_adi - Checksum olusturuldu" >> "$LOG_FILE"
else
if sha256sum -c "$checksum_dosyasi" --quiet 2>/dev/null; then
echo "[$TARIH] OK: $dosya_adi" >> "$LOG_FILE"
else
echo "[$TARIH] HATA: $dosya_adi - SHA256 eslesmedi" >> "$LOG_FILE"
HATALI=$((HATALI + 1))
fi
fi
done
echo "[$TARIH] Dogrulama tamamlandi. Hatali arsiv sayisi: $HATALI" >> "$LOG_FILE"
# Hatalı arşiv varsa mail gönder (mailutils kurulu olmalı)
if [ "$HATALI" -gt 0 ]; then
echo "Hatali yedek arsivleri tespit edildi. Log: $LOG_FILE" |
mail -s "UYARI: Yedek Dogrulama Hatasi" [email protected]
fi
exit $HATALI
Bu scripti cron’a ekleyebilirsiniz:
# Her sabah 06:00'da çalıştır
0 6 * * * /opt/scripts/backup_verify.sh
Uzak Sunucudan Transfer Senaryosu
SCP veya rsync ile dosya transfer ediyorsanız, transferin ardından doğrulama yapmak kritik bir alışkanlıktır.
# Kaynak sunucuda hash üret ve kaydet
ssh user@kaynak-sunucu "sha256sum /opt/backups/db_backup.tar.gz" > db_backup.tar.gz.sha256.uzak
# Dosyayı transfer et
scp user@kaynak-sunucu:/opt/backups/db_backup.tar.gz .
# Lokal hash hesapla ve karşılaştır
UZAK_HASH=$(cat db_backup.tar.gz.sha256.uzak | awk '{print $1}')
LOKAL_HASH=$(sha256sum db_backup.tar.gz | awk '{print $1}')
if [ "$UZAK_HASH" = "$LOKAL_HASH" ]; then
echo "Transfer basarili, dosya butunlugu dogrulandi"
else
echo "KRITIK: Transfer sirasinda bozulma tespit edildi!"
fi
rsync kullanıyorsanız, --checksum flagiyle transfer bütünlüğü otomatik kontrol edilebilir:
# Sadece boyut/tarih değil, checksum bazlı senkronizasyon
rsync -avz --checksum user@kaynak:/opt/backups/ /opt/local-backups/
sha512sum ve Diğer Alternatifler
SHA256 yetmez mi diye soruyorsanız, SHA512 de kullanabilirsiniz. Kullanım tamamen aynı:
sha512sum kritik_yedek.tar.gz > kritik_yedek.tar.gz.sha512
sha512sum -c kritik_yedek.tar.gz.sha512
b2sum ise BLAKE2 algoritmasını kullanır, SHA256’dan hem daha hızlı hem daha güvenlidir ve bazı modern sistemlerde tercih edilmeye başlanmıştır:
b2sum backup.tar.gz > backup.tar.gz.b2sum
b2sum -c backup.tar.gz.b2sum
Hangi algoritma için ne kullanmalısınız kısaca şöyle özetleyebilirim:
- md5sum: Hız önemli, güvenlik değil. İç ağ transferleri, hızlı bütünlük kontrolü.
- sha256sum: Genel amaçlı standart. Çoğu durumda bu yeterli.
- sha512sum: Yüksek güvenlik gereksinimleri, kriptografik imza süreçleri.
- b2sum: Performans ve güvenliği dengelemeniz gereken modern sistemler.
Checksum Dosyalarını Nerede Saklayın?
Bu soruyu atlamak olmaz. Checksum dosyasını doğruladığı arşivle aynı yerde saklamak, bazı senaryolarda anlamsız hale gelir. Eğer biri arşivi değiştirirse aynı zamanda checksum dosyasını da değiştirebilir.
Doğru yaklaşımlar:
- Checksum dosyasını farklı bir depolama sisteminde tutun (örneğin arşiv NAS’ta, checksum git repo’da)
- GPG ile imzalayın. Checksum dosyasını kendi private key’inizle imzalamak, değiştirilip değiştirilmediğini kesin olarak ortaya koyar
- Merkezi bir veritabanında saklayın, her backup job checksum değerini veritabanına yazar
Basit bir GPG imzalama örneği:
# SHA256 checksum oluştur ve GPG ile imzala
sha256sum kritik_backup.tar.gz > kritik_backup.sha256
gpg --clearsign kritik_backup.sha256
# Doğrulama
gpg --verify kritik_backup.sha256.asc
sha256sum -c kritik_backup.sha256
Sonuç
Bütünlük doğrulama kulağa basit bir konu gibi geliyor ama production ortamında ihmal edilen en yaygın pratiklerden biri. md5sum, sha256sum ve tar araçlarının bu özellikleri yıllardır var, ekstra bir kurulum gerektirmiyor ve her Linux dağıtımında standart olarak geliyor. Kullanmamak için hiçbir gerekçe yok.
Alışkanlık haline getirmeniz gereken üç temel pratik şunlar:
- Her backup aldıktan sonra checksum oluşturun ve ayrı bir yerde saklayın
- Uzak sunucudan dosya transfer ettikten sonra her zaman doğrulayın
- Backup doğrulama scriptinizi cron’a ekleyin, düzenli çalışmasını sağlayın
Gece yarısı restore senaryosunda arşivin bozuk çıkması, mesleğin en stresli anlarından biridir. Bu alışkanlıkları kazandığınızda, en azından “backup sağlamsa bile neden açılmıyor?” sorusunu sorma durumunda kalmayacaksınız.
