Dovecot SSL/TLS Yapılandırması

Mail sunucunuzda SSL/TLS yapılandırması, hem kullanıcı güvenliği hem de modern mail protokollerinin gereksinimleri açısından artık bir lüks değil, zorunluluk. Özellikle Dovecot çalıştıran bir ortamda bu yapılandırmayı eksik veya yanlış yapmak; veri sızıntısından tutun da mail istemcilerinin bağlantıyı reddetmesine kadar ciddi sorunlara yol açabiliyor. Bu yazıda Dovecot üzerinde SSL/TLS yapılandırmasını sıfırdan ele alacağız, gerçek dünya senaryolarıyla olası sorunları ve çözümlerini inceleyeceğiz.

SSL/TLS Neden Bu Kadar Önemli?

Dovecot, IMAP ve POP3 protokollerini sunan mail erişim sunucusudur. Kullanıcılar Outlook, Thunderbird veya telefondaki mail uygulamaları ile sunucunuza bağlandığında, eğer bağlantı şifrelenmemişse kullanıcı adı, parola ve tüm mail içerikleri ağ üzerinde açık metin olarak gider. Bir coffee shop’ta oturan biri bile basit bir araçla bu trafiği yakalayabilir.

Bunun yanı sıra GDPR, KVKK gibi veri koruma düzenlemeleri de mail iletişiminin şifrelenmesini fiilen zorunlu kılıyor. Kurumsal ortamlarda denetçiler bu yapılandırmayı kontrol ediyor ve eksiklik ciddi yaptırımlara neden olabiliyor.

Temel Kavramlar

Devam etmeden önce birkaç kavramı netleştirelim:

  • SSL/TLS: Şifreleme protokolleri. SSL artık kullanılmıyor, TLS kullanılıyor ama terminoloji olarak hala “SSL” deniyor.
  • STARTTLS: Düz bir bağlantıyı şifreli hale yükselten mekanizma. 143 (IMAP) ve 110 (POP3) portlarında kullanılır.
  • Implicit TLS (SSL/TLS): Bağlantı baştan itibaren şifreli kurulur. 993 (IMAPS) ve 995 (POP3S) portlarında kullanılır.
  • Sertifika: Sunucunun kimliğini doğrulayan dijital belge. Let’s Encrypt, ticari CA veya self-signed olabilir.

Günümüzde Implicit TLS tercih edilen yöntemdir. STARTTLS downgrade saldırılarına karşı savunmasız olabileceği için modern yapılandırmalarda implicit TLS öne çıkıyor.

Önkoşullar ve Sistem Hazırlığı

Dovecot’u kurmak için öncelikle sisteminizin güncel olduğundan emin olun:

# Ubuntu/Debian
apt update && apt upgrade -y
apt install dovecot-core dovecot-imapd dovecot-pop3d

# CentOS/RHEL/AlmaLinux
dnf update -y
dnf install dovecot

Dovecot’un sürümünü kontrol edin, özellikle eski sürümlerde bazı direktifler farklı çalışıyor:

dovecot --version
# Örnek çıktı: 2.3.21 (9a8b7c6d4)

Sertifika Edinimi

Let’s Encrypt ile Ücretsiz Sertifika

Üretim ortamlarında kesinlikle Let’s Encrypt kullanmanızı öneririm. Self-signed sertifika mail istemcilerinde uyarı vermesi bir yana, kurumsal ortamlarda güven sorunlarına yol açar.

# Certbot kurulumu
apt install certbot

# Standalone mod ile sertifika al (80 portu açık olmalı)
certbot certonly --standalone -d mail.example.com

# Eğer web sunucu varsa (Nginx)
certbot certonly --webroot -w /var/www/html -d mail.example.com

# Sertifika dosyalarının konumu
ls -la /etc/letsencrypt/live/mail.example.com/
# fullchain.pem  -> Sertifika zinciri
# privkey.pem    -> Özel anahtar
# cert.pem       -> Sadece sertifika
# chain.pem      -> Ara sertifikalar

Certbot’un otomatik yenileme için systemd timer veya cron ayarını kontrol edin:

# Systemd timer durumu
systemctl status certbot.timer

# Manuel test
certbot renew --dry-run

