GPG ile Dosya Şifreleme ve Dijital İmza Kullanımı

Güvenli iletişim ve veri koruma söz konusu olduğunda GPG (GNU Privacy Guard), sysadmin dünyasının en güvenilir araçlarından biri olmaya devam ediyor. Özellikle hassas konfigürasyon dosyalarını şifrelemeniz, backup arşivlerinizi güvence altına almanız veya gönderdiğiniz dosyaların gerçekten sizden geldiğini kanıtlamanız gerektiğinde GPG’nin gücünü anlıyorsunuz. Bu yazıda GPG’yi sıfırdan kurarak gerçek dünya senaryolarında nasıl kullanacağınızı adım adım ele alacağız.

GPG Nedir ve Neden Önemlidir?

GPG, OpenPGP standardını (RFC 4880) uygulayan açık kaynaklı bir şifreleme yazılımıdır. Asimetrik şifreleme mantığıyla çalışır: bir public key (açık anahtar) ve bir private key (özel anahtar) çifti oluşturursunuz. Public key’inizi herkesle paylaşırsınız, private key’inizi ise asla kimseyle paylaşmazsınız.

Temel kullanım senaryoları şunlardır:

  • Dosya şifreleme: Yetkisiz kişilerin okuyamayacağı şifreli dosyalar oluşturma
  • Dijital imza: Bir dosyanın gerçekten sizden geldiğini ve değiştirilmediğini kanıtlama
  • E-posta güvenliği: Şifreli ve imzalı e-posta iletişimi
  • Backup güvenliği: Uzak sunuculara veya buluta yüklenen yedeklerin korunması
  • Paket doğrulama: Linux paket yöneticilerinin repo imzalarını doğrulaması

Bir sysadmin olarak özellikle backup senaryosunda GPG hayat kurtarır. AWS S3 veya başka bir bulut depolamaya attığınız veritabanı yedeğinin şifreli olması, veri sızıntısı durumunda sizi ciddi bir felaketten kurtarır.

Kurulum ve İlk Anahtar Çifti Oluşturma

Çoğu Linux dağıtımında GPG zaten kurulu gelir. Değilse kolayca kurabilirsiniz:

# Debian/Ubuntu
sudo apt update && sudo apt install gnupg2 -y

# RHEL/CentOS/Fedora
sudo dnf install gnupg2 -y

# Arch Linux
sudo pacman -S gnupg

# Versiyon kontrolü
gpg --version

Kurulum tamamlandıktan sonra ilk iş anahtar çiftinizi oluşturmak. GPG 2.1 ve sonrasında interaktif bir sihirbaz kullanabilirsiniz:

gpg --full-generate-key

Bu komut sizi adım adım yönlendirir. Seçenekler şu şekilde gelecektir:

  • Anahtar türü: RSA and RSA (1. seçenek, önerilen)
  • Anahtar uzunluğu: 4096 bit (güvenlik için minimum 2048, tercihen 4096)
  • Geçerlilik süresi: 2y (2 yıl önerilir, 0 sonsuz anlamına gelir)
  • Gerçek ad: Adınız veya sistem adı
  • E-posta: Geçerli bir e-posta adresi
  • Yorum: Opsiyonel, boş bırakabilirsiniz
  • Passphrase: Güçlü bir parola (bu çok kritik!)

Passphrase’i asla boş bırakmayın. Private key’iniz çalınsa bile passphrase olmadan kullanılamaz.

Oluşturulan anahtarları görmek için:

# Public key listesi
gpg --list-keys

# Private key listesi
gpg --list-secret-keys --keyid-format LONG

# Örnek çıktı:
# sec   rsa4096/3AA5C34371567BD2 2024-01-15 [SC]
#       Key fingerprint = ABCD 1234 5678 90AB CDEF  GHIJ KLMN OPQR STUV WXYZ
# uid   [ultimate] Ali Veli <[email protected]>
# ssb   rsa4096/42B317FD4BA89E7A 2024-01-15 [E]

Public Key Paylaşımı ve Key Server Kullanımı

Başkalarının size şifreli mesaj gönderebilmesi için public key’inizi paylaşmanız gerekir. Bunu birkaç yöntemle yapabilirsiniz.

Public key’i dosyaya export etmek:

