Postfix ile Sender ve Recipient Kısıtlamaları

Mail sunucusu yönetiminde en çok baş ağrıtan konuların başında spam ve yetkisiz kullanım geliyor. Postfix’i kurdunuz, temel yapılandırmayı yaptınız, ama sunucunuz hala istenmeyen maillere açık mı? İşte tam bu noktada sender ve recipient kısıtlamaları devreye giriyor. Bu yazıda Postfix’in güçlü kısıtlama mekanizmalarını gerçek dünya senaryolarıyla ele alacağız.

Postfix Kısıtlama Mimarisi

Postfix, gelen bağlantıları ve mailleri birden fazla aşamada değerlendiriyor. Her aşamada farklı kısıtlama parametreleri devreye giriyor ve bu parametreler sırayla kontrol ediliyor. Bir kısıtlama permit veya reject döndürdüğünde o aşamadaki değerlendirme duruyor.

Temel kısıtlama parametreleri şunlar:

  • smtpd_client_restrictions: Bağlanan istemciye göre kısıtlama
  • smtpd_helo_restrictions: HELO/EHLO komutuna göre kısıtlama
  • smtpd_sender_restrictions: MAIL FROM komutuna göre kısıtlama
  • smtpd_recipient_restrictions: RCPT TO komutuna göre kısıtlama
  • smtpd_data_restrictions: DATA komutuna göre kısıtlama
  • smtpd_relay_restrictions: Relay izinleri için kısıtlama

Bu parametreler main.cf dosyasında tanımlanıyor ve Postfix her yeni SMTP bağlantısında bu kuralları sırayla uyguluyor.

Temel Kısıtlama Direktifleri

Kısıtlamalarda kullanabileceğiniz temel direktifleri anlamak çok önemli. En sık kullanılanlar:

  • permit: Bağlantıya izin ver, diğer kısıtlamaları atla
  • reject: Bağlantıyı reddet
  • defer: Geçici hata döndür (421)
  • warn_if_reject: Reddetmek yerine logla
  • permit_mynetworks: Yerel ağlardan gelen bağlantılara izin ver
  • permit_sasl_authenticated: SASL ile doğrulanmış kullanıcılara izin ver
  • reject_unauth_destination: Yetkisiz relay girişimlerini reddet
  • reject_unknown_sender_domain: Bilinmeyen gönderici domainlerini reddet
  • reject_invalid_helo_hostname: Geçersiz HELO isimlerini reddet
  • check_client_access: Erişim tablosuna göre kontrol et
  • check_sender_access: Gönderici tablosuna göre kontrol et
  • check_recipient_access: Alıcı tablosuna göre kontrol et

Sender Kısıtlamaları

HELO Kısıtlamaları ile Başlamak

Birçok spam gönderici, HELO aşamasında kendini ele veriyor. Geçersiz veya sahte HELO değerleri kullanan bağlantıları bu aşamada bloklayabilirsiniz.

# /etc/postfix/main.cf

smtpd_helo_required = yes

smtpd_helo_restrictions =
    permit_mynetworks,
    reject_invalid_helo_hostname,
    reject_non_fqdn_helo_hostname,
    reject_unknown_helo_hostname

smtpd_helo_required = yes ayarı HELO/EHLO göndermeden devam etmeye çalışan istemcileri engelliyor. reject_unknown_helo_hostname ise DNS’de kaydı olmayan hostnamelerle gelen bağlantıları reddediyor. Bu ayar agresif olabilir, önce warn_if_reject ile test edin.

MAIL FROM Kısıtlamaları

Gönderici kısıtlamaları smtpd_sender_restrictions parametresiyle yapılandırılıyor. Burada göndericinin domain geçerliliğini, kara listeye alınıp alınmadığını ve başka kriterleri kontrol edebilirsiniz.

# /etc/postfix/main.cf

smtpd_sender_restrictions =
    permit_mynetworks,
    permit_sasl_authenticated,
    reject_non_fqdn_sender,
    reject_unknown_sender_domain,
    check_sender_access hash:/etc/postfix/sender_access,
    reject_unverified_sender

