© 2003-10-02 Bartłomiej Siębab ver. 1.6
WSTĘP
Czym jest qmail?
qmail to bezpieczny i wydajny serwer poczty internetowej posługujący sie protokołem SMTP. Został zaprojektowany dla typowych serwerów UNIX i charakteryzuje się doskonałą wydajnością w działaniu pod bardzo dużym obciążeniem przy ogromnych ilościach przetwarzanej poczty. Potrafi obsługiwać wirtualne skrzynki pocztowe bez konieczności zakładania tradycyjnych kont. Jego autorem jest profesor
D.J.Bernstein. Architektura qmaila (w przeciwieństwie do Sendmaila) została opracowana w oparciu o wiele małych, sprawnych i dedykowanych programów zajmujących sie konkretnymi zadaniami serwera pocztowego. Każdy z nich wykonuje swoje zadania efektywnie i bezpiecznie. Każdy posiada minimalne uprawnienia niezbędne do wykonywania czynności jedynie jemu
przeznaczonych i niczego ponadto. W tym artykule opiszę proces przygotowania qmaila do pracy ze skrzynkami pocztowymi w formacie Maildir, które charakteryzują się przechowywaniem każdego emaila w osobnym pliku.
INSTALACJA
W systemie FreeBSD 4.x instalacja qmaila 1.3 jest niezwykle prosta ze względu na mechanizm "/usr/ports". Każdy kto kiedyś "ręcznie" pierwszy raz instalował qmaila bez użycia "ports" ze względu na jego "specyficzną" filozofię zapewne spędził nad dokumentacją wiele godzin ;-). Teraz jednak wystarczy wykonać poniższe czynności a system zostanie po samoczynnym ściągnięciu źródeł z internetu automatycznie skompilowany, wstępnie skonfigurowany i zainstalowany:
$/> cd /usr/ports/mail/qmail
$/usr/ports/mail/qmail> make install clean
Pamiętajmy że domyślnym MTA we FreeBSD jest "fabrycznie" sendmail tak więc instalacja qmaila zmieni parametry w /etc/mail/mailer.conf na poniższe (co zresztą warto sprawdzić):
$/etc/mail> cat mailer.conf
# Configuration for mailwrapper is kept in /etc/mail/mailer.conf.
# Replace that file with this one to enable qmail under a sendmail
# disguise. Very useful.
#
sendmail /var/qmail/bin/sendmail
send-mail /var/qmail/bin/sendmail
mailq /var/qmail/bin/qmail-qread
newaliases /var/qmail/bin/newaliases
Jak zainstalować qmaila w
Slackware Linux można przeczytać tutaj:
http://www.linuxstar.pl/qmail.htm
Wyłączenie sendmaila
Teraz wyłączamy w /etc/rc.conf automatyczne uruchamianie sendmaila na rzecz qmaila, który będzie startował poprzez skrypty w /usr/local/etc/rc.d gdzie jego start podzielimy na trzy niezależne funkcjonalnie podsystemy:
$/etc>grep sendmail rc.conf
# autostartowy skrypt MTA (można tu też podpiąć od razu qmaila)
mta_start_script="/etc/rc.sendmail"
# Settings for /etc/rc.sendmail:
sendmail_enable="NONE" # Run the sendmail inbound daemon (YES/NO/NONE).
# If NONE, don't start any sendmail processes.
sendmail_flags="-L sm-mta -bd -q30m" # Flags to sendmail (as a server)
sendmail_submit_enable="NO" # Start a localhost-only MTA for mail submission
sendmail_submit_flags="-L sm-mta -bd -q30m -ODaemonPortOptions=Addr=localhost"
sendmail_outbound_enable="NO" # Dequeue stuck mail (YES/NO).
sendmail_outbound_flags="-L sm-queue -q30m" # Flags to sendmail (outbound only)
sendmail_msp_queue_enable="NO" # Dequeue stuck clientmqueue mail (YES/NO).
sendmail_msp_queue_flags="-L sm-msp-queue -Ac -q30m" # Flags for sendmail_msp_queue daemon.
To ustawienie gwarantuje nieuruchamianie żadnego z procesów sendmaila.
Skrypty startowe
Utworzymy skrypty startowe qmail' w /usr/local/etc/rc.d poprzez podlinkowanie symboliczne:
$/usr/local/etc/rc.d> ls -l | grep qmail
lrwx------ 1 root wheel 19 14 Wrz 15:32 pop3d.sh -> /var/qmail/pop3d.rc
lrwx------ 1 root wheel 22 14 Wrz 15:32 reciving.sh -> /var/qmail/reciving.rc
lrwx------ 1 root wheel 21 14 Wrz 15:32 sending.sh -> /var/qmail/sending.rc
$/usr/local/etc/rc.d> cd /var/qmail ; ls -l *.rc
-r-xr-xr-x 1 root qmail 385 Aug 24 1999 pop3d.rc
-r-xr-xr-x 1 root qmail 842 Nov 24 1999 reciving.rc
-r-xr-xr-x 1 root qmail 311 Aug 24 1999 sending.rc
$/var/qmail> cat pop3d.rc
#!/bin/sh
# Using splogger to send the log through syslog.
# Using qmail-local to deliver messages to Maildir format by default
#
# uruchamianie uslugi pop (odbior poczty ze skrzynek)
pathtmp=$PATH
PATH=/var/qmail/bin:$PATH
/usr/local/bin/tcpserver 0 pop3 /var/qmail/bin/qmail-popup twojhost.jakasdomena.pl \
/bin/checkpassword /var/qmail/bin/qmail-pop3d Maildir &
$/var/qmail> cat reciving.rc
#!/bin/sh
#
# Using splogger to send the log through syslog.
# Using qmail-local to deliver messages to Maildir format by default
#
# uruchamianie uslug smtpd (przyjmowanie poczty przez serwer)
pathtmp=$PATH
PATH=/var/qmail/bin:$PATH
# wywolanie z plikiem adresow relay oraz po wdrozeniu spamcontrol
/usr/local/bin/tcpserver -v -x /etc/tcp.smtp.cdb -u 82 -g 81 0 smtp \
/var/qmail/bin/qmail-smtpd 2>&1 | /var/qmail/bin/splogger smtpd &
$/var/qmail> cat sending.rc
#!/bin/sh
#
# Using splogger to send the log through syslog.
# Using qmail-local to deliver messages to Maildir format by default
#
# uruchamianie procesow wysylki poczty przez serwer
pathtmp=$PATH
PATH=/var/qmail/bin:$PATH
/var/qmail/bin/qmail-start ./Maildir/ splogger qmail &
qmail może być uruchamiany także poprzez inetd (odpowiednie wpisy w /etc/inetd.conf), jednak ja zdecydowałem sie na wykorzystanie pakietu
ucspi-tcp tego samego autora. Program
tcpserver z tego pakietu umożliwia nam ustawianie wielu specyficznych dla qmaila parametrów startowych. Kompilacja ze źródeł i
instalacja tego pakietu jest niezwykle prosta, może być także we FreeBSD wykonana poprzez mechanizm "ports". Dodatkowym pakietem niezbędnym do autoryzacji usługi pop jest pakiet
checkpassword tego samego autora. Jego
instalacja jest równie banalna jak w poprzednim przypadku.
Tak zainstalowany w podstawowej konfiguracji qmail wraz z dodatkowymi modułami jest już prawie gotowy do działania. Czas dokonać niezbędnych wpisów w DNS oraz w plikach sterujących działaniem qmaila. W przytoczonych powyżej skryptach startowych użyłem dodatkowego modułu
spamcontrol którego opis konfiguracji i instalacji przedstawiam w kolejnych rozdziałach. Start serwera automatycznie powoduje uruchomienie skryptów startowych i tym samym rozpoczęcie działania przez qmaila.
Oczywiście możemy także te skrypty uruchomić "ręcznie". Rozdzielenie funkcji na trzy oddzielne skrypty pozwala na "dłubanie" przy qmail'u bez konieczności zatrzymywania całego serwera poczty. Przykładowo zmieniając coś przy części odbiorczej możemy jedynie zatrzymać odbieranie przesyłek podczas gdy wysyłka poczty z kolejki pocztowej nadal działa. Inną metodą jest uruchamianie poprzez tzw. "svc" z pakietu
daemontools co opisuje dokumentacja qmaila.
Jeśli oprócz usługi pop3 chcemy także udostępnić możliwość "katalogowego" czytania poczty poprzez usługi imap to możemy zainstalować i skonfigurować pakiet
courier-imap, który dedykowany jest właśnie do współpracy ze skrzynkami pocztowymi typu Maildir.
DNS
Działanie serwera pocztowego wymaga ustawienia w opisie strefy dns odpowiednich wpisów zapewniających przyjmowanie i obsługę poczty dla całej domeny. Poniżej przedstawiam taką strefę (przykład dla bind'a) wraz z rekordem
MX (Mail eXchanger):
$>cd /etc/namedb/s ; head -12 jakasdomena.pl
@ IN SOA twojhost.jakasdomena.pl. hostmaster.jakasdomena.pl. (
200210081235
8H ; Refresh
2H ; Retry
1W ; Expire
1D ) ; Minimum
;
NS twoj.primary.dns.jakasdomena.pl.
NS twoj.secondary.dns.innadomena.pl.
MX 10 twojhost
;
W przykładowej strefie domeny vt.pl rekord MX wskazuje, że cała poczta kierowana do tej domeny jest obsługiwana przez serwer voyager.vt.pl i jest to warunek konieczny dla działania wysyłki poczty "po domenie". Nie będę przedstawiać tu szczegółowych opisów konfiguracji serwera usługi dns bowiem nie to jest celem tego artykułu. Zainteresowanych odsyłam do dokumentacji ich serwera dns czy to bind'a czy djb-dns. Pamiętajmy, że każda zmiana w pliku strefy wymaga zwiększenia nr seryjnego i restart dns'a.
KONFIGURACJA
Pliki konfiguracyjne qmaila znajdują się w katalogu /var/qmail/control i mają różnoraki wpływ na jego działanie i zachowanie. Poniższy listing przedstawia pliki po wdrożeniu modułu spamcontrol oraz PolSpam:
$/var/qmail/control> ls -l
-rw-rw-r-- 1 root wheel 0 Nov 11 13:14 badmailfrom
-rw-r--r-- 1 root qmail 4 Nov 11 11:47 badmailpatterns
-rw-r--r-- 1 root qmail 4 Nov 11 11:48 badrcptpatterns
-rw-r--r-- 1 root qmail 44 Nov 15 09:17 badrcptto
-rw-r--r-- 1 root qmail 1053293 Nov 17 13:31 blackholedsender
-rw-r--r-- 1 root qmail 0 Nov 11 12:21 databytes
-rw-r--r-- 1 root qmail 6 Nov 11 11:37 defaultdomain
-rw-r--r-- 1 root qmail 6 Aug 19 1999 defaulthost
-rw-r--r-- 1 root qmail 60 Nov 11 11:41 locals
-rw-r--r-- 1 root qmail 0 Nov 11 11:04 maxrecipients
-rw-r--r-- 1 root qmail 14 Nov 11 11:37 me
-rw-r--r-- 1 root qmail 0 Nov 11 11:03 nodnscheck
-rw-r--r-- 1 root qmail 6 Nov 11 11:37 plusdomain
-rw-r--r-- 1 root qmail 50 Nov 11 11:42 rcpthosts
-rw-r--r-- 1 root qmail 0 Nov 11 11:02 relayclients
-rw-r--r-- 1 root qmail 6 Nov 11 11:49 relaydomains
-rw-r--r-- 1 root qmail 11 Nov 11 12:17 relaymailfrom
-rw-r--r-- 1 root qmail 9441280 Nov 17 13:31 spammers.db
-rw-r--r-- 1 root qmail 3 Nov 11 12:32 tarpitcount
-rw-r--r-- 1 root qmail 2 Nov 11 12:03 tarpitdelay
-rw-r--r-- 1 root qmail 277 Nov 11 11:45 uwaga.txt
-rw-r--r-- 1 root qmail 20 Aug 19 1999 virtualdomains
Omówienie ważniejszych plików
- badmailfrom adresy lub domeny, od których serwer nie przyjmie i zwróci pocztę kierowaną do niego
- badmailpatterns wyrażenia regularne (regexp) ogólnie opisujące wzorzec adresów lub domen nadawcy, od których serwer nie przyjmie i zwróci pocztę kierowaną do niego
- badrcptpatterns wyrażenia regularne (regexp) ogólnie opisujące wzorzec adresów lub domen odbiorcy, do których serwer nie przyjmie i zwróci pocztę kierowaną do niego
- blackholedsender nazwy hostów lub domen, od których przychodzące połączenia do serwera poczty w ogóle nie będą przyjmowane, do tego pliku trafia baza spamerów aktualizowana z serwisu PolSpam
- nodnscheck tu znajdują się nazwy hostów lub domen, z których przy przyjmowaniu poczty serwer nie będzie sprawdzał zgodności z revdns
- rcpthosts nazwy hostów, dla których serwer przyjmuje pocztę
- relaydomains nazwy domen, od których serwer przyjmuje i przetwarza pocztę do dalszej wysyłki
- relaymailfrom adresy email które mają zezwolenie na przyjmowanie poczty do dalszej wysyłki
- maxrecipients maksymalna liczba jednoczesnych odbiorców w pojedynczym mailu
- tarpitcount liczba jednoczesnych odbiorców w pojedynczym mailu po której zostanie aktywowane opóźnienie przyjmowania poczty
- tarpitdelay czas opóźnienia przyjmowania poczty tzw. "tarpiting"
- databytes maksymalny rozmiar (w bajtach) maila
- virtualdomains nazwy domen wirtualnych, dla których serwer przyjmuje pocztę
Relaying
qmail jest systemem pocztowym, w którym należy określić z jakich adresów IP lub domen lub adresów email dozwolone jest przyjęcie poczty do dalszej wysyłki czyli tzw. relaying. Jest kilka metod na odpowiednie skonfigurowanie tego mechanizmu. Nie wolno otwierać relayowania poczty na cały świat bo bardzo łatwo można trafic do antyspamerskich baz typu ORBs tym samym blokując sobie serwer, bowiem nagle okazuje się że inne serwery poczty nie chcą przyjmować od nas poczty ze względu na naszą otwartość dla spamerów.
Mechanizm ten zapewnia udostępnia nam moduł tcpserver. Odpowienie wywołanie w skrypcie startowym reciving.sh pozwala na korzystanie przez tcpserver z dodatkowego pliku /etc/tcp.smtp.cdb bazy adresów IP, od których dozwolone jest przyjęcie poczty w celu jej relayowania. W tym celu tworzymy tekstowy plik ze spisem tych adresów IP:
$/etc> head -3 tcp.smtp
127.:allow,RELAYCLIENT=""
192.168.100.1-255:allow,RELAYCLIENT=""
10.1.0.:allow,RELAYCLIENT=""
Następnie konwertujemy go do bazy cdb z której korzysta tcpserver:
$/etc> tcprules /etc/tcp.smtp.cdb /etc/tcp.smtp.tmp < /etc/tcp.smtp
Teraz do dalszego przekazania zostanie przyjęta jedynie poczta z wyspecyfikowanych adresów IP hostów. Dodatkowo przy wykorzystaniu modułu spamcontrol możemy zezwolić na relayowanie poczty na podstawie domeny czy adresu nadawcy (pliki relaydomains i relaymailfrom).
SKRZYNKI
Maildir
Natywnym formatem skrzynek pocztowych qmaila jest format Maildir, który ze względu na przechowywanie przesyłek w odrębnych plikach jest szczególnie odporny na różne rodzaje awarii systemu plików serwera, bowiem w razie np. awarii zasilania (gdy nie mamy ups'a) podczas zapisu poczty do skrzynki, utracić można jedynie jeden email, w przeciwieństwie do formatu mailbox gdzie wszystkie przesyłki są w jednym pliku, co grozi całkowitą utratą całej poczty w tej hipotetycznej sytuacji. Do obsługi poczty w trybie terminalowym polecam program
mutt, który potrafi obsłużyć skrzynki pocztowe zarówno typu mailbox jak i Maildir.
Quota
Każdy z użytkowników poczty powinien mieć założoną skrzynkę pocztową. Skrzynki są zakładane w katalogu domowym użytkownika i oczywiście podlegają restrykcji zarówno względem ilości miejsca jak i ilości plików/przesyłek. Dba o to mechanizm quoty i obejmuje w tym przypadku zarówno pocztę jak i pozostałe pliki użytkownika. Poczta jest przechowywana z prawami użytkownika i dlatego można mu limitować jej objętość:
$> quota jkowalski
Disk quotas for user jkowalski (uid 9999):
Filesystem usage quota limit grace files quota limit grace
/home 24 20000 20000 14 1000 1000
Założenie skrzynki
Jednorazowe założenie skrzynki polega na założeniu określonej struktury katalogów w $HOME (katalogu domowym) użytkownika. Do tego celu służy polecenie
maildirmake wywoływane w następujący sposób:
$> umask
022
$> cd /home/jkowalski
$/home/jkowalski> maildirmake Maildir
$/home/jkowalski> chown -R jkowalski:jkowalski Maildir ; chmod -R g-rwx,o-rwx Maildir
$/home/jkowalski> ls -lR Maildir
total 3
drwx------ 2 jkowalski jkowalski 512 Mar 31 2000 cur
drwx------ 2 jkowalski jkowalski 512 Oct 25 19:02 new
drwx------ 2 jkowalski jkowalski 512 Oct 25 15:10 tmp
Maildir/cur:
Maildir/new:
Maildir/tmp:
Szablon
Możemy wymusić automatyczne zakładanie Maildir'a każdemu nowo tworzonemu użytkownikowi poprzez założenie takiej struktury jako szablonu w /usr/share/skel i wtedy gdy zakładamy użytkownika np. poleceniem
adduser jkowalski to system automatycznie skopiuje nam także Maildir'a wraz z innymi plikami typu dot.profile itp. Jedyną różnicą jest właściciel i grupa pliku która zostanie automatycznie zmieniona na użytkownika i jego grupe po tej operacji:
$/usr/share/skel> ls -lR Maildir
total 3
drwx------ 2 root wheel 512 Jan 9 2002 cur
drwx------ 2 root wheel 512 Jan 9 2002 new
drwx------ 2 root wheel 512 Jan 9 2002 tmp
Maildir/cur:
Maildir/new:
Maildir/tmp:
Wpis do bazy skrzynek pocztowych
Czas na dopisanie skrzynki użytkownika do bazy skrzynek qmaila. W celu zwiększenia wydajności qmail używa specjalnych plików baz danych
cdb. Tak jak w przypadku bazy hostów relayowanych, dopisanie skrzynki polega na dodaniu odpowiedniego wpisu "ulubionym edytorem" do pliku tekstowego a następnie jego konwersję do pliku bazy cdb. Przykładowy wpis:
$> cd /var/qmail/users
$/var/qmail/users> cat assign
=jan.kowalski:jkowalski:9999:9999:/home/jkowalski:::
+jk-:jkowalski:9999:9999:/home/jkowalski:-::
.
$/var/qmail/users> qmail-newu
Pamiętajmy o
niezbędnej kropce na końcu pliku. Dlaczego jest niezbędna? To znajdziecie oczywiście w dokumentacji qmaila ;-). Jak widzimy w powyższym przykładzie użytkownik otrzymał od nas skrzynkę postaci
jan.kowalski@jakasdomena.pl oraz
jk@jakasdomena.pl jego uid/gid to 9999 (taki jak w rzeczywistości posiada) a położenie skrzynki jest w jego katalogu domowym. Użytkownik ma mozliwość korzystania z plików typu
.qmail-costam co pozwala mu na samodzielne założenie np. kilku aliasów pocztowych np.
jk-praca@jakasdomena.pl poprzez utworzenie pliku .qmail-praca w swoim katalogu domowym. Na koniec wykonujemy konwersję do bazy cdb poleceniem
qmail-newu. Możliwe jest hurtowe wygenerowanie skrzynek na podstawie pliku passwd i oczywiście jest to opisane w dokumentacji qmaila.
WALKA ZE SPAMEM
SpamControl
W celu większej funkcjonalności związanej z kontrolą spamu zainstalowałem moduł
SPAMCONTROL, który udostępnia kontrolę wielu aspektów, o których już wcześniej wspominałem przy opisie konfiguracji. Co potrafi ten moduł? Oczywiście jest to dokładnie opisane na stronie domowej projektu SpamControl. Schematycznie jego działanie przedstawione jest na
załączonym rysunku w formacie pdf.
Instalacja
Instalacja modułu polega na spaczowaniu źródeł qmaila, ponownej kompilacji i podmianie kilku oryginalnych plików qmaila na nowo utworzone. Najprościej można to wykonać poprzez zapaczowanie w "ports" już skompilowanego qmaila i jego rekompilację z reinstalacją. Koniecznie i na wszelki wypadek należy zabezpieczyć sobie aktualne pliki konfiguracyjne qmaila, skrypty startowe, bazę użytkowników i relayowania, tak aby instalacja nie "przykryła" nam naszych cennych oryginałów tymi dystrybucyjnymi. Po zabezpieczeniu tych plików ja zrobiłem to tak:
$> cd /usr/ports/mail/qmail
$/usr/ports/mail/qmail> make
Tutaj wykonuje się ściągnięcie źródeł qmaila (o ile ich nie ma w systemie) i jego kompilacja, usuwamy także znacznik zakończenia kompilacji i następnie paczujemy źródła modułem SpamControl, sprawdzamy czy wszystko przebiegło poprawnie, instalujemy qmaila:
$/usr/ports/mail/qmail> cd work
$/usr/ports/mail/qmail/work> ls -al .[bi]*_done.qmail-1.03_1
-rw-r--r-- 1 root wheel 0 Nov 11 11:22 .build_done.qmail-1.03_1
-rw-r--r-- 1 root wheel 0 Nov 11 11:37 .install_done.qmail-1.03_1
$/usr/ports/mail/qmail/work> rm .[bi]*_done.qmail-1.03_1
$/usr/ports/mail/qmail/work> cd qmail-1.03
$/usr/ports/mail/qmail/work/qmail-1.03> fetch http://www.fehcom.de/qmail/spamcontrol_180_tgz.bin
$/usr/ports/mail/qmail/work/qmail-1.03> tar -zxvf spamcontrol_180_tgz.bin
$/usr/ports/mail/qmail/work/qmail-1.03> ./spamcontrol.sh
$/usr/ports/mail/qmail/work/qmail-1.03> cat spamcontrol.log
Running spamcontrol.sh INSTALLATION at Mon Nov 11 11:20:04 CET 2002 for Revision 180 <<< --> Makefile copied to Makefile.180
--> qmail-smtpd.c copied to qmail-smtpd.c.180
--> qmail-smtpd.8 copied to qmail-smtpd.8.180
--> qmail-showctl.c copied to qmail-showctl.c.180
--> qmail-control.9 copied to qmail-control.9.180
--> qmail-log.5 copied to qmail-log.5.180
--> ipme.c copied to ipme.c.180
$/usr/ports/mail/qmail/work/qmail-1.03> cd ../..
$/usr/ports/mail/qmail> make install clean
Na koniec przywracamy oryginały naszych plików konfiguracyjnych które zostały zastąpione dystrybucyjnymi z oryginałów w źródłach qmaila.
Całą operację wykonujemy po zatrzymaniu procesów wysyłki i odbioru poczty qmaila. Po poprawnej instalacji standardowo możemy uruchomić serwer pocztowy naszymi skryptami startowymi. Należy "zająć się" nowymi plikami konfiguracyjnymi qmaila i w zależności od potrzeb je utworzyć (z właściwymi prawami). Od tego momentu dostepne są także zaktualizowane manuale do
qmail-smtpd oraz
qmail-control a także
qmail-log. Nową funkcjonalność qmaila wykorzystamy do lepszej ochrony antyspamowej poprzez wykorzystanie baz spamerów z serwisu PolSpam. Nie zapominajmy o możliwości filtrowania poczty przy pomocy pakietu
maildrop, który moim zdaniem jest dużo łatwiejszy w konfigurowaniu regułek.
MailDrop
Pakiet ten możemy standardowo zainstalować przy pomocy mechanizmu "ports". Znajdziemy go poprzez tradycyjne przeszukanie bazy ports:
$/usr/ports> make search key=maildrop
Port: maildrop-1.3.8
Path: /usr/ports/mail/maildrop
Info: Replacement local mail delivery agent, similar to procmail
Maint: petef@FreeBSD.org
Index: mail
B-deps: gdbm-1.8.0
R-deps: gdbm-1.8.0
$/usr/ports> cd mail/maildrop ; make install clean
Każdy użytkownik może przy jego pomocy filtrować pocztę dostarczaną do skrzynki pocztowej. Oto prosty przykład odfiltrowania Koreańskiego spamu po kodowaniu zawartym w nagłówku poczty:
jkowalski@jakishost> cd
jkowalski@jakishost:~> cat .qmail
| preline /usr/local/bin/maildrop
jkowalski@jakishost:~> head -20 .mailfilter
# filtrowanie wedlug kodowania i won do folderu SPAM
if ( /^Content-Type: text\/html; charset="ISO-8859-11"/ )
{
exit
}
if ( /^Content-Type: text\/html; charset="ks_c_5601-1987"/ )
{
exit
}
if ( /^Content-Type: text\/html; charset="euc-kr"/ )
{
exit
}
if ( /^Content-Type: text\/html; charset="EUC-KR"/ )
{
exit
}
# a reszta dostarczana normalnie
to "$HOME/Maildir/"
PolSpam
Do funkcjonalności modułu SpamControl warto dodać synchronizację z bazami adresów spamerów. Jest to bardzo proste i błyskawiczne do wykonania. Najlepszym krajowym serwisem tego typu jest
PolSpam i stamtąd właśnie będziemy pobierać bazę spamerów. Można to robić albo poprzez pocztę albo poprzez cykliczne pobieranie aktualizacji baz protokołem http i ja tak właśnie zrobiłem.
Skrypty
Cytując autorów:
Na potrzeby cyklicznej synchronizacji autorzy udostępnili dwa skrypty w Perlu, które automatyzują to zadanie. Skrypt sync_web.pl dokonuje synchronizacji lokalnej bazy adresów poprzez połączenie się z serwerem WWW PolSpamu, natomiast skrypt sync_mail.pl umożliwia przetworzenie listy zmian wysyłanych przez PolSpam w formie wiadomości z listy mailingowej.
Obydwa skrypty aktualizują lokalną bazę adresów w pliku o formacie .db, która może być wykorzystana do blokowania spamu przez serwery obsługujące bazy w takim formacie (np. sendmail). Dla oprogramowania wymagającego baz w formacie tekstowym istnieje możliwość, aby skrypt po każdej aktualizacji wygenerował plik tekstowy zawierający adresy z bazy w jednym z formatów: plain, sendmail, qmail, exim czy też procmail.
Kod źródłowy skryptów oraz dokumentacja zawarta jest w pliku polspam.tgz. Skrypty udostępnione są na zasadach licencji BSD - można je używać jak i modyfikować bez żadnych ograniczeń.
Pobieramy skrypty synchronizujące i po drobnych modyfikacjach typu eksportu do pliku tekstowego oraz jego położenia które to należy poprawić w pierwszych kilkunastu liniach w skrypcie sync_web.pl, zaprzęgamy go do pracy:
$> cd /var/qmail/bin
$/var/qmail/bin> fetch http://www.polspam.info/scripts/polspam.tgz && tar -zxvf polspam.tgz
$/var/qmail/bin> chmod a+rx sync_web.pl
$/var/qmail/bin> grep ^my sync_web.pl | head -3
my $db = "/var/qmail/control/spammers"; # Path to .db file [required]
my $type = "qmail"; # Type out output file [optional]
my $file = "/var/qmail/control/blackholedsender"; # Path to output file [optional]
Synchronizacja
Ustawiłem typ eksportu jako plik dla qmaila (prosty plik tekstowy) na /var/qmail/control/blackholedsender co zabroni przyjmowania połączeń ze spamerskich hostów oraz przechowywanie bazy spamerów /var/qmail/control/spammers. Być może perl będzie wymagał modułu
LWP, który już tradycyjną metodą zainstalujemy z "
/usr/ports/www/p5-libwww". Teraz nasz skrypt jest gotowy do użycia. Pierwszy raz kontrolnie uruchamiamy go "z ręki" i sprawdzamy czy wszystko poszło dobrze. Pierwsze ściągnięcie kompletnej bazy spamerów "trochę" trwa ale każda kolejna synchronizacja "dociąga" juz jedynie same zmiany:
$> cd /var/qmail/control
$/var/qmail/control> /var/qmail/bin/sync_web.pl
$/var/qmail/control> ls -l spammers.db
-rw-r--r-- 1 root qmail 9453568 15 Lis 16:47 spammers.db
$/var/qmail/control> ls -l black*
-rw-r--r-- 1 root qmail 1054418 15 Lis 16:48 blackholedsender
Skoro wszystko działa poprawnie to możemy dodać cykliczne (np. co godzinę) uruchamianie synchronizacji z PolSpam do /etc/crontab:
$> grep qmail /etc/crontab
* */1 * * * root (/var/qmail/bin/sync_web.pl 2>&1) >/dev/null
AUTORYZACJA SMTP
Wstęp
Autoryzacja SMTP jest jedną z metod ochrony przed nieuprawnionym korzystaniem z bramki pocztowej. Pozwala to na regulowanie kto może wysyłać poczte przez nasz serwer pocztowy. Uzupełnia to metodę wcześniej opisaną w podrozdziale "Relaying" o dodatkowe możliwości z zastosowaniem autoryzacji użytkownika przed wysyłką poczty. Procedurę tę opisuje dokument
RFC_2554. Wprowadza ona do protokołu SMTP dodatkowe polecenie "AUTH", jednak nie będę tu tego szczegółowo opisywać bowiem jest to wystarczająco prosto zaprezentowane w cytowanym dokumencie RFC_2554.
Implementacja
Do wykonania autoryzacji SMTP można użyć modułu
qmail-smtpd-auth. Oczywiście jest on wykonany jako patch do qmail-smtpd i udostępnia nową funkcjonalność autoryzacji SMTP. Mozna także przygotować zmodyfikowany moduł
cmd5checkpw pozwalający dodatkowo na autoryzację hasłami typu CRAM-MD5 o ile potrzebujemy tego typu autoryzacji oprócz LOGIN czy PLAIN. Konieczne jest wtedy także założenie dodatkowej bazy użytkowników z odpowiadającymi im hasłami.
Postępowanie przy paczowaniu qmaila jest analogiczne jak w przypadku SpamControl. Należy także zmodyfikować skrypt startujący odbiór poczty "reciving.sh" poprzez dodanie dodatkowo wywołania /bin/checkpassword analogicznie jak w skrypcie pop3d.rc uruchamiającym usługę pop3 z autoryzacją.
Wymuszenie autoryzacji
W celu wymuszenia autoryzacji klienta przed zaakceptowaniem przyjmowania od niego przesyłek, można wykorzystać dodatkowy moduł
qmail-smtpd-requireauth, który nakładamy na źródła qmail'a po wcześniejszym zapaczowaniu modułem qmail-smtpd-auth. Moduł ten sprawdza ustawienie zmiennej środowiskowej REQUIREAUTH w regułkach tcpserver'a oraz na tej podstawie decyduje czy przyjąć pocztę od klienta _bez_ czy wyłącznie _po_ wykonaniu wcześniejszej poprawnej autoryzacji. Szczególnie jest to przydatne gdy udostępniamy konta dial-up'owe i chcemy przyjmować (relay) pocztę do dalszej wysyłki z adresów tej wdzwanianki, jednak dopiero gdy użytkownik się zautoryzuje. Zabezpiecza to przed nieuprawnionym wykorzystaniem otwartego dla tej wdzwanianki relay'a do nadużyć.
Informacje dodatkowe
Autoryzacja SMTPD odbywa sie przy aktywnym współudziale zarówno serwera poczty jak i klienta poczty. Różne serwery pocztowe wspierają różne
rodzaje autoryzacji po stronie serwera SMTP. Odpowiednio oprogramowanie klienckie musi posługiwać się tą samą metodą
autoryzacji po stronie klienta co serwer pocztowy do którego wykonywane jest autoryzowane połączenie.
OCHRONA ANTYWIRUSOWA
Qmail Scanner
W celu uruchomienia ochrony antywirusowej na bramce pocztowej (qmail) można zastosować rozwiązanie polegające na podmianie wywołania w qmail'u podprogramu obsługującego kolejke pocztową (qmail-queue) na qmail-scanner-queue.pl.
Qmail-Scanner jest napisany w perl'u przez Jason'a Haar'a. Eleganckim rozwiązaniem jest patch Bruce Guenter'a
QMAILQUEUE. Dzięki niemu qmail-send otrzymuje dodatkową funkcjonalność - rozpoznawanie zmiennej środowiskowej QMAILQUEUE. Zmienna ta powinna zawierać pełna ścieżkę z nazwą programu obsługującego kolejkę. Możemy ją ustawiać w zależności od potrzeb przy pomocy tcpserver'a - np. w regułkach relayingu:
$/etc> head -2 tcp.smtp
127.:allow,RELAYCLIENT="",QMAILQUEUE="/var/qmail/bin/qmail-queue"
192.168.0.1-255:allow,RELAYCLIENT="",QMAILQUEUE="/var/qmail/bin/qmail-scanner-queue.pl"
Skrypty startujące qmail za pośrednictwem tcpserver'a odpowiednio wykorzystują ustawianie zmiennych środowiskowych - tu możemy różnicować ścieżkę do oryginalnego qmail-queue bądź do qmail-scanner-queue.pl w zależności od adresu z jakiego przychodzi połączenie. W powyższym przykładzie przy wysyłaniu poczy przez użytkowników lokalnych serwera nie będzie wykonywane skanowanie poczty, natomiast wysyłka poczty z sieci lokalnej będzie podlegać skanowaniu.
Instalacja sprowadza się do nałożenia patch'a na źródła qmaila, analogicznie jak w przypadku SpamControl, kompilacji i instalacji qmaila. Poprawność implementacji zmiennej QMAILQUEUE w programie qmail-send możemy zweryfikować poleceniem:
$/var/qmail/bin> strings qmail-send | grep QMAIL
QMAILQUEUE
Przed instalacją warto zainstalować narzędzie napisane przez Marka SImpson'a (tnef) służące do rozpakowywania poczty wysyłanej w outlookowym formacie Microsoft's Transport Neutral Encapsulaton Format (oczywiście dostępne w portach).
W przykładowej instalacji zdecydowałem sie nie rozpakowywać załączników pocztowych oraz nie używać zewnętrznego skanera antywirusowego. Wykorzystana jest w tym przypadku jedynie funkcjonalność blokowania poczty z potencjalnie niebezpiecznymi załącznikami. Przykładowa instalacja Qmail-Scanner'a odbywa się następująco:
$~> tar -zxvf qmail-scanner-1.20rc3.tgz && cd qmail-scanner-1.20rc3
$~/qmail-scanner-1.20rc3> ./configure --spooldir /home/qmail/qmailscan \
--admin antiviradmin --notify "sender,admin" --lang "en_PL" --scanners "none" \
--unzip no --log-details yes --bindir /var/qmail/bin
Building Qmail-Scanner 1.20rc3...
This script will search your system for the virus scanners it knows
about, and will ensure that all external programs
qmail-scanner-queue.pl uses are explicitly pathed for performance
reasons.
It will then generate qmail-scanner-queue.pl - it is up to you to install it
correctly.
Continue? ([Y]/N)y
/usr/bin/uudecode works as expected on system...
Found tnef on your system! That means we'll be able to decode stupid
M$ attachments :-)
The following binaries and scanners were found on your system:
mimeunpacker=/usr/local/bin/reformime
uudecode=/usr/bin/uudecode
unzip=/usr/local/bin/unzip
tnef=/usr/local/bin/tnef
Content/Virus Scanners installed on your System
Qmail-Scanner details.
log-details=mailstats.csv
fix-mime=1
debug=1
notify=sender
redundant-scanning=no
virus-admin=antiviradmin@maszyna.gdzies.w.pl
local-domains='maszyna.gdzies.w.pl'
silent-viruses='klez','bugbear','hybris','yaha','braid','nimda','tanatos','sobig
','winevar','palyh','fizzer'
scanners=
If that looks correct, I will now generate qmail-scanner-queue.pl
for your system...
Continue? ([Y]/N)y
Finished. Please read README(.html) and then go over the script to
check paths/etc, and then install as you see fit.
Remember to copy quarantine-attachments.txt to /home/qmail/qmailscan and then
run "qmail-scanner-queue.pl -g" to generate DB version.
########################################################################
##
#
NOTE: No content/virus scanner was found on your system - so only the
internal perlscaner will be available for you to use.
Hope that's what you expected :-)
#
##
########################################################################
****** FINAL TEST ******
Please log into an unpriviledged account and run
/var/qmail/bin/qmail-scanner-queue.pl -g
If you see the error "Can't do setuid", or "Permission denied", then
refer to the FAQ.
(e.g. "setuidgid qmaild /var/qmail/bin/qmail-scanner-queue.pl -g")
That's it! To report success:
% (echo 'First M. Last'; cat SYSDEF)|mail jhaar-s4vstats@crom.trimble.co.nz
Replace First M. Last with your name.
W tym miejscu zdecydowałem, iż najlepiej będzie kontynuowac dalszą instalację ręcznie.
Założyłem w systemie uzytkownika (i grupę) na którym będzie wykonywany qmail-scanner-queue.pl. Utworzyłem katalog w którym odbywa się cały proces skanowania oraz gdzie znajdują się pliki konfiguracyjne. Wszystko to opisuje
ta strona z dokumentacji. Należy stworzyć odpowiednią strukturę katalogów, nadac im właściwe prawa dla użytkownika (i grupy) na którym będzie uruchamiany qmail-scanner-queue.pl, stworzyć alias pocztowy antiviradmin do którego będą kierowane maile z informacjami o przechwyconych wirusach. Z uwagi na dziwne zachowanie qmail-scanner-queue.pl polegające na pomijaniu sprawdzania niektórych maili postanowiłem zbadać sprawę. Okazało się że nie zawsze jest wywoływany qmail-scanner-queue.pl a czasem qmail-queue co może wynikać z mojej nietypowej konfiguracji z anti-spam'em i innymi modułami. Postanowiłem podmienić ręcznie odpowiednie pliki i tak:
qmail-queue -> qmail-scanner-queue.pl
qmail-queue-orig
qmail-scanner-queue.pl
W qmail-scanner-queue.pl ręcznie (lub poprzez odpowiednie wywołanie w confugure) zmodyfikowałem wskazanie z qmail-queue na binarkę qmail-queue-orig która powstała poprzez zmianę nazwy oryginalnej qmail'owej qmail-queue. Takie ustawienie definitywnie rozwiązało problem.
Po udanych testach i sprawnym działaniu ostateczna wersja konfiguracji qmail-scanner'a przyjęła postac skryptu jak na poniższym listingu:
#!/bin/sh
echo Przygotowanie qmail-scanner-queue.pl ...
#
./configure --spooldir /home/qmail/qmailscan \
--admin qscan --notify "sender,admin" --lang "en_PL" --scanners "clamscan" \
--unzip no --log-details yes --bindir /var/qmail/bin \
--skip-text-msgs no --no-QQ-check --debug no \
--qmail-queue-binary /var/qmail/bin/qmail-queue-orig
#
echo Kopiowanie do /var/qmail/bin/ ...
cp qmail-scanner-queue.pl /var/qmail/bin/
Podstawowym plikiem konfiguracyjnym sterującym działaniem skanera jest quarantine-attachments.txt
Po każdej wykonanej zmianie w zawartości pliku należy wykonać aktualizację bazy poleceniem:
$>/var/qmail/bin/qmail-scanner-queue.pl -g
perlscanner: generate new DB file from /home/qmail/qmailscan/quarantine-attachments.txt
perlscanner: total of 42 entries.
Przykładowa zawartość tego pliku może wyglądać jak w poniższym przykładzie:
# skanowanie po temacie maila Subject:
MS.*Corporation* Virus-Subject: Falszywy pakiet aktualizacji z koniem trojanskim
ms.*network* Virus-Subject: Falszywy pakiet aktualizacji z koniem trojanskim
MS.*Net* Virus-Subject: Falszywy pakiet aktualizacji z koniem trojanskim
*Microsoft* Virus-Subject: Falszywy pakiet aktualizacji z koniem trojanskim
*Network.Security.* Virus-Subject: Falszywy pakiet aktualizacji z koniem trojanskim
*Network.Critical.* Virus-Subject: Falszywy pakiet aktualizacji z koniem trojanskim
*.Internet.Update* Virus-Subject: Falszywy pakiet aktualizacji z koniem trojanskim
*.Internet.Pack* Virus-Subject: Falszywy pakiet aktualizacji z koniem trojanskim
*Critical.Upgrade* Virus-Subject: Falszywy pakiet aktualizacji z koniem trojanskim
*Critical.Patch* Virus-Subject: Falszywy pakiet aktualizacji z koniem trojanskim
Use.this.patch.* Virus-Subject: Falszywy pakiet aktualizacji z koniem trojanskim
# skanowanie po znanych mime:
EICAR.COM 69 EICAR Test Virus
Happy99.exe 10000 Happy99 Trojan
zipped_files.exe 120495 W32/ExploreZip.worm.pak virus
ILOVEYOU Virus-Subject: Love Letter Virus/Trojan
message/partial.* Virus-Content-Type: Message/partial MIME attachments blocked by policy
application/x-msdownload* Virus-Content-Type: application/x-msdownload MIME attachments blocked by policy
# skanowanie po załącznikach niebezpiecznych:
# .EXE,*.COM,*.BAT,*.CMD,*.VBS,*.PL,*.BAS,*.JS,*.JAVA,
# *.REG,*.SHS,*.PIF,*.SCR,*.DLL,*.SSH,*.CHM,*.HLP,*.LNK
.vbs 0 pliki .vbs moga byc niebezpieczne i sa niedozwolone w poczcie
.lnk 0 pliki .lnk moga byc niebezpieczne i sa niedozwolone w poczcie
.scr 0 pliki .scr moga byc niebezpieczne i sa niedozwolone w poczcie
.wsh 0 pliki .vsh moga byc niebezpieczne i sa niedozwolone w poczcie
.hta 0 pliki .hta moga byc niebezpieczne i sa niedozwolone w poczcie
.pif 0 pliki .pif moga byc niebezpieczne i sa niedozwolone w poczcie
.com 0 pliki .com moga byc niebezpieczne i sa niedozwolone w poczcie
.exe 0 pliki .exe moga byc niebezpieczne i sa niedozwolone w poczcie
.bat 0 pliki .bat moga byc niebezpieczne i sa niedozwolone w poczcie
.cmd 0 pliki .cmd moga byc niebezpieczne i sa niedozwolone w poczcie
.pl 0 pliki .pl moga byc niebezpieczne i sa niedozwolone w poczcie
.bas 0 pliki .bas moga byc niebezpieczne i sa niedozwolone w poczcie
.js 0 pliki .js moga byc niebezpieczne i sa niedozwolone w poczcie
.java 0 pliki .java moga byc niebezpieczne i sa niedozwolone w poczcie
.reg 0 pliki .reg moga byc niebezpieczne i sa niedozwolone w poczcie
.shs 0 pliki .shs moga byc niebezpieczne i sa niedozwolone w poczcie
.dll 0 pliki .dll moga byc niebezpieczne i sa niedozwolone w poczcie
.ssh 0 pliki .ssh moga byc niebezpieczne i sa niedozwolone w poczcie
.chm 0 pliki .chm moga byc niebezpieczne i sa niedozwolone w poczcie
.hlp 0 pliki .hlp moga byc niebezpieczne i sa niedozwolone w poczcie
Należy pamiętać że poszczególne kolumny (pola) są oddzielane znakiem tabulacji. Po całej procedurze instalacji należy zrestartować qmail'a oraz przetestować wysyłkę poczty z serwera oraz z sieci, z załącznikami i bez, z dozwolonymi i nie.
Clam Antivirus
Poprawne działanie qmail-scanner'a umożliwiło dodanie pełnej kontroli antywirusowej przy użyciu darmowego Clam AntiVirus'a. Instalację najłatwiej wykonać przy użyciu port'u /usr/ports/security/clamav wykonując polecenie: cd /usr/ports/security/clamav ; make install clean
Szczegółowy i oryginalny opis instalacji na FreeBSD jest
dostępny tutaj. System port'ów FreeBSD znakomicie ułatwia całą procedurę. Pozostaje jedynie wykonać ręcznie polecenie: freshclam --verbose. W kolejnym kroku należy sporządzić skrypt startujący daemona freshclam (/usr/local/etc/rc.d/clamav.sh) tak aby automatycznie kilka razy na dobę aktualizował naszą bazę sygnatur wirusów:
#!/bin/sh
#
# Startup / shutdown script for Clam Antivirus
case "$1" in
start)
/usr/local/bin/freshclam -d -c 6 -l /var/log/freshclam.log
echo -n ' freshclam'
;;
stop)
/usr/bin/killall freshclam > /dev/null 2>&1 \
&& echo -n ' freshclam'
;;
*)
echo ""
echo "Usage: ^Basename $0 { start | stop }"
echo ""
exit 64
;;
esac
Mks_Vir
opracowanie w toku...
Dokumentacja jest umieszczona na stronie domowej autora qmaila
http://cr.yp.to a także na stronie głównej projektu
http://www.qmail.org manuale dostępne w systemie po zainstalowaniu oprogramowania. Na stronie głównej projektu jest także dostępne FAQ oraz różne dodatki do qmaila. Polecam także lekturę
Life with qmail.
Podziękowania dla Adama Liberackiego za cenne uwagi i korektę, Marka Zbrocha za info o requireauth i pacze do Qmail Scanner'a (obsługa Mks_Vir'a) oraz wszystkich z
pl.comp.os.freebsd za "konstruktywną krytykę".