# ASCII armored format (e-postayla veya web sitesine eklemeye uygun)
gpg --armor --export [email protected] > ali_public_key.asc

# Binary format
gpg --export [email protected] > ali_public_key.gpg

# Keyserver'a yükleme (KEY_ID'yi kendi ID'nizle değiştirin)
gpg --keyserver keys.openpgp.org --send-keys 3AA5C34371567BD2

# Başkasının public key'ini keyserver'dan indirme
gpg --keyserver keys.openpgp.org --recv-keys 3AA5C34371567BD2

# Dosyadan import etme
gpg --import ali_public_key.asc

Key fingerprint doğrulaması çok önemlidir. Birinin public key’ini aldığınızda, o kişiyle farklı bir kanaldan (telefon, yüz yüze) fingerprint’i karşılaştırın. Bu, man-in-the-middle saldırılarına karşı kritik bir önlemdir.

Dosya Şifreleme: Temel ve İleri Düzey Kullanım

Asimetrik Şifreleme (Alıcının Public Key’iyle)

En yaygın senaryo: Bir dosyayı belirli bir kişiye güvenli şekilde göndermek istiyorsunuz. Alıcının public key’ini import ettikten sonra:

# Tek alıcı için şifreleme
gpg --encrypt --armor --recipient [email protected] gizli_rapor.pdf

# Çıktı: gizli_rapor.pdf.asc

# Birden fazla alıcı (örneğin hem alıcı hem de kendiniz okuyabilsin)
gpg --encrypt --armor 
    --recipient [email protected] 
    --recipient [email protected] 
    --recipient [email protected] 
    gizli_rapor.pdf

# Şifre çözme (private key ve passphrase gerekli)
gpg --decrypt gizli_rapor.pdf.asc > gizli_rapor_decrypted.pdf

# Veya doğrudan output file belirtme
gpg --output gizli_rapor_decrypted.pdf --decrypt gizli_rapor.pdf.asc

Simetrik Şifreleme (Parola ile)

Bazen bir dosyayı GPG key’i olmayan biriyle paylaşmanız veya sadece kendiniz için şifrelemeniz gerekebilir. Simetrik şifreleme bu durumda işe yarar:

# AES256 ile simetrik şifreleme
gpg --symmetric --cipher-algo AES256 --armor veritabani_yedek.sql

# Şifre çözme
gpg --decrypt veritabani_yedek.sql.asc > veritabani_yedek_decrypted.sql

# Batch modda şifreleme (script içinde kullanım için)
echo "cok_guclu_parola" | gpg --batch --yes 
    --passphrase-fd 0 
    --symmetric --cipher-algo AES256 
    --output backup.sql.gpg 
    backup.sql

Dizin Şifreleme

GPG tek dosya üzerinde çalışır, bu yüzden dizinleri önce sıkıştırmanız gerekir:

# Dizini tar ile sıkıştırıp GPG ile şifrele (pipe kullanarak)
tar czf - /etc/nginx/ | gpg --encrypt --armor 
    --recipient [email protected] 
    --output nginx_config_backup.tar.gz.asc

# Şifre çöz ve aç
gpg --decrypt nginx_config_backup.tar.gz.asc | tar xzf - -C /tmp/restore/

Dijital İmza: Dosyanın Bütünlüğünü ve Kimliğini Kanıtlamak

Dijital imza iki şeyi kanıtlar: dosyanın sizin tarafınızdan imzalandığını ve imzalamadan bu yana değiştirilmediğini. Bu özellikle dağıttığınız scriptler, konfigürasyon dosyaları veya yazılım paketleri için kritiktir.

# Ayrı imza dosyası oluşturma (.sig uzantısı)
gpg --detach-sign --armor deploy_script.sh
# Çıktı: deploy_script.sh.asc

# İmzayı doğrulama
gpg --verify deploy_script.sh.asc deploy_script.sh

# Başarılı doğrulama çıktısı:
# gpg: Signature made Mon 15 Jan 2024 10:30:00 AM UTC
# gpg:                using RSA key 3AA5C34371567BD2
# gpg: Good signature from "Ali Veli <[email protected]>" [ultimate]

# Dosyayı ve imzayı tek dosyada birleştirme (clearsign)
gpg --clearsign README.txt
# Çıktı: README.txt.asc (hem metin hem imza içerir)

