Postfix ile TLS Şifreleme Yapılandırması

Günümüzde e-posta trafiğini şifrelemeden göndermek, açık bir mektubun içeriğini herkese göstermek gibi bir şey. Özellikle kurumsal ortamlarda ya da kişisel mail sunucusu işleten sysadmin’ler için TLS yapılandırması artık bir lüks değil, zorunluluk. Postfix, dünya genelinde en yaygın kullanılan MTA (Mail Transfer Agent) olduğundan, doğru şekilde yapılandırıldığında hem güvenli hem de performanslı bir mail altyapısı sunuyor. Bu yazıda Postfix üzerinde TLS şifrelemesini adım adım nasıl yapılandıracağınızı, sertifika yönetimini ve gerçek dünyada karşılaşılan senaryoları ele alacağız.

TLS Mail Şifrelemesinde Neden Önemli?

Postfix varsayılan kurulumda TLS olmadan çalışır. Bu durum, iki mail sunucusu arasındaki iletişimin düz metin olarak aktarıldığı anlamına gelir. Ağ trafiğini dinleyebilen biri, bu mailleri kolayca okuyabilir. TLS (Transport Layer Security), bu iletişimi şifreleyerek ortadaki adam saldırılarına karşı koruma sağlar.

Postfix’te iki farklı TLS senaryosu söz konusu:

  • Gelen bağlantılar (smtpd): Başka sunucular veya mail istemcileri sizin sunucunuza bağlandığında kullanılan şifreleme
  • Giden bağlantılar (smtp): Sizin sunucunuzun başka sunuculara mail gönderirken kullandığı şifreleme

Her iki tarafı da doğru yapılandırmak gerekiyor. Sadece birini yapılandırmak, tam bir güvenlik sağlamaz.

Ön Hazırlık: Sistem Gereksinimleri

Başlamadan önce birkaç şeyi kontrol etmek gerekiyor. Postfix’in OpenSSL desteğiyle derlenmiş olması şart. Bunu kontrol etmek için:

postconf -a | grep -i tls
postconf -m | grep -i openssl

Çıktıda tlsmgr veya TLS ile ilgili ifadeler görüyorsanız hazırsınız. Ayrıca OpenSSL’in sistemde kurulu olduğunu doğrulayın:

openssl version
# Örnek çıktı: OpenSSL 3.0.2 15 Mar 2022

Debian/Ubuntu tabanlı sistemlerde gerekli paketleri yükleyelim:

apt update
apt install postfix openssl ca-certificates -y

RHEL/CentOS tabanlı sistemler için:

dnf install postfix openssl ca-certificates -y

Sertifika Hazırlama

TLS yapılandırmasının temeli sertifikalar. İki seçeneğiniz var: Let’s Encrypt ile ücretsiz sertifika almak ya da self-signed (kendinden imzalı) sertifika oluşturmak. Production ortamlarda kesinlikle Let’s Encrypt veya ticari bir CA’dan alınmış sertifika kullanmanızı öneririm.

Let’s Encrypt ile Sertifika Alma

Certbot kullanarak sertifika almak oldukça kolay. Mail sunucunuzun hostname’i için sertifika alıyoruz:

apt install certbot -y
certbot certonly --standalone -d mail.sirketim.com --email [email protected] --agree-tos

# Sertifika dosyalarının yolu:
# /etc/letsencrypt/live/mail.sirketim.com/fullchain.pem
# /etc/letsencrypt/live/mail.sirketim.com/privkey.pem

Certbot aldıktan sonra Postfix’in bu dosyaları okuyabilmesi için izinleri düzenleyin:

chmod 750 /etc/letsencrypt/live/
chmod 750 /etc/letsencrypt/archive/
chown root:postfix /etc/letsencrypt/live/
chown root:postfix /etc/letsencrypt/archive/

Self-Signed Sertifika Oluşturma

Test ortamları veya iç ağ kullanımı için self-signed sertifika yeterli olabilir. Şunu unutmayın: self-signed sertifikalar dış mail sunucularıyla iletişimde uyarılara yol açabilir, ancak şifreleme yine de çalışır.

mkdir -p /etc/postfix/ssl
cd /etc/postfix/ssl

# Private key ve self-signed sertifika oluştur
openssl req -new -x509 -days 3650 -nodes 
  -out /etc/postfix/ssl/postfix.crt 
  -keyout /etc/postfix/ssl/postfix.key 
  -subj "/C=TR/ST=Istanbul/L=Istanbul/O=Sirketim/CN=mail.sirketim.com"

# İzinleri ayarla
chmod 600 /etc/postfix/ssl/postfix.key
chmod 644 /etc/postfix/ssl/postfix.crt
chown root:root /etc/postfix/ssl/postfix.key