Bu yapılandırmayı açıklayalım:

  • Önce yerel ağdan ve SASL ile doğrulanmış kullanıcılara izin veriliyor
  • reject_non_fqdn_sender: Tam nitelikli domain adı olmayan göndericileri reddediyor
  • reject_unknown_sender_domain: MX veya A kaydı olmayan domainleri reddediyor
  • check_sender_access: Özel erişim tablomuzu kontrol ediyor
  • reject_unverified_sender: Postfix’in gönderici adresini doğrulamasını sağlıyor

Özel Sender Erişim Tablosu Oluşturma

Belirli göndericileri veya domainleri kara listeye almak ya da beyaz listeye eklemek için erişim tabloları kullanıyoruz.

# /etc/postfix/sender_access dosyası

# Kara listeye alınan domainler
spammer.com         REJECT Spamdomain kabul edilmiyor
baddomain.net       REJECT Kotu niceli domain
@phishing.org       REJECT Bu domainden mail kabul edilmiyor

# Belirli adresler engelle
[email protected] REJECT Bu adres kara listede

# Beyaz listeye al (erken permit)
[email protected] OK
@trusted-partner.net OK

Tabloyu oluşturduktan sonra hash formatına derlemeniz gerekiyor:

postmap /etc/postfix/sender_access
postfix reload

reject_unverified_sender Kullanımı

Bu direktif Postfix’in gönderici adresinin gerçekten var olup olmadığını kontrol etmesini sağlıyor. Ancak dikkatli kullanın, bazı mail sunucuları doğrulama isteklerini reddedebilir.

# main.cf'e eklenecek ek ayarlar
unverified_sender_reject_code = 550
unverified_sender_defer_code = 450
address_verify_negative_cache = yes
address_verify_negative_expire_time = 3d
address_verify_positive_expire_time = 31d

Recipient Kısıtlamaları

Temel Recipient Yapılandırması

Alıcı kısıtlamaları, hangi adreslere mail kabul edeceğinizi belirliyor. Bu en kritik kısıtlama noktası çünkü açık relay’i burada engelliyoruz.

# /etc/postfix/main.cf

smtpd_recipient_restrictions =
    permit_mynetworks,
    permit_sasl_authenticated,
    reject_unauth_destination,
    reject_non_fqdn_recipient,
    reject_unknown_recipient_domain,
    check_recipient_access hash:/etc/postfix/recipient_access,
    check_policy_service inet:127.0.0.1:10023,
    reject_rbl_client zen.spamhaus.org,
    reject_rbl_client bl.spamcop.net

reject_unauth_destination buradaki en önemli direktif. Bu olmadan sunucunuz açık relay haline gelir ve spam göndermek için kullanılabilir. Bu direktifi asla atlamamalısınız.

Recipient Erişim Tablosu

Belirli alıcıları özelleştirmek için recipient erişim tablosu kullanıyoruz:

# /etc/postfix/recipient_access

# Belirli adreslere gelen mailleri reddet
[email protected]   REJECT Bu adres artik aktif degil
[email protected] REJECT Lutfen yeni adresimizi kullanin: [email protected]

# Belirli bir kullanici icin ozel islem
[email protected]         OK

# Bir alt domain icin tamamen engelleme
@old-subdomain.example.com  REJECT Bu subdomain kapatilmistir
postmap /etc/postfix/recipient_access
postfix reload

Bilinmeyen Kullanıcıları Reddetmek

Sisteminizde olmayan kullanıcılara gelen mailleri kabul edip sonra bouncing yapmak yerine, SMTP aşamasında reddetmek çok daha temiz bir yaklaşım. Bunun için local_recipient_maps kullanıyoruz.

# main.cf
local_recipient_maps = proxy:unix:passwd.byname $alias_maps
unknown_local_recipient_reject_code = 550

Postfix destekli kullanıcı listesi için:

# Virtual mailbox kullanıyorsanız
virtual_mailbox_maps = hash:/etc/postfix/vmailbox
local_recipient_maps = $virtual_mailbox_maps

