Konfiguracja systemu pocztowego we FreeBSD na bazie qmaila.

© 2003-10-02 Bartek 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

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śłonej 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ę".

Najnowsza wersja tego opracowania jest dostępna pod adresem: http://bofh.vt.pl
Dodatkowe informacje można uzyskać kontaktując się z autorem: Bartek Siębab