Postfix TLS Yapılandırması

Asıl yapılandırma /etc/postfix/main.cf dosyasında gerçekleşiyor. TLS ayarlarını iki bölümde ele alalım.

Gelen Bağlantılar İçin TLS (SMTPD)

SMTPD TLS, diğer mail sunucularının ve istemcilerin sizin sunucunuza şifreli bağlanmasını sağlar. main.cf dosyasına şu satırları ekleyin:

# /etc/postfix/main.cf - Gelen bağlantılar (SMTPD) TLS ayarları

# Sertifika dosyaları - Let's Encrypt kullananlar için:
smtpd_tls_cert_file = /etc/letsencrypt/live/mail.sirketim.com/fullchain.pem
smtpd_tls_key_file = /etc/letsencrypt/live/mail.sirketim.com/privkey.pem

# Self-signed kullananlar için (yukarıdaki satırları bu şekilde değiştirin):
# smtpd_tls_cert_file = /etc/postfix/ssl/postfix.crt
# smtpd_tls_key_file = /etc/postfix/ssl/postfix.key

# TLS oturum önbelleği - performans için önemli
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache

# TLS güvenlik seviyesi: may = TLS mümkünse kullan, zorunlu değil
smtpd_tls_security_level = may

# TLS log seviyesi (0=kapalı, 1=özet, 2=detaylı, 3=çok detaylı)
smtpd_tls_loglevel = 1

# Received header'a TLS bilgisi ekle
smtpd_tls_received_header = yes

# Oturum önbellek süresi (saniye)
smtpd_tls_session_cache_timeout = 3600s

# Güvenli protokoller - eski ve zayıf protokolleri devre dışı bırak
smtpd_tls_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1
smtpd_tls_mandatory_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1

# Güvenli cipher suite'ler
smtpd_tls_ciphers = high
smtpd_tls_mandatory_ciphers = high
smtpd_tls_exclude_ciphers = aNULL, eNULL, EXPORT, DES, RC4, MD5, PSK, aECDH, EDH-DSS-DES-CBC3-SHA, EDH-RSA-DES-CBC3-SHA, KRB5-DES-CBC3-SHA

Giden Bağlantılar İçin TLS (SMTP Client)

Giden TLS, sizin sunucunuzun dış dünyaya mail gönderirken şifreleme kullanmasını sağlar:

# /etc/postfix/main.cf - Giden bağlantılar (SMTP) TLS ayarları

# Giden TLS güvenlik seviyesi
smtp_tls_security_level = may

# CA sertifikaları - karşı tarafın sertifikasını doğrulamak için
smtp_tls_CAfile = /etc/ssl/certs/ca-certificates.crt

# Oturum önbelleği
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache

# TLS log seviyesi
smtp_tls_loglevel = 1

# Protokol kısıtlamaları
smtp_tls_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1
smtp_tls_mandatory_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1

# Cipher suite'ler
smtp_tls_ciphers = high
smtp_tls_mandatory_ciphers = high

Değişiklikleri uygulamak için:

postfix check
systemctl reload postfix

STARTTLS ve SMTPS Yapılandırması

Postfix’te iki farklı TLS yöntemi var: STARTTLS (port 587 veya 25 üzerinde) ve SMTPS (port 465 üzerinde). Modern yapılandırmalarda her ikisini de aktif etmek iyi bir pratik.

/etc/postfix/master.cf dosyasını düzenleyelim:

# /etc/postfix/master.cf
# Port 587 - Submission (STARTTLS)
submission inet n       -       y       -       -       smtpd
  -o syslog_name=postfix/submission
  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_tls_auth_only=yes
  -o smtpd_reject_unlisted_recipient=no
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
  -o milter_macro_daemon_name=ORIGINATING

# Port 465 - SMTPS (SSL/TLS wrapper)
smtps     inet  n       -       y       -       -       smtpd
  -o syslog_name=postfix/smtps
  -o smtpd_tls_wrappermode=yes
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_reject_unlisted_recipient=no
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
  -o milter_macro_daemon_name=ORIGINATING

Bu yapılandırmadan sonra Postfix’i yeniden başlatın:

systemctl restart postfix
ss -tlnp | grep master
# 25, 465, 587 portlarının dinlendiğini görmeli

DH Parametreleri ile Perfect Forward Secrecy

Perfect Forward Secrecy (PFS), oturum anahtarlarının gelecekteki sızıntılardan etkilenmemesini sağlar. Postfix’e Diffie-Hellman parametrelerini eklemek bu özelliği aktif eder:

# DH parametresi oluştur (bu işlem birkaç dakika sürebilir)
openssl dhparam -out /etc/postfix/dh2048.pem 2048
openssl dhparam -out /etc/postfix/dh512.pem 512

chmod 644 /etc/postfix/dh2048.pem
chmod 644 /etc/postfix/dh512.pem

Bu parametreleri main.cf‘e ekleyin:

# main.cf'e eklenecek DH parametreleri
smtpd_tls_dh1024_param_file = /etc/postfix/dh2048.pem
smtpd_tls_dh512_param_file = /etc/postfix/dh512.pem

TLS Policy Map ile Domain Bazlı Şifreleme

Bazı durumlarda belirli domainler için farklı TLS politikaları uygulamak isteyebilirsiniz. Örneğin, kritik iş ortaklarınızla iletişimde zorunlu şifreleme kullanmak, diğer domainler için esnek bir yaklaşım benimsemek mantıklı olabilir.

# /etc/postfix/tls_policy dosyası oluştur
cat > /etc/postfix/tls_policy << 'EOF'
# Kritik iş ortakları - TLS zorunlu
ortak-firma.com     encrypt
banka.com.tr        encrypt match

# Belirli IP ile zorunlu TLS
[192.168.1.100]     encrypt

# Varsayılan politika
*                   may
EOF

# Policy map'i derle
postmap /etc/postfix/tls_policy

main.cf‘e ekleyin:

smtp_tls_policy_maps = hash:/etc/postfix/tls_policy

Policy seçeneklerinin anlamları:

  • none: TLS kullanma
  • may: TLS mümkünse kullan
  • encrypt: TLS zorunlu, doğrulama gerekmez
  • dane: DNSSEC ve TLSA record ile doğrulama
  • verify: Sertifika doğrulaması yap
  • secure: Hem şifreleme hem tam doğrulama

Let’s Encrypt Sertifika Yenileme Otomasyonu

Let’s Encrypt sertifikaları 90 günde bir yenilenir. Postfix’in yeni sertifikaları otomatik olarak alması için bir hook script yazalım:

# /etc/letsencrypt/renewal-hooks/deploy/postfix-reload.sh
cat > /etc/letsencrypt/renewal-hooks/deploy/postfix-reload.sh << 'EOF'
#!/bin/bash
# Postfix TLS sertifika yenileme hook scripti

DOMAIN="mail.sirketim.com"
LOG_FILE="/var/log/letsencrypt-postfix.log"

echo "$(date): Sertifika yenilendi, Postfix yeniden yükleniyor..." >> $LOG_FILE

# Postfix izinlerini güncelle
chmod 750 /etc/letsencrypt/live/
chmod 750 /etc/letsencrypt/archive/
chown root:postfix /etc/letsencrypt/live/
chown root:postfix /etc/letsencrypt/archive/

# Postfix yapılandırmasını kontrol et ve yeniden yükle
if postfix check 2>/dev/null; then
    systemctl reload postfix
    echo "$(date): Postfix başarıyla yeniden yüklendi." >> $LOG_FILE
else
    echo "$(date): HATA: Postfix yapılandırma hatası!" >> $LOG_FILE
    exit 1
fi
EOF

chmod +x /etc/letsencrypt/renewal-hooks/deploy/postfix-reload.sh

Certbot’un otomatik yenileme timer’ını kontrol edin:

systemctl status certbot.timer
# Aktif değilse:
systemctl enable --now certbot.timer

TLS Yapılandırmasını Test Etme

Yapılandırmayı test etmek için birkaç farklı yöntem kullanabilirsiniz.

OpenSSL ile Manuel Test

# STARTTLS testi (port 25)
openssl s_client -starttls smtp -connect mail.sirketim.com:25 -showcerts

# STARTTLS testi (port 587)
openssl s_client -starttls smtp -connect mail.sirketim.com:587

# SMTPS testi (port 465)
openssl s_client -connect mail.sirketim.com:465

# TLS versiyonunu görüntüle
openssl s_client -starttls smtp -connect mail.sirketim.com:25 2>/dev/null | grep -E "Protocol|Cipher"

Postfix Log Analizi

TLS bağlantılarını loglardan takip edebilirsiniz:

# TLS ile ilgili log kayıtlarını filtrele
tail -f /var/log/mail.log | grep -i TLS

# Başarılı TLS bağlantılarını say
grep "TLS connection established" /var/log/mail.log | wc -l

# Hangi TLS versiyonlarının kullanıldığını gör
grep "TLS connection established" /var/log/mail.log | 
  grep -oP "TLSv[0-9.]+.*?:.*?Cipher" | sort | uniq -c | sort -rn

MXToolbox ve Çevrimiçi Test Araçları