RBL (Realtime Blackhole List) Entegrasyonu

RBL listeleri, bilinen spam göndericilerini ve kötü niyetli IP adreslerini içeriyor. Postfix bu listeleri DNS sorgusu ile kontrol edebiliyor.

# main.cf - RBL konfigürasyonu

smtpd_recipient_restrictions =
    permit_mynetworks,
    permit_sasl_authenticated,
    reject_unauth_destination,
    reject_rbl_client zen.spamhaus.org=127.0.0.4,
    reject_rbl_client zen.spamhaus.org=127.0.0.11,
    reject_rbl_client bl.spamcop.net,
    reject_rbl_client dnsbl.sorbs.net,
    reject_rhsbl_sender dsn.rfc-ignorant.org,
    permit

RBL listelerinde = ile belirli dönüş kodlarını filtreleyebilirsiniz. Spamhaus ZEN listesinde 127.0.0.4 SBL listesini, 127.0.0.11 ise PBL (Policy Block List) listesini temsil ediyor.

Önemli not: Bazı RBL listeleri ücretli veya kayıt gerektiriyor. Yüksek hacimli sorgularda Spamhaus gibi listelerin ticari kullanım şartlarını kontrol edin.

RBL Bypass Listesi

Bazen güvenilir bir sunucu RBL’de listelenmiş olabilir. Bu durumda bypass listesi kullanıyoruz:

# main.cf
smtpd_client_restrictions =
    check_client_access hash:/etc/postfix/rbl_override,
    reject_rbl_client zen.spamhaus.org

# /etc/postfix/rbl_override
192.168.1.100   OK
trusted-server.partner.com  OK

Gerçek Dünya Senaryoları

Senaryo 1: Kurumsal Mail Sunucusu Güvenlik Sertleştirmesi

Diyelim ki 500 kullanıcılı bir şirketin mail sunucusunu yönetiyorsunuz. Şikayetlerin yoğunlaştığı konular: çok fazla spam geliyor, bazı çalışanlar kimlik avı maillerine düşüyor.

# /etc/postfix/main.cf - Kurumsal profil

# HELO kısıtlamaları
smtpd_helo_required = yes
smtpd_helo_restrictions =
    permit_mynetworks,
    reject_invalid_helo_hostname,
    reject_non_fqdn_helo_hostname

# Gönderici kısıtlamaları
smtpd_sender_restrictions =
    permit_mynetworks,
    permit_sasl_authenticated,
    reject_non_fqdn_sender,
    reject_unknown_sender_domain,
    check_sender_access hash:/etc/postfix/sender_access

# Alıcı kısıtlamaları  
smtpd_recipient_restrictions =
    permit_mynetworks,
    permit_sasl_authenticated,
    reject_unauth_destination,
    reject_non_fqdn_recipient,
    reject_unknown_recipient_domain,
    reject_unknown_client_hostname,
    check_recipient_access hash:/etc/postfix/recipient_access,
    reject_rbl_client zen.spamhaus.org,
    reject_rbl_client bl.spamcop.net,
    permit

# Rate limiting
smtpd_client_connection_rate_limit = 30
smtpd_client_message_rate_limit = 50
anvil_rate_time_unit = 60s

Senaryo 2: Hosting Firması – Çok Kiracılı Yapı

Hosting firmanızda her müşterinin ayrı domain ve kullanıcıları var. Kısıtlamaları virtual domain yapısıyla uyumlu hale getirmek gerekiyor.

# Virtual domain için recipient kısıtlamaları
smtpd_recipient_restrictions =
    permit_mynetworks,
    permit_sasl_authenticated,
    reject_unauth_destination,
    check_recipient_access mysql:/etc/postfix/mysql-recipient-access.cf,
    reject_rbl_client zen.spamhaus.org,
    permit

# Outbound için ayrı kısıtlama (submission port 587)
# master.cf
submission inet n       -       n       -       -       smtpd
  -o syslog_name=postfix/submission
  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
  -o smtpd_sender_restrictions=reject_sender_login_mismatch
  -o smtpd_recipient_restrictions=permit_sasl_authenticated,reject_unauth_destination