# Dovecot'un yeni sertifikayı otomatik yüklemesi için hook ekle
cat > /etc/letsencrypt/renewal-hooks/post/dovecot-reload.sh << 'EOF'
#!/bin/bash
systemctl reload dovecot
EOF
chmod +x /etc/letsencrypt/renewal-hooks/post/dovecot-reload.sh

Self-Signed Sertifika (Test Ortamı)

Test veya iç ağ ortamları için self-signed sertifika oluşturabilirsiniz:

# Özel anahtar ve sertifika oluştur
openssl req -x509 -nodes -days 365 -newkey rsa:4096 
  -keyout /etc/dovecot/private/dovecot.key 
  -out /etc/dovecot/certs/dovecot.pem 
  -subj "/C=TR/ST=Istanbul/L=Istanbul/O=MyCompany/CN=mail.example.com"

# Dosya izinlerini ayarla
chmod 600 /etc/dovecot/private/dovecot.key
chmod 644 /etc/dovecot/certs/dovecot.pem
chown dovecot:dovecot /etc/dovecot/private/dovecot.key

Dovecot SSL Yapılandırması

Ana yapılandırma dosyası /etc/dovecot/conf.d/10-ssl.conf dosyasında bulunur. Bu dosyayı açıp düzenleyelim:

# Önce yedeğini al
cp /etc/dovecot/conf.d/10-ssl.conf /etc/dovecot/conf.d/10-ssl.conf.bak

# Düzenle
nano /etc/dovecot/conf.d/10-ssl.conf

Temel SSL yapılandırması şu şekilde olmalı:

# SSL aktif et
ssl = required

# Sertifika dosyaları (Let's Encrypt)
ssl_cert = </etc/letsencrypt/live/mail.example.com/fullchain.pem
ssl_key = </etc/letsencrypt/live/mail.example.com/privkey.pem

# Minimum TLS sürümü - TLS 1.2'den aşağısını reddet
ssl_min_protocol = TLSv1.2

# Güvenli cipher listesi
ssl_cipher_list = ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384

# Sunucu cipher tercihini kullan
ssl_prefer_server_ciphers = yes

# DH parametreleri
ssl_dh = </etc/dovecot/dh.pem

# OCSP stapling (sertifika geçerliliği kontrolü)
ssl_stapling = yes
ssl_stapling_verify = yes

Dikkat edin, ssl_cert ve ssl_key direktiflerinde başta < işareti var. Bu Dovecot’a “dosyanın içeriğini oku” demek. Bu işareti unutmak sık yapılan hatalardan biri.

DH Parametrelerini Oluşturma

# DH parametresi oluştur (bu işlem birkaç dakika sürebilir)
openssl dhparam -out /etc/dovecot/dh.pem 4096

# İzinleri ayarla
chmod 644 /etc/dovecot/dh.pem

Port ve Listener Yapılandırması

Portları /etc/dovecot/conf.d/10-master.conf dosyasından yapılandırıyoruz. Hem STARTTLS hem de Implicit TLS için listener’ları ayarlayalım:

service imap-login {
  inet_listener imap {
    port = 143
    # STARTTLS için 143 açık kalır
  }

  inet_listener imaps {
    port = 993
    ssl = yes
    # Implicit TLS
  }
}

service pop3-login {
  inet_listener pop3 {
    port = 110
    # STARTTLS için
  }

  inet_listener pop3s {
    port = 995
    ssl = yes
    # Implicit TLS
  }
}

Güvenlik odaklı bir yapılandırmada, kullanıcıları implicit TLS’e zorlamak istiyorsanız STARTTLS portlarını kapatabilir veya sadece şifreli bağlantıya izin verebilirsiniz. ssl = required ayarı zaten şifrelenmemiş bağlantıları reddeder.

Güvenlik Sıkılaştırması

TLS 1.3 Desteği

Dovecot 2.3.15+ sürümlerinde TLS 1.3 destekleniyor. Mümkünse hem TLS 1.2 hem 1.3’ü aktif bırakın, sadece 1.0 ve 1.1’i kapatın:

# 10-ssl.conf içinde
ssl_min_protocol = TLSv1.2