# İmzalayıp aynı zamanda şifrele
gpg --sign --encrypt --armor 
    --recipient [email protected] 
    onemli_belge.pdf

İmza doğrulama çıktısında dikkat etmeniz gereken durum: Good signature yazısını gördükten sonra [unknown] veya [unverified] görürseniz bu, o kişinin public key’ini import ettiğinizi ama güvenilir olduğunu onaylamadığınız anlamına gelir. Key’e güven atamak için web of trust mekanizmasını kullanabilirsiniz.

Gerçek Dünya Senaryosu: Otomatik Şifreli Backup Sistemi

Gelin pratik bir senaryo üzerinden gidelim. Bir production veritabanı sunucunuz var ve her gece backup alıp uzak bir sunucuya veya S3’e göndermek istiyorsunuz, üstelik backup şifreli olsun.

Önce script’in çalıştığı sunucuya backup alıcısının public key’ini import edin:

# Backup alıcısının public key'ini import et
gpg --import backup_admin_public.asc

# Trust level'ı ayarla
gpg --edit-key [email protected]
# gpg> trust
# 5 = I trust ultimately
# gpg> quit

Şimdi backup scriptini yazalım:

#!/bin/bash
# /usr/local/bin/encrypted_backup.sh

set -euo pipefail

# Değişkenler
DB_NAME="production_db"
DB_USER="backup_user"
BACKUP_DIR="/var/backups/db"
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_FILE="${BACKUP_DIR}/${DB_NAME}_${DATE}.sql"
ENCRYPTED_FILE="${BACKUP_FILE}.gpg"
GPG_RECIPIENT="[email protected]"
REMOTE_SERVER="backup-server.company.com"
REMOTE_PATH="/backups/databases/"
RETENTION_DAYS=30
LOG_FILE="/var/log/backup.log"

# Log fonksiyonu
log() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "${LOG_FILE}"
}

# Backup dizini oluştur
mkdir -p "${BACKUP_DIR}"

log "Backup başlatılıyor: ${DB_NAME}"

# Veritabanı dump al
if mysqldump -u "${DB_USER}" 
    --single-transaction 
    --routines 
    --triggers 
    "${DB_NAME}" > "${BACKUP_FILE}"; then
    log "Database dump başarılı: $(du -sh ${BACKUP_FILE} | cut -f1)"
else
    log "HATA: Database dump başarısız!"
    exit 1
fi

# GPG ile şifrele
if gpg --batch --yes 
    --trust-model always 
    --encrypt 
    --recipient "${GPG_RECIPIENT}" 
    --output "${ENCRYPTED_FILE}" 
    "${BACKUP_FILE}"; then
    log "Şifreleme başarılı: ${ENCRYPTED_FILE}"
    # Şifresiz backup'ı sil
    rm -f "${BACKUP_FILE}"
else
    log "HATA: Şifreleme başarısız!"
    rm -f "${BACKUP_FILE}"
    exit 1
fi

# Uzak sunucuya aktar
if rsync -az --remove-source-files 
    "${ENCRYPTED_FILE}" 
    "${REMOTE_SERVER}:${REMOTE_PATH}"; then
    log "Transfer başarılı: ${REMOTE_SERVER}"
else
    log "UYARI: Transfer başarısız, lokal kopya korunuyor"
fi

# Eski backupları temizle (lokal)
find "${BACKUP_DIR}" -name "*.gpg" 
    -mtime +"${RETENTION_DAYS}" -delete
log "Eski backuplar temizlendi (${RETENTION_DAYS} günden eski)"

log "Backup tamamlandı"

Bu scripti crontab’a ekleyin:

# Her gece 02:00'de çalıştır
0 2 * * * /usr/local/bin/encrypted_backup.sh

Anahtar Yönetimi: Revokasyon ve Yedekleme

Anahtar yönetimi GPG kullanımının en kritik ama en çok ihmal edilen kısmıdır.

Revokasyon Sertifikası Oluşturma

Anahtar oluşturur oluşturmaz bir revokasyon sertifikası üretin ve güvenli bir yerde saklayın. Private key’iniz çalınırsa veya passphrase’i unutursanız bu sertifikayla anahtarı geçersiz kılabilirsiniz:

# Revokasyon sertifikası oluştur
gpg --gen-revoke --armor [email protected] > revokasyon_sertifikasi.asc