Senaryo 3: Kısıtlamaları Test Etme ve Debug

Yeni kısıtlamalar eklemeden önce mutlaka test edin. warn_if_reject direktifi gerçek reddetme yapmadan logu incelemenizi sağlıyor.

# Test modu - önce logları izle
smtpd_recipient_restrictions =
    permit_mynetworks,
    permit_sasl_authenticated,
    reject_unauth_destination,
    warn_if_reject reject_unknown_client_hostname,
    warn_if_reject reject_rbl_client zen.spamhaus.org,
    permit

Mail loglarını takip etmek için:

# Gerçek zamanlı log takibi
tail -f /var/log/mail.log | grep -E "(reject|warning|permit)"

# Reddedilen mailleri özetle
grep "reject" /var/log/mail.log | awk '{print $NF}' | sort | uniq -c | sort -rn | head -20

# Belirli bir IP'nin durumunu kontrol et
postmap -q "192.168.1.100" cidr:/etc/postfix/client_access

Postscreen ile Ön Filtreleme

Postfix 2.8 ile gelen postscreen özelliği, gerçek SMTP bağlantısına geçmeden önce IP tabanlı kontroller yapıyor. Bu, sunucu kaynaklarını önemli ölçüde koruyor.

# master.cf
smtp      inet  n       -       n       -       1       postscreen
smtpd     pass  -       -       n       -       -       smtpd
dnsblog   unix  -       -       n       -       0       dnsblog
tlsproxy  unix  -       -       n       -       0       tlsproxy

# main.cf - postscreen ayarları
postscreen_access_list = permit_mynetworks,
    cidr:/etc/postfix/postscreen_access.cidr

postscreen_blacklist_action = drop
postscreen_greet_action = enforce
postscreen_dnsbl_action = enforce
postscreen_dnsbl_threshold = 3

postscreen_dnsbl_sites =
    zen.spamhaus.org*2,
    bl.spamcop.net*1,
    b.barracudacentral.org*2,
    psbl.surriel.com*1

postscreen_dnsbl_whitelist_threshold = -2

Postscreen puan sistemiyle çalışıyor. Her RBL listesinden alınan puan toplanıyor ve eşik değeri aşıldığında bağlantı reddediliyor.

Header ve Body Kısıtlamaları

SMTP aşamasındaki kısıtlamaların yanı sıra mail başlıklarını da filtreleyebilirsiniz:

# main.cf
header_checks = regexp:/etc/postfix/header_checks
body_checks = regexp:/etc/postfix/body_checks
mime_header_checks = regexp:/etc/postfix/mime_header_checks

# /etc/postfix/header_checks
/^Subject:.*[SPAM]/  PREPEND X-Spam-Flag: YES
/^From:.*@known-phishing.com/  REJECT Kimlik avi denemesi tespit edildi
/^X-Mailer: The Bat/   WARN Eski mail istemcisi kullaniliyor

# /etc/postfix/body_checks  
/casino|viagra|phishing-link.com/i  REJECT Icerik filtresine takıldı
postmap -q - regexp:/etc/postfix/header_checks << 'EOF'
Subject: Test [SPAM] maili
EOF

Kısıtlama Sıralamasının Önemi

Postfix kısıtlamaları sırayla değerlendiriyor ve ilk eşleşmede duruyor. Bu yüzden sıralama kritik:

# DOGRU sıralama
smtpd_recipient_restrictions =
    permit_mynetworks,           # 1. Yerel ağa her zaman izin ver
    permit_sasl_authenticated,   # 2. Doğrulanmış kullanıcılara izin ver
    reject_unauth_destination,   # 3. Yetkisiz relay'i engelle
    reject_non_fqdn_recipient,   # 4. Format kontrolleri
    reject_unknown_recipient_domain, # 5. Domain kontrolleri
    check_recipient_access hash:/etc/postfix/recipient_access, # 6. Özel listeler
    reject_rbl_client zen.spamhaus.org, # 7. Kara listeler
    permit                       # 8. Geriye kalanları kabul et

