Gentoo Logo

Filtrowanie poczty w Gentoo

Spis treści:

1.  Wprowadzenie

W przewodniku opisano krok po krok sposób instalacji bramki antyspamowej i antywirusowej. Jest to proste rozwiązanie, które można stosować dla pojedynczego serwera.

Wprowadzenie

W dokumencie tym opisano w jaki sposób skonfigurować bramę filtrującą pocztę pod kontem spamu (ze zbiorową domeną). Serwer ten powinien znajdować się przed serwerami poczty elektronicznej, na których aktualnie utrzymywane są konta pocztowe, takimi jak Microsoft Exchange czy Lotus Notes.

W tym przykładzie będziemy posługiwać się aplikacjami zapewniającymi wysoki poziom zabezpieczeń oraz posiadającymi czytelne pliki konfiguracyjne. Jako MTA wybraliśmy postfixa, która posiada wysoki poziom zabezpieczeń oraz jest wygodny i dość prosty w konfiguracji. W normalnych warunkach postfix nasłuchuje przychodzącej poczty na porcie 25. Po otrzymaniu poczty elektronicznej zostaje on przekierowany do Amavisd-new na port 10024. Amavisd-new filtruje wiadomość przy użyciu kilku różnych filtrów przed zwróceniem tejże wiadomości z powrotem do Postfixa na port 10025, który następnie skieruje go do serwera poczty elektronicznej.

Amavisd-new jest szkieletowym filtrem zawartości, który wykorzystuje inne aplikacje do filtrowania antywirusowego i antyspamowego. W tym przykładzie używać będziemy dwóch takich aplikacji, ClamAV do filtrowania antywirusowego oraz Spamassassin do filtrowania antyspamowego. Sam Spamassassin może pełnić funkcję jako kolejna warstwa szkieletowego filtra zawartości i wykorzystywać do pomocy aplikację Vipul Razor2 i DCC.

W odróżnieniu od innych technologii antyspamowych takich jak RBL-e, Spamassassin nie odrzuca lub akceptuje w prosty sposób wiadomości bazując na pojedynczym teście. Używa wielu wewnętrznych testów i zewnętrznych aplikacji wspomagających do obliczania wartości spamu dla każdej wiadomości, która przez niego przejdzie. Wartość ta wyliczana jest za pomocą następujących testów:

  • Filtrowanie Bayesa
  • Statyczne regułki bazujące na regularnych wyrażeniach
  • Sieci rozproszone i współpracujące:
    • RBLs
    • Razor2
    • Pyzor
    • DCC

Pierwsza część tego przewodnika (rozdziały od 1 do 4) opisuje podstawy konfiguracji bramki filtrującej pocztę. Wiadomości z kolejnych rozdziałów mogą zostać zaimplementowane indywidualnie i bez zależności pomiędzy poszczególnymi rozdziałami. W rozdziałach tych opisano w jaki sposób:

  • Skonfigurować specjalne foldery IMAP do nauki filtru Bayesa i doręczania fałszywego spamu
  • Skonfigurować greylisting z Postfixem
  • Skonfigurować Amavisd-new tak, aby używał interfejsu MySQL do zarządzania preferencjami użytkowników
  • Skonfigurować Spamassassina tak, aby używał interfejsu MySQL dla danych Bayesa i AWL.

Uwaga: Foldery IMAP używać będą formatu maildir. Utrzymywanie każdego maila w osobnym pliku sprawia, że obsługa staję się prostsza. Użytkownikom mbox proponujemy wypróbowanie maildir. Jeżeli jeszcze nie używamy maildir potrzebne narzędzia należy zainstalować poprzez wydanie polecenia emerge courier-imap.

Planowana piąta część zwierać będzie wszelakie wskazówki odnośnie wydajności i rzeczy, które warto wiedzieć (uruchamianie chroot, restrykcje postfix, itd.).

Uwaga: Przekazywanie odpowiedzialności na dodatkowe programy nie może obejść się bez ryzyka. Należy znać i ufać tym programom. W tych ustawieniach jedynie decyzja związana z kwarantanną zainfekowanej wirusami poczty elektronicznej bazuje na pojedynczym dodatkowym programie. Używanie systemu punktów, z którego korzysta Spamassassin, do zatrzymywania poczty elektronicznej zawierającej spam, nie jest podejmowane przy wykonaniu pojedynczej weryfikacji, z wyjątkiem własnych statycznych reguł Spamassassina.

Ostrzeżenie: Odrzucając pocztę elektroniczną zawierającą spam na poziomie MTA należy zachować ostrożność w wyborze RBL-a, którego chcemy używać. Przykładowo SpamCop byłby złym wyborem, aby go używać na poziomie MTA ponieważ doświadczać będziemy sporej ilości dobrych wiadomości traktowanych jako spam, z racji tego, że system nasłuchu tego programu jest zbyt agresywny. Więcej informacji na ten temat można znaleźć w Realtime Blackhole Lists Are Bad i The Spam Problem: Moving Beyond RBLs

Przygotowania

Zanim zaczniemy, powinniśmy sprawdzić czy posiadamy działającą instalację programu Postfix, przy pomocy której będziemy mogli odbierać i wysyłać pocztę. Dodatkowo należy posiadać również "backend" serwera poczty elektronicznej. Jeżeli nie mamy doświadczenia w konfiguracji programu Postfix, szybko może się okazać, że jest to zadanie zbyt skomplikowane, gdyż wszystko powinno zostać ustawione w jednym czasie. Jeśli potrzebujemy pomocy, możemy ją znaleźć w znakomitym przewodniku opisującym Wirtualny system pocztowy oparty o Postfix.

2.  Instalacja potrzebnego oprogramowania

Zaczynamy instalując najważniejsze programy: Amavisd-new, Spamassassin and ClamAV.

Listing 2.1: Instalacja Amavis, Spamassasin i Clamav

# emerge amavisd-new spamassassin clamav 

Uwaga: Jak wcześniej wspomnieliśmy, należy posiadać działającą już instalację programu postfix na naszym komputerze. Instalacja powinna się ograniczyć jedynie do emerge postfix i do rozumienia podstaw na jakich działa Postfix.

Ustawianie DNS

Uwaga: Jeśli nie ustawiamy serwera-bramy, a skrzynki pocztowe znajdują się na tym samym serwerze, musimy jedynie stworzyć wpisy MX-Record.

W czasie kiedy programy się instalują, należy uruchomić kolejny terminal i stworzyć potrzebne wpisy DNS.

Zacznijmy od utworzenia wpisu MX dla bramy pocztowej i wpisu A dla następnego celu.

Listing 2.2: Ustawianie DNS-a

(Wpis MX dla bramy pocztowej)
                MX      10      mailgateway.mydomain.tld.