# Bu dosyayı USB'ye kaydet, kasaya kilitle, asla internete koyma!
chmod 600 revokasyon_sertifikasi.asc

# Gerektiğinde kullanım
gpg --import revokasyon_sertifikasi.asc
gpg --keyserver keys.openpgp.org --send-keys 3AA5C34371567BD2

Anahtar Yedekleme ve Taşıma

# Private key'i export et (bu dosyayı çok güvenli sakla!)
gpg --armor --export-secret-keys [email protected] > private_key_backup.asc
chmod 600 private_key_backup.asc

# Public key'i export et
gpg --armor --export [email protected] > public_key.asc

# Yeni sistemde import et
gpg --import private_key_backup.asc
gpg --import public_key.asc

# Trust database'i yeniden oluştur
gpg --edit-key [email protected]
# gpg> trust
# 5
# gpg> quit

# Tüm keyring'i başka sisteme taşıma
tar czf gpg_keyring_backup.tar.gz ~/.gnupg/

GPG Agent ve Passphrase Yönetimi

Özellikle scriptlerde veya sık kullanımda her seferinde passphrase girmek can sıkıcı olabilir. GPG agent bu sorunu çözer:

# GPG agent durumunu kontrol et
gpg-agent --version
echo $GPG_AGENT_INFO

# Agent'ı başlat (genellikle otomatik başlar)
gpgconf --launch gpg-agent

# Cache süresini ayarla (~/.gnupg/gpg-agent.conf)
cat >> ~/.gnupg/gpg-agent.conf << 'EOF'
# Passphrase'i 8 saat cache'le (saniye cinsinden)
default-cache-ttl 28800
max-cache-ttl 86400
EOF

# Agent'ı yeniden yükle
gpg-connect-agent reloadagent /bye

# Pinentry programını ayarla (terminal veya GUI)
# Terminal pinentry için:
echo "pinentry-program /usr/bin/pinentry-curses" >> ~/.gnupg/gpg-agent.conf

Güvenlik İpuçları ve Yaygın Hatalar

GPG kullanırken dikkat etmeniz gereken önemli noktalar:

  • Private key güvenliği: Private key dosyasını asla e-postayla göndermeyin, Slack’e yapıştırmayın veya Git repo’ya commit etmeyin. Bu hatayı yapanları gördüm, sonuçları feci oldu.
  • Passphrase gücü: En az 20 karakter, büyük/küçük harf, rakam ve özel karakter içeren bir passphrase kullanın. Passphrase manager’a kaydedin.
  • Anahtar süresi: Sonsuz geçerlilik süresi cazip görünse de 1-2 yıllık süreler tercih edin. Süresi dolan anahtarı uzatabilirsiniz ama çalınan bir anahtarın sonsuz geçerliliği felaket olur.
  • Web of trust: Özellikle kurumsal ortamda key signing party düzenleyin veya en azından kritik ekip üyelerinin fingerprint’lerini yüz yüze doğrulayın.
  • –trust-model always kullanımı: Yukardaki backup scriptinde kullandığım bu parametreyi production’da dikkatli kullanın. Scriptin çalıştığı ortamda trust seviyesini manuel olarak ayarlamak daha güvenlidir.
  • Şifreli dosyaları isimlendirme: gizli_musteri_verileri.sql.gpg gibi isimler bile meta veri sızdırır. Mümkünse nötr isimler kullanın.

Sonuç

GPG, karmaşık görünümüne rağmen pratikte oldukça kullanışlı bir araçtır. Bir kez iş akışınıza entegre ettiğinizde backup güvenliğinden deployment scriptlerinizin doğrulamasına kadar pek çok alanda hayatınızı kolaylaştırır. Özellikle şu üç alışkanlığı edinin: backup’larınızı her zaman şifreleyin, dağıttığınız scriptleri imzalayın ve revokasyon sertifikalarınızı mutlaka güvenli bir yerde saklayın.

Kurumsal ortamlarda GPG’yi Ansible vault veya HashiCorp Vault gibi araçlarla birlikte kullanmak çok daha güçlü bir güvenlik katmanı sağlar. Bu entegrasyonları da ilerleyen yazılarda ele alacağız. Sorularınız veya farklı kullanım senaryolarınız varsa yorumlarda paylaşın.

Bir yanıt yazın

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