# TLS 1.3 cipher'ları OpenSSL otomatik yönetir
# Ek olarak TLS 1.3 cipher grupları belirtebilirsiniz
ssl_cipher_list = ECDHE+AESGCM:ECDHE+CHACHA20:DHE+AESGCM:DHE+CHACHA20:@STRENGTH

SNI (Server Name Indication) Yapılandırması

Birden fazla domain için farklı sertifikalar kullanıyorsanız SNI çok işe yarıyor. Örneğin hem mail.example.com hem de mail.company.org için ayrı sertifika sunabilirsiniz:

# 10-ssl.conf içinde local blok kullan
local mail.example.com {
  ssl_cert = </etc/letsencrypt/live/mail.example.com/fullchain.pem
  ssl_key = </etc/letsencrypt/live/mail.example.com/privkey.pem
}

local mail.company.org {
  ssl_cert = </etc/letsencrypt/live/mail.company.org/fullchain.pem
  ssl_key = </etc/letsencrypt/live/mail.company.org/privkey.pem
}

Client Sertifika Doğrulama

Yüksek güvenlik gerektiren ortamlarda istemci sertifikası doğrulaması ekleyebilirsiniz:

# CA sertifikası belirt
ssl_ca = </etc/dovecot/certs/ca.pem

# İstemci sertifikası iste (isteğe bağlı)
ssl_verify_client_cert = yes

# Sertifika kullanıcı adını username olarak kullan
auth_ssl_require_client_cert = yes
auth_ssl_username_from_cert = yes

Sertifika İzinleri ve Dovecot Kullanıcısı

Let’s Encrypt sertifikaları varsayılan olarak root’a ait ve 0600/0644 iznine sahip. Dovecot’un bu dosyaları okuyabilmesi için dikkatli olmak gerekiyor:

# Dovecot'un hangi kullanıcıyla çalıştığını kontrol et
ps aux | grep dovecot
# veya
grep "^user|^group" /etc/dovecot/conf.d/10-master.conf

# Let's Encrypt dizinine erişim izni ver
# YOL 1: ACL ile
apt install acl
setfacl -R -m u:dovecot:rX /etc/letsencrypt/live/
setfacl -R -m u:dovecot:rX /etc/letsencrypt/archive/

# YOL 2: Sertifikaları kopyala ve dovecot grubuna ver
cp /etc/letsencrypt/live/mail.example.com/fullchain.pem /etc/dovecot/certs/
cp /etc/letsencrypt/live/mail.example.com/privkey.pem /etc/dovecot/private/
chown root:dovecot /etc/dovecot/private/privkey.pem
chmod 640 /etc/dovecot/private/privkey.pem

ACL yöntemi genellikle daha temiz çünkü sertifika yenilendiğinde kopyalama adımını tekrar yapmanıza gerek kalmıyor.

Yapılandırmayı Test Etme

Değişiklik yaptıktan sonra her zaman yapılandırmayı test edin, direkt restart etmeyin:

# Yapılandırma dosyalarını kontrol et
doveconf -n

# Syntax hatası var mı kontrol et
dovecot -F &
# Ctrl+C ile çık, hata varsa ekranda göreceksin

# Dovecot'u yeniden başlat
systemctl restart dovecot
systemctl status dovecot

# Logları takip et
journalctl -u dovecot -f
# veya
tail -f /var/log/mail.log

OpenSSL ile Bağlantı Testi

# IMAPS (993) bağlantı testi
openssl s_client -connect mail.example.com:993 -showcerts

# IMAP STARTTLS testi
openssl s_client -connect mail.example.com:143 -starttls imap

# TLS sürümünü ve cipher'ı görüntüle
openssl s_client -connect mail.example.com:993 | grep -E "Protocol|Cipher"

# Sertifika geçerlilik tarihi
echo | openssl s_client -connect mail.example.com:993 2>/dev/null | openssl x509 -noout -dates

Gerçek Dünya Senaryoları

Senaryo 1: Thunderbird “Güvensiz Bağlantı” Uyarısı

Bir kullanıcı yeni kurduğu Thunderbird’de mail hesabını ayarlamaya çalışıyor, ama “Bağlantı güvensiz” uyarısı alıyor. Self-signed sertifika kullanan veya sertifika zincirini eksik yapılandırmış sistemlerde bu sık görülür.

