Ana Sayfa » *nix » qmail Validrcptto patch’i ile Backscatter Önlemi

qmail Validrcptto patch’i ile Backscatter Önlemi


BerbatKötüİdare EderGüzelHarika (Henüz Puan Verilmedi. Oy kullanarak siz de katkı yapabilirsiniz.)
Loading...

Warning: mysqli_query(): (HY000/3): Error writing file '/tmp/MYO0Xmgt' (Errcode: 28 - No space left on device) in /usr/share/nginx/html/syslogs/wp-includes/class-wpdb.php on line 2349
stop-spam Bir önceki yazımda, backscatter mail'in ne olduğu ve nasıl önlenebileceği ile ilgili genel geçer bilgiler vermeye çalışmıştım. Bu yazıda ise, sunucularda, validrctpto patch'inden yararlanarak backscatter faliyetlerinin nasıl engellenebileceğini anlatan bir döküman paylaşmak istiyorum. Backscatter'ın ne olduğu konusunda detaylı bilgi arıyorsanız buradan bir önceki yazıya göz atmanızı öneririm.

Bu yazıda, bir sunucuya, geçersiz kullanıcılara gönderilen postaları smtp seviyesinde reddedebilmesi için validrcptto.cdb patch'ini uygulayıp yapılandırma işleminin nasıl yapıldığını anlatan kurulum notlarını bulabilirsiniz.

Önce, patch ile ilgili genel bilgiler:

Validrcptto.cdb Patch'i


Validrcptto patch'i, 'in geçersiz kullanıcılara atılan mailleri daha başından reject etmesini sağlamak üzere yazılmış oldukça kullanışlı bir patchtir. Geçersiz kullanıcılara atılan mailler henuz smtp oturumu sırasında reddedildiği için, sunucunuzun, (5xx) bilinmeyen/geçersiz kullanıcı sebebi ile herhangi bir yere DSN mesajı göndermesi engellenmiş olur. Böylece qmail sunucunuzun backscatter'a neden olması önlenir.

Mantık oldukça basitt: patch'i sisteme geçiyorsunuz sonrasında posta sunucunuz üzerinde bulunan tüm e-posta adreslerinizi bir listeye yazıyorsunuz ve bu listeyi bir cdb database'ine dönüştürüyorsunuz. Bundan sonra qmail, relay izni olmayan ya da auth olmamış her oturum için rcpt to: komutunda iletilen e-posta adresini bu dosyada sorgulayarak bir doğrulama gerçekleştiriyor. Eğer alıcının e-posta adresi cdb database'inde mevcutsa rcpt to: komutu için OK cevabı döndürülüyor;  aksi durumda hata mesajı döndürülüp bağlantı sonlandırılıyor. Böylece, sistemde bulunan kullanıcılar ve relay izni olan ip adreslerinin dışındaki tüm bağlantılar için alıcı kontrolü yapılıyor ve -bounce edeceği belli olan- geçersiz kullanıcılara mail iletilmesi engelleniyor.

Kabul edilen ve edilmeyen birer posta gönderimi için örnek telnet çıktısı aşağıda görüldüğü gibidir.

Geçerli Alıcı

$ telnet xx.xxx.xx.xxx 25
Connected to xx.xxx.xx.xxx.
Escape character is '^]'.
220 gate.xxxx.com ESMTP

ehlo crom.cagriersen.net
250-gate.xxxx.com

mail from: [email protected]
250 ok

rcpt to: [email protected]
250 ok

Geçersiz Alıcı

$ telnet xx.xxx.xx.xxx 25
Connected to xx.xxx.xx.xxx.
Escape character is '^]'.
220 gate.xxxx.com ESMTP

ehlo crom.cagriersen.net
250-gate.xxxx.com

mail from: [email protected]
250 ok