Şu araçları kullanarak dışarıdan test yapabilirsiniz:

  • mail-tester.com: Genel mail sağlık kontrolü
  • mxtoolbox.com/SuperTool: MX, TLS ve blacklist kontrolü
  • checktls.com: TLS yapılandırma detaylı analizi
  • internet.nl: Mail güvenlik standartları kontrolü

Gerçek Dünya Senaryosu: Kurumsal Mail Sunucusu

Bir müşteri için yapılandırdığım gerçek bir senaryoyu paylaşayım. Orta ölçekli bir şirketin mail altyapısını güçlendirirken şu ihtiyaçlar ortaya çıktı: Muhasebe departmanı hassas mali belgeler içeren mailler gönderiyordu, HR departmanının iletişimlerinin şifrelenmesi yasal zorunluluktu ve bazı iş ortaklarıyla zorunlu TLS kullanılması anlaşmaya bağlanmıştı.

Bu senaryo için uyguladığım final main.cf yapılandırması:

# /etc/postfix/main.cf - Kurumsal TLS Yapılandırması

# === SMTPD (Gelen) TLS ===
smtpd_tls_cert_file = /etc/letsencrypt/live/mail.sirketim.com/fullchain.pem
smtpd_tls_key_file = /etc/letsencrypt/live/mail.sirketim.com/privkey.pem
smtpd_tls_CAfile = /etc/ssl/certs/ca-certificates.crt
smtpd_tls_security_level = may
smtpd_tls_auth_only = yes
smtpd_tls_loglevel = 1
smtpd_tls_received_header = yes
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtpd_tls_session_cache_timeout = 3600s
smtpd_tls_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1
smtpd_tls_mandatory_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1
smtpd_tls_ciphers = high
smtpd_tls_mandatory_ciphers = high
smtpd_tls_dh1024_param_file = /etc/postfix/dh2048.pem
smtpd_tls_exclude_ciphers = aNULL, eNULL, EXPORT, DES, RC4, MD5, PSK

# === SMTP (Giden) TLS ===
smtp_tls_security_level = may
smtp_tls_CAfile = /etc/ssl/certs/ca-certificates.crt
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
smtp_tls_loglevel = 1
smtp_tls_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1
smtp_tls_mandatory_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1
smtp_tls_ciphers = high
smtp_tls_policy_maps = hash:/etc/postfix/tls_policy

Bu yapılandırmayla TLS kullanım oranı %23’ten %89’a çıktı. Geri kalan %11, TLS desteklemeyen eski mail sunucularından geliyordu.

Yaygın Sorunlar ve Çözümleri

Sertifika okunamıyor hatası: Postfix servisinin sertifika dosyalarını okuma izni olmayabilir. postfix check çıktısına ve /var/log/mail.log dosyasına bakın. Özellikle Let’s Encrypt kullananlar için /etc/letsencrypt/ dizin izinlerini kontrol edin.

TLS handshake hatası: smtpd_tls_loglevel = 2 yaparak detaylı log alın. Genellikle cipher uyumsuzluğu ya da protokol versiyonu sorunudur. smtpd_tls_protocols satırını geçici olarak kaldırarak test edin.

Port 587 çalışmıyor: master.cf dosyasındaki submission satırının başında boşluk olmadığından emin olun. Sonraki satırlar (override seçenekleri) iki boşlukla başlamalı.

Sertifika yenileme sonrası TLS çalışmıyor: Let’s Encrypt symlink’lerini kontrol edin. /etc/letsencrypt/live/ altındaki dosyalar symbolic link. Deploy hook scriptinin çalıştığını doğrulayın.

Sonuç

Postfix üzerinde TLS yapılandırması ilk bakışta karmaşık görünse de adım adım ilerlediğinizde oldukça sistematik bir süreç. Özetlemek gerekirse: önce sertifikalarınızı hazırlayın, hem gelen hem giden TLS’i yapılandırın, DH parametreleriyle PFS ekleyin ve kritik domainler için TLS policy map kullanın.

Production ortamda kesinlikle Let’s Encrypt veya ticari sertifika kullanın. Sertifika yenileme otomasyonunu mutlaka kurun ve düzenli olarak logları kontrol ederek TLS kullanım oranınızı takip edin. Mail sunucunuzu düzenli aralıklarla checktls.com veya benzeri araçlarla dışarıdan test etmek, gözden kaçırdığınız sorunları erkenden yakalamanıza yardımcı olur.

TLS tek başına tüm mail güvenliğinizi sağlamaz. DKIM, SPF ve DMARC ile birlikte kullanıldığında gerçek anlamda sağlam bir mail altyapısı ortaya çıkar. O konuları da ilerleyen yazılarda ele alacağız.

Yorum yapın