# YANLIS sıralama - reject_unauth_destination olmadan açık relay!
smtpd_recipient_restrictions =
    permit_mynetworks,
    reject_rbl_client zen.spamhaus.org,  # RBL önce gelirse sorun yok ama...
    permit_sasl_authenticated,
    permit  # Bu son permit herkese izin veriyor!

Güvenlik İzleme ve Log Analizi

Kısıtlamalar kurulduktan sonra düzenli izleme şart:

#!/bin/bash
# /usr/local/bin/postfix-stats.sh
# Günlük mail istatistikleri

echo "=== Postfix Gunluk Rapor ==="
echo "Tarih: $(date)"
echo ""

echo "--- Reddedilen Baglantılar ---"
grep "$(date +%b %d)" /var/log/mail.log | grep "reject:" | wc -l

echo "--- RBL Engelleri ---"
grep "$(date +%b %d)" /var/log/mail.log | grep "blocked using" | 
    awk -F'blocked using' '{print $2}' | sort | uniq -c | sort -rn

echo "--- En Cok Reddedilen IP'ler ---"
grep "$(date +%b %d)" /var/log/mail.log | grep "reject:" | 
    awk '{print $6}' | cut -d'[' -f2 | cut -d']' -f1 | 
    sort | uniq -c | sort -rn | head -10

echo "--- Kabul Edilen Mailler ---"
grep "$(date +%b %d)" /var/log/mail.log | grep "status=sent" | wc -l

Bu scripti cron ile günlük çalıştırabilirsiniz:

chmod +x /usr/local/bin/postfix-stats.sh
echo "0 8 * * * root /usr/local/bin/postfix-stats.sh | mail -s 'Postfix Raporu' [email protected]" >> /etc/cron.d/postfix-stats

Sık Yapılan Hatalar

Kurulum ve yapılandırma sırasında karşılaşılan yaygın hatalar:

  • reject_unauth_destination unutmak: Sunucunuzu açık relay haline getirir. Her zaman ekleyin.
  • Çok agresif HELO kısıtlamaları: reject_unknown_helo_hostname bazı meşru sunucuları engelleyebilir.
  • RBL listelerini test etmeden production’a almak: Önce warn_if_reject ile test edin.
  • permit_mynetworks’ü sona koymak: Her zaman listenin başında olmalı.
  • Hash tablosunu yeniden derlememek: postmap çalıştırmadan yapılan değişiklikler etkisiz kalır.
  • Kısıtlama değişikliğinden sonra reload yapmamak: postfix reload şart.

Sonuç

Postfix sender ve recipient kısıtlamaları, mail sunucunuzun güvenliğinin temel taşlarını oluşturuyor. Doğru yapılandırılmış kısıtlamalar sunucunuzu açık relay olmaktan koruyor, spam yükünü önemli ölçüde azaltıyor ve meşru maillerinizin güvenli şekilde iletilmesini sağlıyor.

Temel yaklaşımı şöyle özetleyebilirim: Önce koruyucu kısıtlamaları ekleyin ve warn_if_reject ile test edin. Log çıktılarını analiz edin, false positive’leri tespit edin, gerekirse istisnalar tanımlayın. Sonrasında enforce moduna alın ve izlemeye devam edin.

Postscreen eklediğinizde ise bu filtreleme katmanı çok daha verimli çalışıyor çünkü bilinen kötü IP adreslerini SMTP handshake’e bile sokmadan eliyor. Sunucu kaynaklarınızı önemli ölçüde koruyorsunuz.

Her ortam farklı gereksinimlere sahip. 10 kullanıcılı küçük bir şirket ile 10.000 kullanıcılı hosting firmasının ihtiyaçları farklı. Kısıtlama profilinizi kendi kullanım senaryonuza göre uyarlayın ve düzenli olarak log analizleriyle gözden geçirin. Mail güvenliği statik bir yapılandırma değil, sürekli gelişen bir süreç.

Yorum yapın