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.gpggibi 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.