(Wpis A dla bramy pocztowej)
mailgateway     A       mgw.ip.add.here
(Wpis A dla następnego przeskoku serwera pocztowego
mail            A       ms.ip.add.here

Uwaga: Niektórzy z dostawców Internetu technologią ADSL, mogą blokować port 25 i przez to zmuszać nas do przekazywania poczty przez jeden z ich serwerów. Zazwyczaj musimy stworzyć drugi wpis MX w postaci: MX 20 backup-mx.some-isp.tld

Otwieranie firewalla

Dodatkowo musimy otworzyć kilka portów, aby pozwolić na swobodny przepływ poczty między aplikacjami ją weryfikującymi.

Aplikacja Protokół Port
DCC UDP 6277
Razor(wychodzący ping) TCP 7
Razor TCP 2703

Razor używa polecenia ping do badania, które serwery znajdują się najbliżej niego.

Konfiguracja aplikacji Postfix

Na początku należy powiedzieć aplikacji postfix, aby nasłuchiwała na porcie 10025 oraz że została usunięta większość restrykcji, które zostały nałożone w związku z domyślnym nasłuchiwaniem tej aplikacji na porcie 25. Dodatkowo zadbamy również o to, aby program nasłuchiwał jedynie lokalnych połączeń na porcie 25. Aby tego dokonać musimy dodać następujące linijki na końcu pliku /etc/postfix/master.cf.

Listing 2.3: Przykładowy plik /etc/postfix/master.cf

smtp-amavis     unix -        -       n     -       2  smtp
  -o smtp_data_done_timeout=1200
  -o smtp_send_xforward_command=yes
#Jeśli używamy lmpt:
#lmtp-amavis    unix -        -       n     -       2  lmtp
#   -o lmtp_data_done_timeout=1200
#   -o lmtp_send_xforward_command=yes

127.0.0.1:10025 inet n        -       n     -       -  smtpd
  -o content_filter=
  -o local_recipient_maps=
  -o relay_recipient_maps=
  -o smtpd_restriction_classes=
  -o smtpd_client_restrictions=
  -o smtpd_helo_restrictions=
  -o smtpd_sender_restrictions=
  -o smtpd_recipient_restrictions=permit_mynetworks,reject
  -o mynetworks=127.0.0.0/8
  -o strict_rfc821_envelopes=yes
  -o smtpd_error_sleep_time=0
  -o smtpd_soft_error_limit=1001
  -o smtpd_hard_error_limit=1000

#Jeśli chcemy używać filtrowania proxy:
#smtp            inet n         -       n      -       8 smtpd
# -o smtpd_proxy_filter=127.0.0.1:10024
# -o smtpd_client_connection_count_limit=4
#Jeśli nie chemy skanować wychodzącej poczty
#10.0.0.2:smtp   inet n         -       n       -      - smtpd
#-o content_filter=

Uwaga: Linijka smtp-amavis określa maksymalną liczbę procesów, które mogą działać w tym samym czasie. Jeśli potrzebujemy większej rangi tego procesu, po prostu dostosowujemy liczbę do naszych potrzeb. Należy jednak pamiętać, aby ta liczba zgadzała się z liczbą wpisaną do zmiennej $max_servers w pliku amavisd.conf.

Uwaga: Jeśli chcemy odrzucić spam wcześniej, możemy użyć metody Before-Queue (proxy) zamiast metody filtrowania. Po odkomentowaniu trzech linijek będziemy musieli ustawić zmienną content_filter= w pliku main.cf. Działanie takie jednak, nie jest zalecane w przypadku serwerów o dużym natężeniu ruchu, ponieważ ilość równoczesnych połączeń jest ograniczona przez liczbę instancji programu amavisd.

Ostrzeżenie: Metoda Befor-Queue(proxy) nie jest jeszcze odpowiednio przetestowana.

Uwaga: Jeśli z jakichkolwiek powodów chcemy wysłać pocztę elektroniczną z tego komputera i nie chcemy, aby była ona skanowana, należy dodać kolejną instancję programu postfix poprzez odkomentowanie ostatnich dwóch linijek i zastąpienie ich poprawnym adresem IP.

Plik master.cf mówi głównemu programowi postfix jak uruchamiać każdy indywidualnym proces postfix. Więcej informacji znajdziemy w manualu po wydaniu komendy man 8 master.

Następnie instancja programu postifx nasłuchującego na porcie 25 musi przefiltrować pocztę elektroniczną przez amavisd-new, który nasłuchuje na porcie 10024.

Musimy również ustawić kolejny cel dla poczty elektronicznej. Postfix powinien wiedzieć, że musi filtrować całą pocztę elektroniczną poprzez zewnętrzny filtr zawartości. Należy również uaktywnić jawny routing tak, aby Postfix wiedział gdzie kierować dalej pocztę.

Listing 2.4: Modyfikacja /etc/postfix/main.cf

 biff = no
empty_address_recipient = MAILER-DAEMON queue_minfree = 120000000

content_filter = smtp-amavis:[127.0.0.1]:10024 #Odpowiednik gdy używamy
protokołu lmtp: #content_filter = lmtp-amavis:[127.0.0.1]:10024

# Mapy transportowe (TRANSPORT MAP)
#
# Należy wkleić tekst z pliku sample-transport.cf jeśli potrzebujemy jawnego
# routingu.
transport_maps = hash:/etc/postfix/transport

relay_domains = $transport_maps 

Postfix posiada ogromną ilość opcji, które można ustawić w pliku main.cf. Po dalsze wyjaśnienia należy udać się do manuala man 5 postconf lub na stronę internetową gdzie znajduje się ten sam dokument Postfix Configuration Parameters.

Plik transport jest to normalny plik hash programu Postfix. Poczta elektroniczna z lewej strony przekierowywana jest do celu znajdującego się z prawej strony.

Listing 2.5: /etc/postfix/transport

mydomain.tld                          smtp:mail.mydomain.tld

Po edycji tego pliku należy wydać komendę postmap. Postfix aktualnie nie czyta tego pliku więc należy go przekonwertować do odpowiedniego formatu przy użyciu komendy postmap /etc/postfix/transport. W wyniku tego polecenia zostanie utworzony plik /etc/postifx/transport.db. Nie ma potrzeby, aby przeładowywać program, gdyż Postfix automatycznie zatwierdzi zmiany.

Uwaga: Jeśli następny serwer pocztowy nie nasłuchuje na standardowym 25 porcie protokołu SMTP, można powiedzieć aplikacji postfix, aby nasłuchiwała na danym porcie, wskazując na ten port: smtp:mail.mydomain.tld:25000.

Jeśli pierwsza próba wysłania wiadomości zakończy się niepowodzeniem i wiadomość zostanie zwrócona, będzie to najprawdopodobniej oznaczało błąd w konfiguracji. Najlepiej jest wtedy tymczasowo włączyć soft_bounce do czasu rozwiązania problemu. Postfix będzie przetrzymywał wiadomości w kolejce aż do momentu, kiedy soft_bounce zostanie wyłączone lub usunięte. Zapobiegnie to zwrotom wiadomości do nadawcy przy błędach w jej dostarczeniu.

Listing 2.6: Aktywowanie soft_bounce

# postconf -e "soft_bounce = yes"
# /etc/init.d/postfix reload

Po stworzeniu w pełni działającej konfiguracji, należy się upewnić, że soft_bounce jest wyłączone lub usunięte, a następnie przeładować postfix.

Konfiguracja Amavisd-new

Amavisd-new może być używany do zebrania wszystkich filtrów i następnie pozwala w łatwy sposób korzystać z kilku różnych technologii razem. Po odebraniu wiadomości zostanie ona rozpakowana, przefiltrowana przez kilka zwyczajnych filtrów, przechwycona przez białą i czarną listę (whitelist i blacklist). Następnie zostanie przeskanowana po raz kolejny przez filtry, tym razem antywirusowe, aby na końcu została przeskanowana przy użyciu programu SpamAssassin.

Amavisd-new sam w sobie posiada kilka dodatkowych funkcji:

  • Rozpoznaje niebezpieczne załączniki oraz wie jak sobie z nimi radzić
  • Zasady dla użytkownika, dla domeny, dla całego systemu:
    • Białe listy (whitelists)
    • Czarne listy (blacklists)
    • Progi punktowe spamu
    • Polityka antywirusowa i antyspamowa

Wyłączając postfix i freshclam wszystkie pozostałe aplikacje będą uruchamiane z użytkownika amavis.

Należy wedytować następujące linie w pliku /etc/amavisd.conf

Listing 2.7: Edycja /etc/amavisd.conf

(Należy umieścić domeny które mają być skanowane)
$mydomain = 'example.com';
(Przywiązanie jedynie do interfejsu loopback)
$inet_socket_bind = '127.0.0.1';
(Przekazanie na port 10025 do programu Postifx)
$forward_method = 'smtp:127.0.0.1:10025';
$notify_method = $forward_method;
(Należy zdefiniować adres elektroniczny na, który wysłane będą wiadomości alarmowe)
$virus_admin = "virusalert\@$mydomain";
(Zawsze należy dodać nagłówek spamu)
$sa_tag_level_deflt  = -100;
(Dodajemy nagłówek wykrywający spam aka X-Spam-Status: Yes)
$sa_tag2_level_deflt = 5;
(Inicjacja akcji wymijającej na tym poziomie spamu)
$sa_kill_level_deflt = $sa_tag2_level_deflt;
(Nie należy wysyłać status wiadomości do wysyłającego.
Takie działanie nie ma wpływu na dostarczanie spamu do odbiorcy. Aby to
zrobić nalezy użyć zmiennej kill_level)
$sa_dsn_cutoff_level = 10;
Nie należy odbijać wiadomości z lewej na prawo, zamiast tego po prostu poddajmy je kwarantannie
$final_virus_destiny      = D_DISCARD;  # (defaults to D_DISCARD)
$final_banned_destiny     = D_DISCARD;  # (defaults to D_BOUNCE)
$final_spam_destiny       = D_DISCARD;  # (defaults to D_BOUNCE)

Uwaga: Za pomocą linii $sa_tag2_level_deflt = 5; ustawiamy wynik spamu w programie SpamAssasin na 7. Może się on okazać jednak za niski, ponieważ jak już mogliśmy zauważyć domyślnym wynikiem w Amavisd-new jest 6.3. Jeśli nie chcemy widzieć w skrzynce pojedynczych wiadomości ze spamem należy wybrać wartość 5, jednak jeśli nie chcemy mieć do czynienia z fałszywym spamem należy wpisać wartość 6.3.

Należy stworzyć katalog na kwarantanny dla pocztę elektroniczną zarażoną wirusami, gdyż nie chcemy, aby takie wiadomości docierały do naszych użytkowników.

Listing 2.8: Tworzymy katalog na kwarantannę dla zainfekowanej poczty elektronicznej

# mkdir /var/amavis/virusmails
# chown amavis:amavis /var/amavis/virusmails
# chmod 750 /var/amavis/virusmails

Uwaga: Dzięki użyciu banku polityk, Amavisd-new oferuje szersze możliwości ich dostosowywania.

Konfiguracja ClamAV

Jako skanera antywirusowego użyjemy programu ClamAV. Posiada on duże możliwości wykrywania wirusów, porównywalne z produktami komercyjnymi, jest bardzo szybki i dodatkowo jest oprogramowaniem typu Open Source. Kochamy pliki log, dlatego też sprawimy, iż clamd będzie logował zdarzenia przy użyciu syslog oraz włączymy szczegółowe logowanie. Nie należy uruchamiać clamd jako root. Edycja pliku /etc/clamd.conf.

Listing 2.9: Edycja /etc/clamd.conf

(Szczegółowe logowanie przy użyciu syslog)
LogSyslog
LogVerbose
LogFacility LOG_MAIL
(Zmiana lokalizacji pliku pid)
PidFile /var/run/amavis/clamd.pid
(Ustawiamy gniazdo programu clamav)
LocalSocket /var/amavis/clamd
(Zamykamy połączenie kiedy przekroczony zostanie limit)
StreamMaxLength 10M
(Nie należy uruchamiać clamd jako root)
User amavis
(Dla nowszych wersji programu należy odkomentować poniższe linie)
ScanMail
ScanArchive

Uwaga: Należy również pamiętać, aby usunąć przykładowe wpisy, w przeciwnym wypadku ClamAV może nie działać poprawnie.

ClamAV dostarczany jest z demonem freshclam przeznaczonym do okresowego sprawdzania aktualizacji sygnatur wirusów. Zamiast aktualizować sygnatury wirusów dwa razy na dzień, ustawimy demona freshclam, aby robił to co dwie godziny.

Listing 2.10: Edycja /etc/freshclam.conf

(Logowanie Syslog)
LogSyslog
(Logowanie szczegółowe)
LogVerbose
(Wyraźne odrzucenie uprawnień super użytkownika)
DatabaseOwner clamav
(Sprawdzanie aktualizacji co dwie godziny. Jest to oficjalnie zalecane działanie)
Checks 12
(Należy używać serwera lustrzanego najbliżej miejsca, w którym się
znajdujemy. Robimy to poprzez zastąpienie liter XY kodem kraju.)
DatabaseMirror db.XY.clamav.net

Należy uruchomić clamd razem z freshclam używając skryptów inicjujących poprzez modyfikację pliku /etc/conf.d/clamd.

Listing 2.11: Modyfikacja /etc/conf.d/clamd

START_CLAMD=yes
FRESHCLAM_OPTS="-d"

Na koniec należy zmodyfikować plik amavisd.conf, dodając nową lokację gniazda.

Listing 2.12: Modyfikacja /etc/amavisd.conf

(Należy odkomentować skaner clamav oraz podać właściwą lokację gniazda)
['ClamAV-clamd',
\&ask_daemon, ["CONTSCAN {}\n", "/var/amavis/clamd"],
  qr/\bOK$/, qr/\bFOUND$/,
  qr/^.*?: (?!Infected Archive)(.*) FOUND$/ ],

Ostrzeżenie: Nie należy zmieniać linijki $unix_socketname jeżeli nie wiemy do czego się odnosi ta zmienna.

Konfiguracja programu Vipul Razor

Razor2 jest łatwą w obsłudze rozdzieloną siecią do sprawdzania sumy kontrolnej spamu. Instalujemy go przy pomocy polecenia emerge razor. Należy utworzyć również potrzebne pliki konfiguracyjne. Wykonujemy to jako użytkownik amavis, uruchamiając polecenie su - amavis, a następnie razor-admin-create.

Listing 2.13: Tworzenie potrzebnych plików konfiguracyjnych

# emerge razor

(Należy na określony czas ustawić powłokę dla programu amavis na bash)
# usermod -s /bin/bash amavis
# su - amavis
$ razor-admin -create
$ exit

(Resetujemy powłokę do /bin/false)
# usermod -s /bin/false amavis

Konfiguracja dcc (Distributed Checksum Clearinghouse)

Tak samo jak Razor2, dcc jest łatwą w obsłudze rozdzielną siecią do sprawdzania sumy kontrolnej spamu. Jego filozofią jest liczenie liczby odbiorców danej wiadomości elektronicznej identyfikując każdą z tych wiadomości przy pomocy rozmytej sumy kontrolnej.

Listing 2.14: Instalacja DCC

# emerge dcc

Konfiguracja Spamassasin

Amavis używa bezpośrednio bibliotek perl programu Spamassassin, więc nie ma potrzeby, aby uruchamiać ten serwis. Przez takie zachowanie programu amavis tworzy się małe zamieszanie, związane z konfiguracją. Cześć opcji aplikacji Spamassassin można ustawić w pliku /etc/mail/spamassassin/local.cf, które są nadpisywane przez opcje z pliku /etc/amavisd.conf.

Listing 2.15: Tworzenie pliku /etc/mail/spamassassin/local.cf

# Uaktywnienie systemu Bayesa
use_bayes               1

# Uaktywnienie wszystkich sieci sprawdzających
skip_rbl_checks         0

# Wiadomości napisane w językach, których kody znajdują się poniżej,
nie będą zaznaczane jako prawdopodobny spam w obcym języku.
# - polski angielski norweski szwedzki
ok_languages            pl en no sv

# Wiadomości używające lokali, które podane są poniżej nie będą
zaznaczane jako spam w obcym języku.
ok_locales              en

# Należy użyć odpowiedniej ścieżki do filtru bayesa.
bayes_path              /var/amavis/.spamassassin/bayes

Uwaga: Od wersji 3.1 spamassassin, aby uruchomić DCC i Razor2, należy odkomentować odpowiednie linie w pliku v310.pre.

Uwaga: Inspiracji do pisania naszego pliku local.cf możemy szukać w publikacji SpamAssassin Configuration Generator.

Uwaga: Możemy zmieniać bez przeszkód zmienne ok_languages i ok_locales.

3.  Każda dobra reguła ma także dobre wyjątki

Kiedy już wiadomości zaczną przepływać przez naszą bramkę pocztową, prawdopodobnie zauważymy, że powyższe ustawienia nie są idealne. Zapewne niektórzy z naszych klientów będą chcieli otrzymywać wiadomości, które innej uznają za spam. Możemy łatwo dodać ukrytych nadawców do białej lub czarnej listy (whitelist or blacklist). Wystarczy odkomentować poniższą linię w pliku amavisd.conf.

Listing 3.1: Modyfikacja pliku amavisd.conf, aby używał punktowania typu sitewide

read_hash("/var/amavis/sender_scores_sitewide"),

W pliku sender_scores_sitewide należy umieścić adres poczty elektronicznej lub tylko część domeny wraz z wartością dodatnią/ujemną, która będzie dodawana do wartości spamu.

Listing 3.2: Przykładowy plik whitelist_sender

(Biała lista z określonym adresem poczty elektronicznej.)
postmaster@example.net                -3.0
(Biała lista ze wszystkimi wiadomościami z domeny example.net wyłączając poddomeny.)
.example.net                          1.0

Uwaga: W pliku /etc/amavisd.conf znajduje się więcej przykładów.

Uwaga: Wpisywanie tych adresów poza plik amavisd.conf jest rozwiązaniem lepszym i bezpieczniejszym.

Uwaga: Alternatywnie można to zrobić w pliku konfiguracyjnym programu Spamassassin /etc/mail/spamassassin/local.cf, jednak lepszym rozwiązaniem jest robienie tego w pliku /etc/amavisd.conf.

Uwaga: W następnych rozdziałach zostanie przedstawiona polityka użytkowników dotycząca MySQL.

Oczekując na lepszą metodę możemy dodać adresy poczty elektronicznej do pliku amavisd.conf tak, aby obejść filtry antyspamowe dla skrzynek pocztowych użytkowników postmaster oraz abuse.

Listing 3.3: Obchodzenie filtrów antyspamowych dla poczty elektronicznej skierowanej do abuse i postamster

map { $bypass_spam_checks{lc($_)}=1 } (qw(
        postmaster@
        abuse@
));

Ważne: Nigdy nie należy ignorować poczty elektronicznej, która dociera na konta postmaster lub abuse. Więcej informacji w dokumencie RFC 2142 MAILBOX NAMES FOR COMMON SERVICES, ROLES AND FUNCTIONS. W przeciwnym razie domeny mogą zostać dopisane do listy mieszczącej się na stronie rfc-ignorant.org.

4.  Dodawanie kolejnych reguł

Można dodać więcej regułek, które dostarczane są przez SARE Ninjas poprzez SpamAssassin Rules Emporium. Można je łatwo dodać i zaktualizować używając mechanizmu sa-update zawartego w Spamassasin.

Przejrzysty przedownik jak używać zestawów reguł SARE wraz z sa-update można znaleźć tutaj.

5.  Testowanie i ostatnie poprawki

Testowanie ustawień

Przed uruchomieniem freshclam można ręcznie zweryfikować poprawność działania.

Listing 5.1: Testowanie freshclam

# freshclam
ClamAV update process started at Sun May  2 09:13:41 2004
Reading CVD header (main.cvd): OK
Downloading main.cvd [*]
main.cvd updated (version: 22, sigs: 20229, f-level: 1, builder: tkojm)
Reading CVD header (daily.cvd): OK
Downloading daily.cvd [*]
daily.cvd updated (version: 298, sigs: 1141, f-level: 2, builder: diego)
Database updated (21370 signatures) from database.clamav.net (193.1.219.100).

Zaktualizowaliśmy już definicje wirusów i przekonaliśmy się, że plik freshclam.conf działa prawidłowo.

Należy przetestować freshclam oraz amavisd pocztą testową od cli i amavisd. Należy uruchomić programy clamd oraz amavis wpisując poniższe polecenia:

Listing 5.2: Uruchomienie amavisd i clamd oraz przeładowanie aplikacji postfix

# /etc/init.d/clamd start
# /etc/init.d/amavisd start
# /etc/init.d/postfix reload

Jeżeli wszystko pójdzie dobrze postfix powinien od tej chwili nasłuchiwać nadchodzącej poczty na porcie 25 i ponownie przesłanej do niego samego na porcie 10024. Aby to zweryfikować powinniśmy sprawdzić pliki log.

Listing 5.3: Sprawdzanie plików log

# tail -f /var/log/mail.log

Uwaga: Zależnie od ustawień logów poprawną ścieżką do nich może być /var/log/messages.

Jeżeli nie pojawiają się żadne dziwne wiadomości w plikach log pora na kolejny test.

Należy użyć netcat, aby ręcznie połączyć się do amavisd, który nasłuchuje na porcie 10024 oraz do postfix, który nasłuchuje na porcie 10025.

Uwaga: Programu Netcat możemy używać jak zaawansowanego zamiennika programu telnet. Instalujemy go przy pomocy polecenia emerge netcat.

Uwaga: Z pewnych nie do końca jasnych powodów nie można ręcznie połączyć się do amavisd przy pomocy programu netcat. Zamiast tego powinniśmy użyć programu telnet.

Listing 5.4: Sprawdzanie ręcznie czy amavisd i postfix nasłuchują na nowych portach

# nc localhost 10024
(Amavis się uruchamia)
220 [127.0.0.1] ESMTP amavisd-new service ready
nc localhost 10025
(Ponowne przyjmowanie Postfixa działa poprawnie)
220 example.com ESMTP Postfix

Uwaga: Jeśli chcemy zobaczyć pełną informację z procesu uruchamiania programu amavisd-new należy wykonać polecenie amavisd debug-sa jako użytkownik amavis oraz wysłać jakąkolwiek wiadomość elektroniczną. Aby to zadziałało najprawdopodobniej należało będzie zmienić domyślną powłokę w pliku /etc/passwd.

Dodajemy amavisd i clamd do domyślnego poziomu uruchomieniowego.

Listing 5.5: Dodawanie amavisd i clamd do domyślnego poziomu uruchomieniowego

# rc-update add clamd default
# rc-update add amavisd default

Uwaga: Nie należy dodawać spamd do domyślnego poziomu uruchomieniowego ponieważ amavisd używam bibliotek Perl programu Spamassassin bezpośrednio.

Uwaga: W pliku log możemy zauważyć linie typu Net::Server: Couldn't POSIX::setuid to ... [] Zgodnie z amavis chroot README jeśli UID procesu równy jest 0 (root) taki program zostanie automatycznie wyłączony. W przeciwnym wypadku możesz potraktować tą wiadomość jako czysto informacyjną. Dzieje się tak dlatego, że POSIX:setuip() zwraca komunikat 0 but true.

Ważne: Jeśli umożliwimy logowanie dla programu amavis należy pamiętać, aby z powrotem ustawić domyślną powłokę w /etc/passwd na /bin/false.

6.  Automatyczna nauka i filtrowanie poczty

Tworzenie użytkownika spamtrap

Należy utworzyć konto spamtrap oraz wszystkie katalogi z nim związane.

Listing 6.1: Tworzymy konto spamtrap

# useradd -m spamtrap
# maildirmake /home/spamtrap/.maildir
# chown -R spamtrap:mailusers /home/spamtrap/.maildir
(Należy ustawić odpowiednie hasło dla użytkownika spamtrap)
# passwd spamtrap

Jeśli chcemy ręcznie sprawdzić niektóre z wiadomości elektronicznych, aby upewnić się czy nie posiadamy fałszywego spamu należy użyć skryptu procmail do ograniczenia niechcianego spamu w folderach pocztowych.

Tworzenie skryptu .procmailrc

Listing 6.2: Creating /home/spamtrap/.procmailrc

#Ustawiamy kilka domyślnych zmiennych
MAILDIR=$HOME/.maildir

SPAM_FOLDER=$MAILDIR/.spam-found/

LIKELY_SPAM_FOLDER=$MAILDIR/.likely-spam-found/

#Wiadomości z wynikiem spamu ("spamscore") powyżej 7 przenoś do folderu ze spamem
:0:
* ^X-Spam-Status: Yes
* ^X-Spam-Level: \*\*\*\*\*\*\*
$SPAM_FOLDER

#Wiadomości z wynikiem spamu ("spamscore") pomiędzy 5 a 7 przenosimy do folderu z prawdopodobnym spamem
:0:
* ^X-Spam-Status: Yes
$LIKELY_SPAM_FOLDER

#Pozostałe wiadomości przenosimy do skrzynki odbiorczej
:0
*
./

Ostrzeżenie: Jeśli spodziewamy się, że serwer będzie odbierał znaczące ilości wiadomości elektronicznych, nie należy używać makr "likely-spam". W zamian można ustawić odpowiednio wysoką wartość zmiennej $sa_tag2_level_default, aby uniknąć fałszywego spamu i przenosić od razu właściwy bezpośrednio do folderu $SPAM_FOLDER.

Uwaga: Jeśli nie mamy jeszcze zainstalowanego procmail należy to zrobić przy pomocy polecenia emerge procmail.

Teraz należy upewnić się czy Postfix używa procmail do dostarczania poczty.

Listing 6.3: Modyfikacja pliku /etc/postfix/main.cf

mailbox_command = /usr/bin/procmail -a "DOMAIN"

Tworzenie folderów pocztowych

Powinniśmy teraz utworzyć współdzielony folder dla wiadomości typu ham oraz spam.

Listing 6.4: Tworzenie niezbędnych folderów pocztowych

# maildirmake /var/amavis/.maildir
# maildirmake -S /var/amavis/.maildir/Bayes
# maildirmake -s write -f spam /var/amavis/.maildir/Bayes
# maildirmake -s write -f ham /var/amavis/.maildir/Bayes
# maildirmake -s write -f redeliver /var/amavis/.maildir/Bayes

Program Amavisd-new musi mieć takie same uprawnienia do czytania powyższych plików jak użytkownicy poczty. Dlatego też należy dodać wszystkich odpowiednich użytkowników do grupy mailuser, razem z użytkownikiem amavis.

Listing 6.5: Ustawianie właściwych zezwoleń

# groupadd mailusers
# usermod -G mailusers spamtrap
# chown -R amavis:mailusers /var/amavis/.maildir/
# chown amavis:mailusers /var/amavis/
# chmod -R 1733 /var/amavis/.maildir/Bayes/
# chmod g+rx /var/amavis/.maildir/
# chmod g+rx /var/amavis/.maildir/Bayes/

Ostrzeżenie: Powyższe polecenia spowodują, że członkowie grupy mailusers posiądą dostęp do wiadomości elektronicznych użytkownika amavis.

Sprawią one, że folder na pocztę typu "spam" i "ham" będzie posiadał zezwolenia do zapisywania w nim, ale nie odczytywania. W ten sposób użytkownicy w łatwy sposób mogą składować swoją pocztę typu ham bez obaw, iż ktoś inny będzie mógł ją odczytywać.

Należy uruchomić następującą komendę jako użytkownik spamtrap:

Listing 6.6: Dodawanie współdzielonych folderów do folderów pocztowych użytkowników

$ maildirmake --add Bayes=/var/amavis/.maildir/Bayes $HOME/.maildir

Uwaga: Należy przydzielić grupie zezwolenia do czytania folderu Bayes co pozwoli widzieć katalogi używane przez IMAP.

Dodawanie zadań do crona

Należy uruchomić polecenia crontab -u amavis -e, aby wyedytować crontaba programu amavis powodując uruchomienie automatycznej nauki filtru Bayesa co godzinę.

Listing 6.7: amavis crontab

#Automatyczna nauka
0 * * * *          /usr/bin/sa-learn --spam /var/amavis/.maildir/Bayes/.spam/{cur,new} \
                    > /dev/null 2>&1
0 * * * *          /usr/bin/sa-learn --ham /var/amavis/.maildir/Bayes/.ham/{cur,new} > \
                   /dev/null 2>&1

Uwaga: Użytkownik amavis powinien być członkiem grupy cron, aby uruchamiać programy przy pomocy crona.

Uwaga: Wygląda na to, że współdzielone katalog i z pocztą powodują dwukrotne egzaminowanie sa-learn. Nie powinno to być problemem. Wynik pokaże także, że co najmniej połowa z przeegzaminowanych wiadomości została używa do nauki.

Modyfikacja pliku amavisd.conf

Teraz należy zmodyfikować amavis w taki sposób, aby przekierowywał wiadomości elektroniczne oznaczone jako spam do konta spamtrap oraz zatrzymywał nagłówki spamu.

Listing 6.8: Modyfikacja pliku /etc/amavisd.conf

(Wybór konta, na które ma być przekierowywana poczta z wirusami i spamem)
$spam_quarantine_to = "spamtrap\@$myhostname";

Redystrybucja fałszywego spamu

Jeśli ustawimy wynik spamu zbyt nisko prawdopodobnie będziemy otrzymywać fałszywy spam. Będzie on przechowywany w folderze likely-spam. Wiadomości są ręcznie przeglądane i każdy fałszywy spam zostaje przeniesiony do folderu pocztowego redeliver. Stamtąd jest przekierowywany najpierw do sa-learn --ham, a następnie ze wszystkimi nagłówkami wysyłany do smtpclient Ralfa S. Engelschalla.

Oryginalna wersja 1.0.0 programu smtpclient znajduje się w Portage. Jednak, aby wszystkie nagłówki pozostały nienaruszone należy użyć zmodyfikowanej wersji. Poniżej opisano w jaki sposób należy zainstalować zmodyfikowaną wersję:

Listing 6.9: Instalacja zmodyfikowanej wersji smtpclient

(Należy przełączyć portage do naszego OVERLAY
# wget http://home.coming.dk/files/smtpclient.tar.gz
# tar xzf smtpclient.tar.gz
# echo "mail-client/smtpclient    ~x86" >> /etc/portage/package.keywords
# echo "mail-client/smtpclient    fullheaders" >> /etc/portage/package.use
# emerge smtpclient

Przy pomocy crona należy sprawdzać co minutę czy w folderze redeliver znajdują się wiadomości.

Listing 6.10: amavis crontab

#Redystrybucja fałszywego spamu
* * * * *          find /var/amavis/.maildir/Bayes/.redeliver/cur/ -type f -name \
                   "[0-9]*" -exec cp {} /var/amavis/.maildir/Bayes/.ham/cur/ \; \
                   && find /var/amavis/.maildir/Bayes/.redeliver/cur/ -type f \
                   -name "[0-9]*" -exec /usr/local/bin/redeliver.pl {} \;

Należy przekopiować plik redeliver.pldo katalogu /usr/local/bin/. Można go ściągnąć lub użyć poniższego przykładu.

Listing 6.11: redeliver.pl

#!/usr/bin/perl -w

# Redelivers mail using a modified version of smtpclient
# By: Jens Hilligsoe <gentoo@hilli.dk>

use strict;

if(!($#ARGV == 0)) {
        die "Usage:\n$0 maildir_mail\n";
}

my $mail = $ARGV[0];
my $to = "";
my $from = "";

sub prunefile ( $ );

# Odzyskiwanie powłoki To i From adresów
open (MAIL, $mail) or die "Could not open $mail: $?\n";
while(<MAIL>) {
    if(($to eq "") || ($from eq "")) {
        chop;
        (my $key, my $value) = split (/:/);
        if($key eq "X-Envelope-To") {
            $to = $value;
            $to =~ s/[\<\>,]//g; # Należy usunąć "<", ">" and ","
            $to =~ s/^\s+|\s+$//g; # Należy usunąć whitespace przed i po
        }
        if($key eq "X-Envelope-From") {
            $from = $value;
            $from =~ s/[\<\>,]//g;
            $from =~ s/^\s+|\s+$//g;
            if($from eq "") {
                $from = "postmaster";
            }
        }
    }
}

if($to eq "") {
    prunefile($ARGV[0]); # Just nuke it if to is empty
} else {
    my $redelivercmd = "cat $ARGV[0] | smtpclient -F -S 127.0.0.1 -P 10025 -f $from $to";
    unless (system($redelivercmd) == 0 ) {
        die "Unable to redeliver: $?";
    }
    prunefile($ARGV[0]); # Clean up
}

sub prunefile ( $ ) {
    my ($file) = @_;
    unless (unlink $file) {
        die "Unable to remove mail: $?";
    }
}

Sprzątanie

Należy uruchamiać regularnie czyszczenie wiadomości programem tmpwatch. Instalujemy go przy pomocy emerge i polecenia emerge tmpwatch. Jedynie użytkownik root jest w stanie uruchomić tmpwatch, dlatego też trzeba zmodyfikować crontaba dla tego użytkownika.

Listing 6.12: Modifying root crontab

# Sprzątanie
# Utrzymywanie wiadomości elektronicznych zarażonych wirusami przez tydzień (24
# * 7)
15 0 * * *      /usr/sbin/tmpwatch -c -f -d --quiet 168 /var/amavis/virusmails/
# Kasowanie "uczących" wiadomości typu ham i spam po tygodniu
15 0 * * *      /usr/sbin/tmpwatch -c -f -d --quiet 168 /var/amavis/.maildir/Bayes/

7.  Greylisting

Wprowadzenie

Greylisting jest jedną z najnowszych metod walki ze spamem. Jak sama nazwa wskazuje, jest czymś więcej niż whitelistingiem i blacklistingiem. Za każdy razem kiedy nieznany serwer poczty próbuje dostarczyć wiadomość, ta wiadomość jest odrzucana z komunikatem spróbuj ponownie później ("try again later"). Oznacza to, iż wiadomość zostanie dostarczona z opóźnieniem, jednak roboty spamerskie, które nie mają zaimplementowanego protokołu RFC odrzucą próbę dostarczenia spamu i nie będą tego nigdy powtarzały. Z biegiem czasu roboty zapewne przystosują się, jednak zanim to nastąpi inne technologię będą miały zapewniony czas, aby udoskonalić swoje metody identyfikacji spamu.

Uwaga: Jeśli ISP blokuje przychodzący ruch na porcie 25 i przekazuje pocztę przez ich serwer pocztowych wyżej opisana metoda nie będzie prawidłowo działała.

Postfix 2.1 dostarczany jest z prostym, napisanym w Perlu serwerem greylistingu, który implementuje taki schemat. Jednak w sytuacji kiedy zabraknie miejsca na partycji, na której znajduje się baza danych greylistingu, serwer ten sprawia nieprzewidziane problemy. Istnieje udoskonalona wersja, która nie cierpi już na ten problem. Wpierw pokażemy jak zainstalować wbudowane wsparcie dla metody greylisting, następnie skonfigurujemy silniejszego zastępcę.

Uwaga: Istnieją inne serwery greylistingu dla środowiska programu Postfix (np. Gld, który znajduje się w Portage oraz SQLgrey). Cześć z nich współpracuje z bazami danych, auto whitelistingiem i posiada kilka dodatkowych możliwości.

Prosty greylisting

Uwaga: Jeśli chcemy używać ulepszonego greylistingu wraz z serwerem postgrey możemy bez obaw ominąć ten rozdział.

Potrzebujemy pliku greylist.pl, jednak ebuild nie instaluje go domyślnie.

Listing 7.1: Tworzenie pliku greylist.pl

# cp /usr/portage/distfiles/postfix-your-version-here.tar.gz /root/
# tar xzf postfix-your-version-here.tar.gz
# cp postfix-2.1.0/examples/smtpd-policy/greylist.pl /usr/bin/

Kiedy plik znajduje się już we właściwym miejscu należy utworzyć katalog, w którym znajdzie się baza danych greylistingu:

Listing 7.2: Tworzenie katalogu dla bazy danych greylistingu

# mkdir /var/mta
# chown nobody /var/mta

Ostrzeżenie: Nie należy tworzyć katalogu dla wyżej wymienionej bazy danych na partycji, na której może zabraknąć miejsca. Mimo, iż postfix może odzyskać wiadomości elektroniczne w takiej sytuacji, jednak nie zrobi tego w przypadku bazy danych greylistingu. Jeśli plik zostanie uszkodzony możemy nie być zdolni do odebrania wiadomości elektronicznej, dopóki nie skasujemy tego pliku ręcznie.

Konfiguracja greylistingu

Kiedy już mamy wszystko przygotowane, pozostało nam jedynie dodać to do konfiguracji programu postfix. Najpierw dodajemy wymagane informacje do pliku master.cf:

Listing 7.3: Modyfikacja master.cf, aby używał greylistingu

policy-greylist  unix  -       n       n       -       -       spawn
   user=nobody argv=/usr/bin/perl /usr/bin/greylist.pl

Demon uruchamiający postfix'a zabija wszystkie procesy dzieci po 1000 sekund, ale dla potrzeb graylistingu jest to zdecydowanie za krótko, dlatego też zwiększymy ten czas w pliku main.cf:

Listing 7.4: Modyfikacja pliku main.cf, aby używał greylistingu

policy-greylist_time_limit = 3600
(Po smtpd_recipient_restrictions należy dodać:)
check_sender_access hash:/etc/postfix/sender_access
(Następnie należy dodać:)
restriction_classes = greylist
greylist = check_policy_service unix:private/policy-greylist

Ostrzeżenie: Należy mieć pewność, że określimy zmienną check_sender_access po reject_unauth_destination, w przeciwnym wypadku nasz system może stać się otwartym przekaźnikiem wiadomości elektronicznych.

Uwaga: Baza danych greylistingu szybko zostaje zaśmiecona fałszywymi adresami. Warto dodać tu także inne zabezpieczenie, jak na przykład odrzucania poczty z nieznanymi autorami lub/i adresatami.

Nie ma potrzeby używać greylistingu dla wszystkich domen, ale tylko dla tych, które często są nadużywane przez spamerów. Mimo wszystko sprawi to, iż wiadomości elektroniczne będą dostarczane z opóźnieniem. Listę często zapominanych domen MAIL FROM można znaleźć w internecie. Domeny, z których nadchodzi duża ilość spamu należy dodać do pliku /etc/postfix/sender_access:

Listing 7.5: Format pliku sender_access

aol.com     greylist
hotmail.com greylist
bigfoot.com greylist

Jeżeli chcemy posiadać bardziej szczegółową listę:

Listing 7.6: Dodawanie wszystkich domen do pliku sender_access

# wget http://www.monkeys.com/anti-spam/filtering/sender-domain-validate.in
# cat sender-domain-validate.in | sort | awk {'print $1 "\t\t greylist"'} > /etc/postfix/sender_access

Należy zainicjować bazę danych sender_access:

Listing 7.7: Inicjalizacja sender_access

# postmap /etc/postfix/sender_access

Na tym kończy się konfiguracja prostego greylistingu.

Ostrzeżenie: Powyższego sposobu wypróbowano na jednej ze skrzynek obsługującej tysiące wiadomości elektronicznych dziennie i rezultaty były prawie całkowitą katastrofą. Po czterech dniach skrzynkach grzęzła w setce starych procesów greylist.pl.

Konfiguracja ulepszonego greylistingu zaimplementowanego w serwerze postgrey

Rozszerzoną politykę gerylistingu możemy zainstalować poprzez proste wydanie komendy emerge:

Listing 7.8: Instalacja serwera postgrey

# emerge postgrey

Po instalacji serwera postgrey należy wyedytować plik main.cf. Zmiany są praktycznie identyczne jak przy wbudowanym greylistingu.

Listing 7.9: Modyfikacja pliku main.cf do używania greylistingu

(Pod smtpd_recipient_restrictions należy dodać:)
check_sender_access hash:/etc/postfix/sender_access
(Później należy dodać:)
smtpd_restriction_classes = greylist
greylist = check_policy_service inet:127.0.0.1:10030

Uwaga: SMTPD_POLICY_README Postifxa używa jedynie restriction_classes, jednak wydaje się, iż to nie działa.

Uwaga: Jeśli do wszystkiego ma być stosowany greylisting należy dodać wpis check_policy_service inet:127.0.0.1:10030.

Na koniec, uruchamiamy serwer i dodajmy go do odpowiedniego poziomu uruchomieniowego.

Listing 7.10: Uruchamianie postgrey

# /etc/init.d/postgrey start
# rc-update add postgrey default

Uwaga: Niektórzy użytkownicy lubią otrzymywać swoje wiadomości elektroniczne szybko, dlatego też greylisting jest bezwartościowy. Jednak jeżeli zaangażujemy do pracy zapasowy serwer w bezpieczny sposób możemy ustawić na nim greylisting. Moje ograniczone doświadczenie mówi mi, że może on zatrzymywać co trzecią wiadomość będącą spamem.

8.  SPF (Sender Policy Framework)

Wprowadzenie

SPF pozwala właścicielom domen stwierdzić, w ich wpisach DNS, które adresy IP mogą wysyłać wiadomości elektroniczne z ich domen. Uniemożliwi to spamerom spoofowanie Return-Path.

Uwaga: Jeśli nasz ISP blokuje przychodzący ruch na porcie 25 i przekazuje całą pocztę elektroniczną do nas przez ich serwer, to SPF nie będzie funkcjonował prawidłowo.

Pierwsi właściciele domen muszą posiadać specjalny wpis DNS, TXT. Wtedy MTA może przeczytać taki wpis i jeśli wiadomość pochodzi z serwera, który nie jest wpisany do SPF, może zostać odrzucona. Przykładowy wpis może wyglądać tak:

Listing 8.1: Przykładowy wpis SPF

example.com.  IN TXT  "v=spf1 a mx ptr -all"

Wpis -all każe odrzucać domyślnie wszystkie wiadomości, jednak dopuszcza wiadomości z wpisów DNS A(a), MX(mx) i PTR(ptr). Większej ilości informacji należy szukać w dalszej części przewodnika.

Uwaga: Jeśli przekazujemy wychodzącą pocztę przez naszego ISP należy dodać linijke: include:yourisp.com.

Wersja 3.0 programu Spamassassin posiada wsparcie dla SPF, jednak domyślnie nie jest ono uaktywnione. Nowy demon w programie Postfix wspiera SPF, dlatego też zainstalujemy teraz wsparcie SPF dla Postfix.

Uwaga: Jeśli chcemy używać SPF razem ze Spamassassinem po prosty wydajemy polecenie emerge dev-perl/Mail-SPF-Query i restartujemy Amavisd-new.

Przygotowania

Wpierw należy zainstalować Postfix 2.1 w sposób opisany powyżej. Kiedy już źródła znajdą się na naszym dysku skopiujemy plik spf.pl w podany poniżej sposób:

Listing 8.2: Instalacja spf.pl

# cp postfix-<version>/examples/smtpd-policy/spf.pl /usr/local/bin/

Uwaga: Plik spf.pl dostarczany z programem Postfix jest odrobinę dziurawy dlatego należy znaleźć i odkomentować następujące linie: push @HANDLERS, "sender_permitted_from"; use Mail::SPF::Query;. Ponadto w okolicach 199 linii należy zastąpić słowo comemnt, słowem comment. Ewentualnie możemy ściągnąć wersję deweloperską.

Powyższy skrypt Perl potrzebuje również kilku bibliotek Perl, których nie ma w Portage, jednak ich instalacja nie powinna sprawić problemu:

Listing 8.3: Instalacja wymaganych bibliotek Perl

# emerge Mail-SPF-Query Net-CIDR-Lite Sys-Hostname-Long

Gdy mamy wszystko już na swoim miejscu należy jedynie skonfigurować Postfixa zgodnie z nową polityką.

Listing 8.4: Modyfikacja master.cf, aby zapewnić wsparcie SPF

policy-spf  unix  -       n       n       -       -       spawn
   user=nobody argv=/usr/bin/perl /usr/local/bin/spf.pl

Należy dodać sprawdzanie SPF do pliku main.cf. Poprawnie skonfigurowany SPF nie powinien wyrządzić żadnej krzywdy, więc możemy sprawdzić jego działanie dla wszystkich domen:

Listing 8.5: Modyfikacja main.cf, aby zapewnić wsparcie dla SPF

(Pod smtpd_recipient_restrictions należy dodać:)
check_policy_service unix:private/policy-spf

Uwaga: Jeżeli SPF sprawia problemy, np. kiedy używamy fetchmail, należy uaktywnić SPF jedynie dla pewnych domen.

9.  Konifguracja amavisd-new ze wsparciem dla MySQL

Konfiguracja MySQL

Uwaga: Nie testowano tego rozwiązania na wersjach wyższych niż 2.2. Wszelkie opinie będą mile widziane. :)

Dla dużych domen domyślne wartości można, które można ustawić w pliku amavisd.conf, mogę nie pasować do wszystkich użytkowników. Jeśli skonfigurujemy amavisd-new ze wsparcie dla MySQL-a, będzie można stosować indywidualne ustawienia dla użytkowników i grupy użytkowników.

Listing 9.1: Tworzenie bazy danych i użytkownika MySQL

# mysql -u root -p mysql
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 78 to server version: 4.0.18-log

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql> create database maildb;
mysql> GRANT INSERT,UPDATE,DELETE,SELECT ON maildb.* TO 'mail'@'localhost' IDENTIFIED BY 'very_secret_password';
mysql> use maildb;

Kiedy baza danych jest już utworzona należy stworzyć potrzebne tabele. Można skopiować i wkleić poniższe polecenia do linii komend mysql:

Listing 9.2: Układ tabel MySQL

CREATE TABLE users (
    id         int unsigned NOT NULL auto_increment,
    priority   int          NOT NULL DEFAULT '7',  -- 0 is low priority
    policy_id  int unsigned NOT NULL DEFAULT '1',
    email      varchar(255) NOT NULL,
    fullname   varchar(255) DEFAULT NULL,    -- not used by amavisd-new
    local      char(1),     -- Y/N  (optional field, see note further down)
    PRIMARY KEY (id),
    KEY email (email)
    );
CREATE UNIQUE INDEX users_idx_email ON users(email);

(wszelkie adresy poczty elektronicznej, zewnętrznej lub lokalnej, użyte jako nadawcy w wblist)
CREATE TABLE mailaddr (
   id         int unsigned NOT NULL auto_increment,
   priority   int          NOT NULL DEFAULT '7',  -- 0 is low priority
   email      varchar(255) NOT NULL,
   PRIMARY KEY (id),
   KEY email (email)
   );
CREATE UNIQUE INDEX mailaddr_idx_email ON mailaddr(email);

(-- per-recipient whitelist and/or blacklist,
(-- puts sender and recipient in relation wb)
(white or blacklisted sender)
CREATE TABLE wblist (
   rid        int unsigned NOT NULL,     -- recipient: users.id
   sid        int unsigned NOT NULL,     -- sender:    mailaddr.id
   wb         char(1) NOT NULL, -- W or Y / B or N / space=neutral
   PRIMARY KEY (rid,sid)
   );

CREATE TABLE policy (
   id               int unsigned NOT NULL auto_increment,
   policy_name      varchar(32),     -- not used by amavisd-new
   virus_lover          char(1),     -- Y/N
   spam_lover           char(1),     -- Y/N  (optional field)
   banned_files_lover   char(1),     -- Y/N  (optional field)
   bad_header_lover     char(1),     -- Y/N  (optional field)
   bypass_virus_checks  char(1),     -- Y/N
   bypass_spam_checks   char(1),     -- Y/N
   bypass_banned_checks char(1),     -- Y/N  (optional field)
   bypass_header_checks char(1),     -- Y/N (optional field)
   spam_modifies_subj   char(1),     -- Y/N (optional field)
   spam_quarantine_to   varchar(64) DEFAULT NULL, -- (optional field)
   spam_tag_level  float,  -- higher score inserts spam info headers
   spam_tag2_level float DEFAULT NULL,  -- higher score inserts
               -- 'declared spam' info header fields
   spam_kill_level float,  -- higher score activates evasive actions, e.g.
               -- reject/drop, quarantine, ...
               -- (subject to final_spam_destiny setting)
   PRIMARY KEY (id)
  );

Uwaga: Jeśli mamy problem używając metody kopiuj/wklej można skopiować powyższe polecenia w inne miejsce i oczyścić je z niepotrzebnych znaków.

Uwaga: Przeszukiwania próbujące dopasować email są dokonywane za pomocą adresów w postaci czystego tekstu (rfc2821-unquoted i bez nawiasów) jako kluczy (np. John "Funny" Smith@example.com.

Uwaga: Przeszukiwania są dokonywane w następującym porządku: SQL, LDAP, hash, ACL, regexp, constant. Pierwsze dopasowanie kończy proces.

Jeżeli chcemy używać whitelistingu i blacklistingu musimy dodać nadawcę i odbiorcę do mailadr po czym należy stworzyć relację pomiędzy dwoma adresami poczty elektronicznej w wblist i ustalić czy jest to whitelisting (W) czy blacklisting (B).

Kiedy tabele zostaną już utworzone należy utworzyć testowego użytkownika i przykładową politykę:

Listing 9.3: Tworzenie użytkownika testowego oraz przykładowej polityki

INSERT INTO users
   SET
      id         =1,
      priority   =9,
      policy_id  =1,
      email      ="johndoe@example.com",
      fullname   ="John Doe",
      local      ="Y";

INSERT INTO policy
   SET
      id                     =1,
      policy_name            ="Test policy 1",
      virus_lover            ="N",
      spam_lover             ="N",
      banned_files_lover     ="N",
      bad_header_lover       ="N",
      bypass_virus_checks    ="N",
      bypass_spam_checks     ="N",
      bypass_banned_checks   ="N",
      bypass_header_checks   ="N",
      spam_modifies_subj     ="N",
      spam_quarantine_to     =NULL,
      spam_tag_level         =-50.0,
      spam_tag2_level        =7.0,
      spam_kill_level        =10.0;

Uwaga: Należy skopiować gdzieś powyższe polecenia i dostosować je, aby pasowały do naszego środowiska.

Uwaga: Pole local powinno być ustawione jako Y, w przeciwnym wypadku wiadomości nie będą skanowane pod względem obecności spamu.

Dzięki powyższym poleceniom umieścimy w bazie danych testowego użytkownika i przykładową politykę. Należy dopasować powyższy przykład, aby dopasować go do własnych potrzeb. Dalsze wyjaśnienia dotyczące zmiennych konfiguracyjnych można znaleźć w pliku amavisd.path.

Konfiguracja amavisd ze wsparcie dla MySQL

Kiedy mamy już przygotowanego MySQL-a, należy sprawić, aby amavis zaczął go używać:

Listing 9.4: Modyfikacja pliku amavisd.conf

@lookup_sql_dsn =
   ( ['DBI:mysql:maildb:host1', 'mail', 'very_secret_password']  );

(Dla jasności należy domyślnie odkomentować)
$sql_select_policy = 'SELECT *,users.id FROM users,policy'.
   ' WHERE (users.policy_id=policy.id) AND (users.email IN (%k))'.
   ' ORDER BY users.priority DESC';

   (Jeśli potrzebujemy white/blacklistingu nadawcy)
   $sql_select_white_black_list = 'SELECT wb FROM wblist,mailaddr'.
     ' WHERE (wblist.rid=?) AND (wblist.sid=mailaddr.id)'.
     '   AND (mailaddr.email IN (%k))'.
     ' ORDER BY mailaddr.priority DESC';

10.  Konifguracja Spamassassin ze wsparciem dla MySQL

W Spamassassin 3.0 możliwe jest przechowywanie danych filtrów Bayesa i AWL w bazie danych MySQL. Pokażemy tutaj w jaki sposób można tego łatwo dokonać.

Należy utworzyć nowego użytkownika MySQL, a następnie utworzyć potrzebne tabele.

Listing 10.1: Tworzenie nowej bazy danych i użytkownika MySQL

# mysql -u root -p mysql
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 78 to server version: 4.0.18-log

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql> create database dbname;
mysql> GRANT INSERT,UPDATE,DELETE,SELECT ON dbname.* TO 'dbuser'@'localhost' IDENTIFIED BY 'another_very_secret_password';
mysql> use dbname;

Kiedy baza danych jest już gotowa pora na utworzenie potrzebnych tabel. Można to zrobić poprzez skopiowanie i wklejenie poniższych poleceń do linii poleceń mysql:

Listing 10.2: Układ tabel MySQL

      CREATE TABLE bayes_expire (
          id                    int(11)         NOT NULL default '0',
          runtime               int(11)         NOT NULL default '0',
          KEY bayes_expire_idx1 (id)
          ) TYPE=MyISAM;

      CREATE TABLE bayes_global_vars (
          variable              varchar(30)     NOT NULL default '',
          value                 varchar(200)    NOT NULL default '',
          PRIMARY KEY           (variable)
          ) TYPE=MyISAM;

      INSERT INTO bayes_global_vars VALUES ('VERSION','3');

      CREATE TABLE bayes_seen (
          id                    int(11)         NOT NULL default '0',
          msgid                 varchar(200) binary NOT NULL default '',
          flag                  char(1)         NOT NULL default '',
          PRIMARY KEY           (id,msgid)
          ) TYPE=MyISAM;

      CREATE TABLE bayes_token (
          id                    int(11)         NOT NULL default '0',
          token                 char(5)         NOT NULL default '',
          spam_count            int(11)         NOT NULL default '0',
          ham_count             int(11)         NOT NULL default '0',
          atime                 int(11)         NOT NULL default '0',
          PRIMARY KEY           (id, token),
          INDEX                 (id, atime)
          ) TYPE=MyISAM;

      CREATE TABLE bayes_vars (
          id                    int(11)         NOT NULL AUTO_INCREMENT,
          username              varchar(200)    NOT NULL default '',
          spam_count            int(11)         NOT NULL default '0',
          ham_count             int(11)         NOT NULL default '0',
          token_count           int(11)         NOT NULL default '0',
          last_expire           int(11)         NOT NULL default '0',
          last_atime_delta      int(11)         NOT NULL default '0',
          last_expire_reduce    int(11)         NOT NULL default '0',
          oldest_token_age      int(11)         NOT NULL default '2147483647',
          newest_token_age      int(11)         NOT NULL default '0',
          PRIMARY KEY           (id),
          UNIQUE bayes_vars_idx1 (username)
          ) TYPE=MyISAM;

      CREATE TABLE awl (
          username              varchar(100)    NOT NULL default '',
          email                 varchar(200)    NOT NULL default '',
          ip                    varchar(10)     NOT NULL default '',
          count                 int(11)         default '0',
          totscore              float           default '0',
          PRIMARY KEY           (username,email,ip)
          ) TYPE=MyISAM;

Ważne: Wymagana jest linia INSERT, w przeciwnym wypadku Spamassassin nie będzie działał.

Uwaga: Powyższe polecenia są również dostępne w źródłach w plikach awl_mysql.sql i bayes_mysql.sql.

Konfiguracja Spamassassin, ze wsparciem backend MySQL

Jeśli posiadamy starą bazę danych Bayesa w bazie danych DBM i chcemy ją zatrzymać należy kierować się poniższym instrukcjami:

Listing 10.3: Konwertowanie danych Bayesa z bazy danych DBM

su - amavis
sa-learn --sync
sa-learn --backup > backup.txt
sa-learn --restore backup.txt

Uwaga: Należy zauważyć, iż ostatni krok można wykonać jedynie w przypadku gdy baza danych MySQL i plik secrets.cf zostaną zaktualizowane.

Należy podać programowi Spamassassin potrzebne informację:

Listing 10.4: Modifyikacja pliku /etc/mail/spamassassin/secrets.cf

(Należy powiedzieć programowi Spamassassin, aby używał MySQL dla danych Bayesa
bayes_store_module              Mail::SpamAssassin::BayesStore::SQL
bayes_sql_dsn                   DBI:mysql:sa_bayes:localhost:3306
bayes_sql_username              db_name
bayes_sql_password              another_very_secret_password

(Należy powiedzieć programowi Spamassassin, aby używał MySQL dla danych AWL
auto_whitelist_factory          Mail::SpamAssassin::SQLBasedAddrList
user_awl_dsn                    DBI:mysql:sa_bayes:localhost:3306
user_awl_sql_username           db_name
user_awl_sql_password           another_very_secret_password

Następnie, ustawiamy dla bezpieczeństwa odpowiednie zezwolenia:

Listing 10.5: Zmiana zezwoleń

# chmod 400 /etc/mail/spamassassin/secrets.cf

Uwaga: Aby utworzyć bezpieczne hasło należy wykonać dwa polecenia, emerge app-admin/makepasswd i makepasswd -chars=8.

Na koniec należy zrestartować amavisd wydając polecenie /etc/init.d/amavisd restart.

11.  Rozwiązywanie problemów

Amavisd-new

Aby rozwiązać problemy dotyczące Amavisd-new, musimy zacząć od zatrzymania samego programu wydając komendę /etc/init.d/amavisd stop, następnie uruchamiając go w trybie debug poleceniem amavisd debug, obserwując wszelkie anomalie jakie pojawią się na wyjściu.

Spamassassin

Aby rozwiązać problemy dotyczące programu Spamassassin można przefiltrować wiadomość ręcznie przy jego pomocy, używając polecenia spamassassin -D < mail. Aby upewnić się, że nagłówki są nienaruszone możemy je przenieść z innego komputera przy pomocy IMAP.

Uwaga: Jeżeli chcemy rozwiązać problem należy uaktywnić logowanie się dla użytkownika amavis poprzez zmianę powłoki w pliku /etc/passwd ma /bin/bash.

Jeżeli chcemy możemy uzyskać takie same informacje, a nawet więcej z Amavisd-new. W tym celu należy użyć amavisd debug-sa.

Uzyskiwanie pomocy

Jeżeli potrzebujemy pomocy dobrym miejscem na szukanie jej, jest lista mailingowa użytkowników amavis. Przed wysłaniem postu należy przeszukać archiwum listy mailingowej użytkowników programu Amavis. Jeżeli nie znajdziemy odpowiedzi na nasze pytanie, w tym miejscu możemy zapisać się na listę mailingową użytkowników programu Amavis

Jeżeli nasze pytanie odnosi się do SpamAssassin, DCC, Razor lub Postfixa, należy udać się na ich strony domowe, których adresy znajdziemy poniżej.

12.  Zasoby

Więcej informacji

Ogólne zasoby

Inne HOWTO



Drukuj

Zaktualizowano 2 sierpnia 2007

Oryginalna wersja tego dokumentu została po raz ostatni zaktualizowana 29 kwietnia 2012. Jeśli chcesz pomóc w aktualizacji tego dokumentu do najnowszej wersji, skontaktuj się z Łukaszem Damentko, koordynatorem polskiego projektu tłumaczeń dokumentacji Gentoo.

Podsumowanie: W przewodniku tym opisano krok po kroku proces instalacji technologii antyspamowych w Postfixie, między innymi Amavisd-new używający Spamassassin, ClamAV, greylistingu i SPF.

Sune Kloppenborg Jeppesen
Autor

Jens Hilligsøe
Współpracownik

Joshua Saddler
Redaktor

Damian Kuras
Tłumaczenie

Donate to support our development efforts.

Copyright 2001-2012 Gentoo Foundation, Inc. Questions, Comments? Contact us.