rcpt to: [email protected]
553 sorry, this recipient is not in my validrcptto list (#5.7.1)

Gördüğünüz gibi, ilk denemede valid bir kullanıcıya atılmak istenen mail 250 OK ile kanul edilirken, ikinci örnekteki geçersiz kullanıcı için 553 sorry, this recipient is not in my validrcptto list (#5.7.1) hatası döndürülüyor.

Patch'in bir diğer kullanışlı noktası da, VALIDRCPTTO_LIMIT çevre değişkeni ile, aynı IP'den gelecek doğrulama işlemine sınırlama getirebilmektir. Bu durum, doğrulama yapılıyor olmasından yararlanılarak dictionary harvest attack vb. gibi yöntemlerle sisteminizdeki kullanıcıların tespit edilmesini engellemektedir.  Eğer aynı smtp oturumunda x (default olarak 10) sayıda geçersiz kullanıcı içeren rcpt to komutu gelirse oturum sonlandırılır.  Şu şekilde: (limit 2 olarak set edilmiştir.)

mail from: [email protected]
250 ok
rcpt to: [email protected]
553 sorry, this recipient is not in my validrcptto list (#5.7.1)
rcpt to: [email protected]
421 too many invalid addresses, goodbye (#4.3.0)
Connection closed by foreign host.

Görüldüğü üzere iki denemeden sonra smtp oturumu sonlandırıldı.

Ben patch'i üzerinde netqmail-1.6 kurulu olan bir qmail sunucuya uyguladım. Bu sunucu, arkasında bir kaç Ms Exchange ve stand-alone qmail sunucusu için anti- ve antivirus gateway görevi görüyor. Dolayısı ile ilgili qmail'in üzerinde herhangi bir posta kutusu bulunmuyor; bu nedenle kullanıcı doğrulaması yapabilmek için arkadaki posta sunucularında bulunan tüm e-posta adreslerini yazının ilgili bölümünde anlatıldığı gibi cdb dosyasına aktarıyorum. Ancak eğer sizin qmail sunucunuz stand-alone olarak çalışıyorsa yani posta kutuları da aynı sunucu üzerindeyse kullanıcılarınızı cdb dosyasına kolayca import edebilirsiniz.

Warning UYARI: Bu patch bazı smtp-auth patch'leri ile çakışmaktadır bu nedenle böyle durumlarda kullanılamamaktadır. Eğer sisteminizde herhangi bir smtp-auth patch'i mevcutsa çakışma olması durumunda patch'i geçerken hata alabilirisniz.

Ben patch'i bir smtp gateway üzerinde kullanmaktayım.

Patch'in Uygulanması


Patch http://qmail.jms1.net/patches/validrcptto.cdb.shtml adresinden indirilebiliyor; ve orjinal qmail-.1.3 ve netqmail-1.5(1.6) için iki farklı versiyonu bulunuyor. Ayrıca, bu iki versiyon için de iki ayrı versiyon var; birincisi validrcptto.cdb dosyasının yerinin control/validrcptto.cdb olarak belirlendiği hard-coded versiyon, diğeri ise cdb dosyasının VALIDRCPTTO_CDB değişkeni ile belirlendiği alternatif versiyon. Eğer farklı hizmetler için (örneğin default 25 için ayrı SSL trafiği için ayrı) cdb dosyası kullanmak isterseniz bu alternatif versiyonu kullanabilirsiniz.
NOT: Patch, FreeBSD 7.2 üzerinde halihazırda çalışmakta olan bir netqmail-1.6 üzerine uygulanmıştır. Eğer LWQ yönergelerini izleyerek yeni bir netqmail kurulumu yapıyorsanız, patch'i netqmail'in ./collate.sh scriptini çalıştırdıktan sonra uygulamanız gerekmektedir.

Patch'i uygulamak için qmail'in kaynak kodlarının bulunduğu dizini de kapsayan ana dizine girin. Benim sistemimde, kodlar /usr/local/src/ altında netqmail-1.06 dizininde bulunmakta.  Bu nedenle patch'i uygulama adımları şu şekilde:

Önce qmail'i durdurun. (Tabii qmail kuruluysa).

# qmailctl stop

Sonra qmail kaynak kod dizininin de bulunduğu ana dizine gidip patch'i download edin:

# cd /usr/local/src
# fetch http://qmail.jms1.net/patches/netqmail-1.05-validrcptto.cdb.patch

Şimdi de qmail kaynak kodlarının bulunduğu dizine girip, patch'i uygulayın:


Patch'i geçtiğiniz zaman çıktı aşağıdakine benzer bir şekilde olmalıdır:

Hmm...  Looks like a unified diff to me...
The text leading up to this was:
--------------------------
|diff -ruN netqmail-1.05-factory/Makefile netqmail-1.05-patched/Makefile
|--- netqmail-1.05-factory/Makefile     2006-08-23 01:03:33.000000000 -0400
|+++ netqmail-1.05-patched/Makefile     2006-08-23 01:03:03.000000000 -0400
--------------------------
Patching file Makefile using Plan A...
Hunk #1 succeeded at 1535.
Hunk #2 succeeded at 1553.
Hmm...  The next patch looks like a unified diff to me...
The text leading up to this was:
--------------------------
|diff -ruN netqmail-1.05-factory/qmail-smtpd.c netqmail-1.05-patched/qmail-smtpd.c
|--- netqmail-1.05-factory/qmail-smtpd.c        2006-08-23 01:03:33.000000000 -0400
|+++ netqmail-1.05-patched/qmail-smtpd.c        2006-08-23 01:03:03.000000000 -0400
--------------------------
Patching file qmail-smtpd.c using Plan A...
Hunk #1 succeeded at 23.
Hunk #2 succeeded at 61.
Hunk #3 succeeded at 101.
Hunk #4 succeeded at 125.
Hunk #5 succeeded at 220.
Hunk #6 succeeded at 335.
Hunk #7 succeeded at 498.
done

Patch'i geçtikten sonra qmail'i derleyerek kurabiliriz.

Warning UYARI: Patch'i halihazırda kullandığınız bir qmail sunucuna geçiyorsanız, ve qmail'i daha önceden özelleştirdiyseniz yeniden kurulum yapmadan önce backup almanızı öneririm. Örnek: Test amaçlı kullandığım qmail üzerinde qsheff ile spamassassin çalışıyordu ve bu nedenle değiştirilmiş bir qmail-queue dosyası kullanıyordum; yeniden kurulum /var/qmail/bin/ dizini altındaki binary dosyalarını yenilediği için kurulum sonrasında qmail-queue dosyasını yeniden düzenlemem gerekti.

qmail'i herzamanki gibi kuruyoruz:

# make setup check
# ./config-fast testq.cagriersen.net

Not: (Alan adını kendinize göre düzenlemeyi unutmayın.)

Kurulum tamamlandıktan sonra, qmail'e alıcı doğrulama özelliği eklenmiş oluyor. Ancak qmail'i başlatmadan önce kullanıcı listesini oluşturmak ve bu listeyi bir  cdb dosyasına dönüştürmemiz gerekiyor.

Kullanıcı Listesinin Oluşturulması


Şimdiki adım, cdb dosyasının oluşturulması sırasında gerekecek olan, kullanıcı listesinin text olarak oluşturulması ile ilgili. Bu aşamada, aşağıdaki iki farklı senaryo'dan biri size uyuyor olabilir:
  1. qmail stand-alone olarak çalışıyordur.
  2. qmail'i arkadaki smtp sunucuları için gateway olarak kullanıyordur.

Her iki senaryo için de kullanıcı listesini oluşturmak için farklı yöntemler gerekir.

Stand-alone qmail sunucusunda Kullanıcı Listesi Oluşturmak

Sunucunuz, stand-alone çalışıyorsa, yani posta kutuları kendi üzerindeyse  (ve vpopmail kullanıyorsanız) kullanıcı listesi oluşturmak epey kolaydır.

Vpopmail'in vpopbull isimli betiğinden yararlanarak sistemdeki tüm kullanıcıları çekebililir ve bir text dosyasına yazdırabilirsiniz.

# ~vpopmail/bin/vpopbull -n > /var/qmail/control/validrcptto.txt

Bu şekilde tüm kullanıcılarınız var/qmail/control/ dizini altında validrcptto.txt dosyasına yazılacaktır.

Gateway qmail Sunucusunda Kullanıcı Listesi Oluşturmak

Eğer sunucunuz, arkadaki başka mail sunucuları için anti-, antivirus gateway hizmeti veriyorsa, arkadaki sunuculardan kullanıcı listelerini çekmeniz gerekir.  Bu işlemi manuel yapmayı tercih edeceğiniz gibi arkadaki sunucularda çok fazla sayıda kullanıcınız varsa listeyi otomatik oluşturmak isteyebilirsiniz.

qmail

Örneğin arkadaki sunucu qmail ise ve vpopmail'iniz mysql destekli çalışıyorsa, gateway'den mysql'e  bağlanabilir ve kullanıcıları bir listeye export edebilirsiniz. Bu işi bir php scripti ile de yapabilmeniz mümkün.

Ms Exchange

Eğer arkadaki sunucu Exchange ise LDAP üzerinden çekebilirsiniz, bu işi Postfix sunuculardan yapabilmek için yazılmış bir perl scripti var. Orjinaline http://www-personal.umich.edu/~malth/gaptuning/postfix/ erişebileceğiniz  bu scripti qmail ve validrcptto'ya uyarlamak için biraz değiştirdim. Scriptin qmail'e uyarlanmış şekline buradan erişebilirsiniz.

Bu script'in çalışabilmesi için öncelikli olarak qmail üzerinde perl Net::LDAP modülü yüklü olmalı. Bu modülü aşağıdaki şekilde kurabilirsiniz:

# perl -e 'use CPAN; install Net::LDAP'

Modül kurulduktan sonra, scripti editleyerek, kendi domain controller ismi, kullanıcı ve şifre bilgilerinizi girerek çalıştırabilirsiniz. Bağlantı için kullanılacak user'ın AD üzerinde özel yetkilere sahip olmasına gerek yok. Tek gereken şey, qmail'inizin Domain Controllerlar'a  TCP 389. porttan erişebiliyor olmasıdır.

Scripti cron'a ekleyip belirli sürelerde kullanıcıların Exchange'den çekilmesini sağlayabilirsiniz.

Not:  Oluşturulan text dosyası bir sonraki bölümde anlatılacağı üzere bir cdb database'ine dönüştürülmelidir, bu nedenle cron tarafından çalışrılacak scriptin,  exchange'den kullanıcıları çektikten sonra text dosyasını cdb'ye çevirmesini de sağlamalısınız.

CdbMake-12 ile  CDB Dosyasının Oluşturulması


Kullanıcıların e-posta adreslerini içeren text dosyasını cdb'ye dönüştürmek için ben cdbmake isimli yazılımı kullanıyorum. Oldukça kolay bir kurulumu ve kullanımı var.

Önce cdbmake'i kuralım.

# cd /usr/local/src
# fetch http://cr.yp.to/cdb/cdb-0.75.tar.gz
# tar xvf cdb-0.75.tar.gz
# cd cdb-0.75
# make
# make setup check

Kurulumdan sonra, validrcptto.txt dosyasnı validrcptto.cdb dosyasına çevirelim.


Cdb dosyasının oluşturuldu, artık qmail alıcı doğrulama işlemini yapabilir.(validrcptto.txt dosyasını her güncellediğinizde yukarıdaki komutu kullanarak cdb'yi yeniden build etmeyi unutmayın. Aksi halde yeni eklenen kullanıcılar mail alamazlar.)

VALIDRCPTTO_LIMIT Çevre Değişkeni


Son olarak qmail'i start etmeden önce yazının başında bahsettiğim oturum başına yapılabilecek doğrulama işlemini limitleme işleminden bahsetmek istiyorum. Default'u 10 olan doğrulama limitini VALIDRCPTTO_LIMIT çevre değişkenini kullanarak azaltmak ya da arttırmak için /var/qmail/supervise/qmail-smtpd/run dosyasına aşağıda kırmızı ile işaretlenmiş  eklemeleri yapmanız gerekir.
#!/bin/sh

QMAILDUID=`id -u qmaild`
NOFILESGID=`id -g qmaild`
MAXSMTPD=`cat /var/qmail/control/concurrencyincoming`
LOCAL=`head -1 /var/qmail/control/me`
VALIDRCPTTO_LIMIT=5

if [ -z "$QMAILDUID" -o -z "$NOFILESGID" -o -z "$MAXSMTPD" -o -z "$LOCAL" ]; then
    echo QMAILDUID, NOFILESGID, MAXSMTPD, or LOCAL is unset in
    echo /var/qmail/supervise/qmail-smtpd/run
    exit 1
fi

if [ ! -f /var/qmail/control/rcpthosts ]; then
    echo "No /var/qmail/control/rcpthosts!"
    echo "Refusing to start SMTP listener because it'll create an open relay"
    exit 1
fi
export VALIDRCPTTO_LIMIT

Bu durum, herhangi bir yöntemle tüm kullanıcılarınızın listesinin çıkarılmasını engellemenize yardımcı olur.

Artık qmail'i çalıştırabilirsiniz.

# qmailctl start

Herşey yolunda gittiyse, /var/log/qmail/smtpd/current log dosyasından takip edebileceğiniz üzere, sisteminizde olmayan kullanıcılara mail gönderilme girişimleri smtp seviyesinde reddedilecektir.

Log dosyasının çıktısı şu şekilde görünecektir.

@400000004a1aa5ee2c8bdcac tcpserver: ok 35917 testq.cagriersen.net:192.168.200.233:25 crom.cagriersen.net:192.168.200.199::53269
@400000004a1aa6042a37abac qmail-smtpd: not in validrcptto: [email protected] at 192.168.200.199

Kaynak:

http://qmail.jms1.net/patches/validrcptto.cdb.shtml

Visited 491 times, 1 visit(s) today
Kategoriler: *nix,Qmail |

Bu yazılar da ilginizi çekebilir:


- qmail – Oversize DNS Patch
- Netqmail
- qmail Kurulum Scripti – FreeBSD 9.x
- Rblsmtpd
- Spamdyke – Spam filter for qmail

Yorumlar


  1. Val | (Eylül 29th, 2009 5:02 pm)

    Merhaba,

    Qmal 1.2.11 sürümünü kullanıyorum. Mevcut qmail ile yeniden derlemeden bu yamayı geçebilir miyim?

    [Cevapla]

    Cagri Ersen tarafından yanıtlandı.

    Merhaba, malesef yeniden derlemeniz gerekir. Ayrıca, hangi smtp-auth patch’ini kullandiginizi da bilmeniz gerekiyor. Cunku bazi patch’lerle cakisiyor.

    Bir de qmail sürümünüzde bir yanılgınız var sanırım. En son netqmail sürümü 1.06.

    Selamlar.

    [Cevapla]

  2. Val | (Eylül 29th, 2009 8:34 pm)

    Merhaba,

    qmail sürümüm yerine qmail admin sürümünü yazmışım. Kafam dağınık kusura bakmayın.

    Aslında problemim farklı qmail-smtpd/run içerisinde bir şey değiştirdiğimde ( örneğin rblsmtpd ) ya çalışmıyor ya da smtp’ye auth yapılamıyor.yani smtp çalışmıyor.
    Problemin konusu sanırım burası değil. Qmail’e yabancı olduğum için sizin blogunuzu gördüm kusura bakmayın.

    [Cevapla]

Trackbacks

Yorumda bulunun.