# Sertifika zincirini kontrol et
openssl verify -CAfile /etc/ssl/certs/ca-certificates.crt 
  /etc/letsencrypt/live/mail.example.com/fullchain.pem

# Zincirin tam olduğunu doğrula
openssl s_client -connect mail.example.com:993 -verify_return_error

# Dovecot'ta fullchain.pem kullandığınızdan emin ol (cert.pem değil!)
grep ssl_cert /etc/dovecot/conf.d/10-ssl.conf
# Çıktı: ssl_cert = </etc/letsencrypt/live/mail.example.com/fullchain.pem

cert.pem yerine fullchain.pem kullanmak burada kritik. cert.pem sadece sunucu sertifikasını içeriyor, ara CA sertifikaları olmadan istemciler zinciri doğrulayamıyor.

Senaryo 2: Sertifika Yenilendikten Sonra Dovecot Eski Sertifikayı Kullanıyor

Let’s Encrypt sertifikası başarıyla yenilendi ama Dovecot hala eski sertifikayla çalışıyor. Bu durumda servis yeniden yüklenmiyor demek.

# Mevcut sertifikanın ne zaman dolacağını kontrol et
echo | openssl s_client -connect mail.example.com:993 2>/dev/null 
  | openssl x509 -noout -enddate

# Disk üzerindeki sertifika tarihi
openssl x509 -noout -enddate -in /etc/letsencrypt/live/mail.example.com/fullchain.pem

# Eğer disk güncel ama Dovecot eski sertifika sunuyorsa, reload et
systemctl reload dovecot

# Post-hook scripti kontrol et
ls -la /etc/letsencrypt/renewal-hooks/post/
cat /etc/letsencrypt/renewal-hooks/post/dovecot-reload.sh

Senaryo 3: Eski Mail İstemcileri TLS 1.2’yi Desteklemiyor

Küçük işletmelerde bazen çok eski Outlook veya BlackBerry gibi cihazlar hala kullanılıyor. ssl_min_protocol = TLSv1.2 ayarıyla bu cihazlar bağlanamaz hale geliyor.

Bu durumda güvenlik ile uyumluluk arasında denge kurmak gerekiyor. Geçici bir çözüm olarak TLS 1.1’i açabilirsiniz, ama uzun vadede bu cihazları güncellemek doğru yol:

# Geçici çözüm (önerilmez ama zorunluysa)
# ssl_min_protocol = TLSv1.1

# Hangi istemcinin hangi TLS sürümüyle bağlandığını logla
# /etc/dovecot/conf.d/10-logging.conf içinde
log_debug = category=ssl

# Logdan TLS sürümlerini filtrele
grep "TLS" /var/log/mail.log | awk '{print $NF}' | sort | uniq -c

Performans Optimizasyonu

SSL/TLS işlemleri CPU yoğun olabilir. Özellikle binlerce aktif IMAP bağlantısında bu önem kazanıyor.

# SSL session cache - tekrar bağlantılarda TLS handshake'i atla
# 10-ssl.conf içinde
ssl_session_cache_size = 10M
ssl_session_timeout = 1h

# Dovecot worker sayısını ayarla
# /etc/dovecot/conf.d/10-master.conf içinde
service imap-login {
  process_min_avail = 2
  vsz_limit = 256M
}

Monitoring ve Alerting

Sertifika süresini izlemek kritik. Sertifika süresi dolduktan sonra tüm kullanıcılar mail erişimini kaybeder.

#!/bin/bash
# check_ssl_cert.sh
# Bu scripti cron ile günlük çalıştır

DOMAIN="mail.example.com"
PORT="993"
WARN_DAYS=30
CRITICAL_DAYS=7

EXPIRY=$(echo | openssl s_client -connect ${DOMAIN}:${PORT} 2>/dev/null 
  | openssl x509 -noout -enddate 2>/dev/null 
  | cut -d= -f2)

EXPIRY_EPOCH=$(date -d "${EXPIRY}" +%s)
NOW_EPOCH=$(date +%s)
DAYS_LEFT=$(( (EXPIRY_EPOCH - NOW_EPOCH) / 86400 ))

if [ ${DAYS_LEFT} -le ${CRITICAL_DAYS} ]; then
  echo "CRITICAL: SSL sertifikası ${DAYS_LEFT} gün içinde sona eriyor!" | 
    mail -s "SSL CRITICAL: ${DOMAIN}" [email protected]
elif [ ${DAYS_LEFT} -le ${WARN_DAYS} ]; then
  echo "WARNING: SSL sertifikası ${DAYS_LEFT} gün içinde sona eriyor!" | 
    mail -s "SSL WARNING: ${DOMAIN}" [email protected]
fi

echo "Sertifika ${DAYS_LEFT} gün geçerli (${EXPIRY})"
# Crontab'a ekle
crontab -e
# Her gün sabah 9'da çalıştır
0 9 * * * /usr/local/bin/check_ssl_cert.sh >> /var/log/ssl-check.log 2>&1

Firewall Ayarları

SSL/TLS portlarının dışarıdan erişilebilir olması gerekiyor:

# UFW ile
ufw allow 993/tcp comment "IMAPS"
ufw allow 995/tcp comment "POP3S"
ufw allow 143/tcp comment "IMAP STARTTLS"
ufw allow 110/tcp comment "POP3 STARTTLS"
ufw reload

# firewalld ile (CentOS/RHEL)
firewall-cmd --permanent --add-service=imaps
firewall-cmd --permanent --add-service=pop3s
firewall-cmd --permanent --add-port=143/tcp
firewall-cmd --permanent --add-port=110/tcp
firewall-cmd --reload

Yapılandırmanın Doğrulanması

Tüm ayarları tamamladıktan sonra Qualys SSL Labs veya benzeri araçlarla dış testler yapabilirsiniz. Ama önce komut satırından kapsamlı bir kontrol:

# Tüm aktif SSL ayarlarını göster
doveconf -n | grep ssl

# Test bağlantısı kur ve sertifika bilgilerini al
openssl s_client -connect mail.example.com:993 -brief

# Desteklenen cipher listesini kontrol et
nmap --script ssl-enum-ciphers -p 993 mail.example.com

# TLS 1.0'ın reddedildiğini doğrula
openssl s_client -connect mail.example.com:993 -tls1
# "handshake failure" mesajı görmeli siniz

Sık Yapılan Hatalar

  • ssl_cert direktifinde < işaretini unutmak: Dovecot sertifika yolunu değil içeriğini bekliyor. < olmadan başlatma hatası alırsınız.
  • cert.pem kullanmak fullchain.pem yerine: Ara sertifika olmadan istemciler zinciri doğrulayamaz.
  • Özel anahtarın izinlerini yanlış ayarlamak: privkey.pem dünya tarafından okunabilir olmamalı, bu ciddi bir güvenlik açığı.
  • Sertifika yenileme sonrası Dovecot’u reload etmemek: Otomatik yenileme varsa post-hook mutlaka olmalı.
  • Yalnızca STARTTLS’e güvenmek: Implicit TLS ile birlikte kullanılmalı ya da STARTTLS downgrade koruması eklenmelidir.
  • DH parametrelerini oluşturmamak: ssl_dh ayarı yapılmamışsa DHE cipher’ları çalışmaz.

Sonuç

Dovecot üzerinde SSL/TLS yapılandırması ilk bakışta karmaşık görünse de adım adım yaklaşınca oldukça yönetilebilir. Özetlemek gerekirse: Let’s Encrypt ile ücretsiz ve güvenilir bir sertifika alın, fullchain.pem kullanın, TLS 1.2 minimum seviye olarak belirleyin, implicit TLS portlarını açın ve sertifika yenileme sürecini otomasyona bağlayın.

Gerçek üretim ortamında bu yapılandırmayı yaptıktan sonra düzenli SSL testleri, sertifika süre uyarıları ve log izlemesini ihmal etmeyin. Mail erişiminin kesilmesi kullanıcı deneyimini doğrudan etkileyen kritik bir servistir ve “sertifika doldu, haberimiz olmadı” açıklaması hiç de hoş değil. Monitoring’i kurduğunuzda zaten bu tür sürprizler ortadan kalkıyor.

Son olarak, bu yapılandırmayı Postfix tarafındaki SMTP TLS yapılandırmasıyla birlikte ele almayı unutmayın. Mail sunucunuzun tüm ayaklarının şifreli çalışması, gerçek anlamda uçtan uca bir güvenlik sağlıyor.

Yorum yapın