Uruchomienie filtrowania poczty za pomocą dspam

Dspam to alternatywa do bogofiltra czy mocno rozbudowanego spamd oraz amavisd-new. Dspam potrafi przekazać maila do sprawdzenia do silnika antywirusowego ClamAV, tak więc dla postfixa jest tylko jeden content_filter.

Zainstalowanie dspam

Wszystko zostało przedstawione w etapie instalacji serwera pocztowego

Przygotowanie bazy danych

Kolejnym krokiem jest przygotowanie bazy danych (PostgreSQL):

createuser -U pgsql -DERSP dspam
createdb -U pgsql -E UTF8 -O dspam dspam_db
createlang -U pgsql plpgsql dspam_db

Wgranie schematu do bazy danych

Jest gotowy skrypt SQLowy, który pozwala na założenie bazy danych dla dspam:

cat /usr/local/share/examples/dspam/pgsql/pgsql_objects.sql | psql -U pgsql dspam_db
cat /usr/local/share/examples/dspam/pgsql/virtual_users.sql | psql -U pgsql dspam_db

Dodanie indeksów

W celu przyspieszenia działania bazy danych warto dodać następujące indeksy:

CREATE INDEX uid_dspam_token_data ON dspam_token_data (uid);
CREATE INDEX token_dspam_token_data ON dspam_token_data (token);
CREATE INDEX last_hit_dspam_token_data ON dspam_token_data (last_hit);

CREATE UNIQUE INDEX uid_token_dspam_token_data ON dspam_token_data (uid,token);

Ostatni indeks jest w definicji samej tabeli. Pozostałe indeksy przyspieszają zapytania (szczególnie kasowanie danych).

Dopisanie konta dspam do dspam_virtual_uids

W logach przy próbie nauki (dspam-retrain) pojawiały się błędy typu Unable to find a valid signature. Aborting. Potrzeba dopisania specjalnego wirtualnego użytkownika do tabeli wirtualnych identyfikatorów:

INSERT INTO dspam_virtual_uids (username) VALUES ('dspam')

Zmiana właściciela obiektów w bazie danych

echo '\dt' | psql -U pgsql dspam_db | awk '/public/ {print "ALTER TABLE",$3,"OWNER TO dspam;";}' | psql -U pgsql dspam_db
echo '\ds' | psql -U pgsql dspam_db | awk '/public/ {print "ALTER SEQUENCE",$3,"OWNER TO dspam;";}' | psql -U pgsql dspam_db

Konfigurowanie dspam.conf

Plik konfiguracyjny to /usr/local/etc/dspam.conf:

# Katalog domowy do przechowywania wszelkich danych
#
Home /var/db/dspam

# Sterownik do bazy danych (zgodnie z wyborem przy instalacji)
#
StorageDriver /usr/local/lib/dspam/libpgsql_drv.so

# Agent do dostarczenia poczty po sprawdzeniu poczty
#
#TrustedDeliveryAgent "/usr/libexec/mail.local"
TrustedDeliveryAgent "/usr/local/cyrus/bin/deliver $u"

# sposób alternatywny:
#
DeliveryHost            127.0.0.1
DeliveryPort            10026
DeliveryIdent           dspam
DeliveryProto           SMTP

# co zrobić, jak się nie uda przekazać do kwarantanny
#
OnFail error

# zaufani użytkownicy
#
Trust root
Trust dspam
Trust apache
Trust mail
Trust mailnull
Trust smmsp
Trust daemon
#Trust nobody
#Trust majordomo

# sposób samonauczania
#
TrainingMode teft

TestConditionalTraining on

# dodatki
#
Feature whitelist

# algortym nauki
#
Algorithm graham burton

# rozbieranie maila na czynniki pierwsze - sposób sprawdzania
#
Tokenizer chain

# PValue: Specify the technique used for calculating Probability Values,
# overriding any defaults configured in the build. These options are:
PValue bcr

# statystyki
#
WebStats on

# ImprobabilityDrive: Calculate odds-ratios for ham/spam, and add to
# X-DSPAM-Improbability headers
#
ImprobabilityDrive on

Preference "trainingMode=TEFT"          # { TOE | TUM | TEFT | NOTRAIN } -> default:teft
Preference "spamAction=tag"             # { quarantine | tag | deliver } -> default:quarantine
Preference "spamSubject=[SPAM]"         # { string } -> default:[SPAM]
Preference "statisticalSedation=5"      # { 0 - 10 } -> default:0
Preference "enableBNR=on"               # { on | off } -> default:off
Preference "enableWhitelist=on"         # { on | off } -> default:on
Preference "signatureLocation=message"  # { message | headers } -> default:message
Preference "tagSpam=on"                 # { on | off }
Preference "tagNonspam=off"             # { on | off }
Preference "showFactors=off"            # { on | off } -> default:off
Preference "optIn=off"                  # { on | off }
Preference "optOut=off"                 # { on | off }
Preference "whitelistThreshold=10"      # { Integer } -> default:10
Preference "makeCorpus=off"             # { on | off } -> default:off
Preference "storeFragments=off"         # { on | off } -> default:off
Preference "localStore="                # { on | off } -> default:username
Preference "processorBias=on"           # { on | off } -> default:on
Preference "fallbackDomain=off"         # { on | off } -> default:off
Preference "trainPristine=off"          # { on | off } -> default:off
Preference "optOutClamAV=off"           # { on | off } -> default:off
Preference "ignoreRBLLookups=off"       # { on | off } -> default:off
Preference "RBLInoculate=off"           # { on | off } -> default:off

# nadpisywanie preferencji przez użytkowników
#
AllowOverride enableBNR
AllowOverride enableWhitelist
AllowOverride fallbackDomain
AllowOverride ignoreGroups
AllowOverride ignoreRBLLookups
AllowOverride localStore
AllowOverride makeCorpus
AllowOverride optIn
AllowOverride optOut
AllowOverride optOutClamAV
AllowOverride processorBias
AllowOverride RBLInoculate
AllowOverride showFactors
AllowOverride signatureLocation
AllowOverride spamAction
AllowOverride spamSubject
AllowOverride statisticalSedation
AllowOverride storeFragments
AllowOverride tagNonspam
AllowOverride tagSpam
AllowOverride trainPristine
AllowOverride trainingMode
AllowOverride whitelistThreshold
AllowOverride dailyQuarantineSummary

# parsowanie nag/l/owk/ow (na podstawie poszukiwa/n rozwi/azania problem/ow z b/l/ednym tokenem)
ParseToHeaders on
ChangeModeOnParse on
ChangeUserOnParse full

# Ignorowanie nagłówków, czyli jednak powtórne sprawdzanie przez dspam
IgnoreHeader X-Spam-Status
IgnoreHeader X-Spam-Scanned
#IgnoreHeader X-Virus-Scanner-Result

# ustawienia do bazy danych PostgreSQL
PgSQLServer             /tmp
#PgSQLPort
PgSQLUser               dspam
PgSQLPass               _haslo_do_zmiany_
PgSQLDb                 dspam_db

PgSQLUIDInSignature     on
PgSQLVirtualTable               dspam_virtual_uids
PgSQLVirtualUIDField            uid
PgSQLVirtualUsernameField       username

HashRecMax              98317
HashAutoExtend          on
HashMaxExtents          0
HashExtentSize          49157
HashPctIncrease         10
HashMaxSeek             10
HashConnectionCache     10
Notifications   off
PurgeSignatures 14      # Stale signatures
PurgeNeutral    90      # Tokens with neutralish probabilities
PurgeUnused     90      # Unused tokens
PurgeHapaxes    30      # Tokens with less than 5 hits (hapaxes)
PurgeHits1S     15      # Tokens with only 1 spam hit
PurgeHits1I     15      # Tokens with only 1 innocent hit
LocalMX 127.0.0.1
SystemLog       on
UserLog         on
TrackSources    spam
Opt out

# przekazywanie poczty do antywirusa
#
ClamAVPort              3310
ClamAVHost              127.0.0.1
ClamAVResponse          accept

# -- CLIENT / SERVER --

#
ServerMode auto
ServerPass.Relay1       "secret"
ServerParameters        "--deliver=innocent -d %u"
ServerDomainSocketPath  "/var/run/dspam.sock"

ProcessorURLContext on
ProcessorBias on
StripRcptDomain off

## EOF

Utworzenie użytkownika na potrzeby postfixa

pw add user dspam -g mail -d /var/db/dspam -s /sbin/nologin

Dopisanie potrzebnych wpisów w transport.px

W celu dobrego działania nauki dspam konieczne jest dopisanie poniższych linijek w transport.px

# --- dspam ------------------------------------------------------
#
spam.spam                       dspam-retrain:spam
ham.ham                         dspam-retrain:innocent

Utworzenie plików - komunikatów dla retrain

mkdir -p /var/db/dspam/txt/
chgrp mail /var/db/dspam/txt/
echo "Scanned and tagged as SPAM by DSPAM on BSD Serwis spam laboratory" > /var/db/dspam/txt/msgtag.spam
echo "Scanned and tagged as HAM by DSPAM on BSD Serwis spam laboratory" > /var/db/dspam/txt/msgtag.nospam
echo "Scanned and tagged as HAM by DSPAM on BSD Serwis spam laboratory" > /var/db/dspam/txt/msgtag.ham

Czyszczenie bazy danych ze starych wpisów

Aby nie dopuścić do przepełnienia bazy danych, dspam oferuje dwa skrypty, które należy uruchamiać w porach nocnych (może w ramach periodic??). Skrypty mogą powodować obciążenie serwera, stąd zalecenie na godziny nocne.

purge-pe.sql

Skrypt do uruchomienie, jeżeli użytkownicy mogą ustawiać swoje preferencje dla dspam.

purge.sql

Skrypt do uruchomienia, jeżeli ustawienia są tylko globalne.

Więcej informacji można znaleźć w dokumentacji: /usr/local/share/doc/dspam/pgsql_drv.txt.

Instalacja interfejsu webowego

W opcjach instalacji jest możliwość zaznaczenia instalacji interfejsu webowego. Niemniej widać, że aktualnie jest to mocno niedopracowane i wymaga poprawek.

Modyfikacja Makefile

Patrz konfiguracje zapisane w instalacji serwera pocztowego.

Dodatkowo trzeba "utworzyć" pliki na podstawie plików przykładowych:

cp -p configure.pl.sample configure.pl
cp -p admins.sample admins
cp -p default.prefs.sample default.prefs

Można skorzystać z poniższych patchy: (poniższa konfiguracja obejmuje "mail gateway" z obsługą wielu domen (domain scale)):

--- configure.pl.sample 2014-10-24 10:51:23.109523000 +0200
+++ configure.pl        2014-12-08 22:36:00.175679730 +0100
@@ -32,7 +32,7 @@
 $CONFIG{'DSPAM_PROCESSES'} = "ps auxw | grep dspam | grep -v 'grep\|cgi\|sock' | wc -l"; # use ps -deaf for Solaris
 $CONFIG{'MAIL_QUEUE'}  = "mailq | grep '^[0-9,A-F]\{10,12\}[\t ][\t ]*[1-9]' | wc -l";

-$CONFIG{'WEB_ROOT'}    = ""; # URL location of included htdocs/ files
+$CONFIG{'WEB_ROOT'}    = "/dspam/"; # URL location of included htdocs/ files

 # Default DSPAM display
 #$CONFIG{'DATE_FORMAT'}        = "%d.%m.%Y %H:%M"; # Date format in strftime style
@@ -49,24 +49,24 @@

 # Full path to TTF font(s) used for legend, x and y labels in Graphs. GD must be compiled
 # with TTF support if you want to use this feature.
-#$CONFIG{'GRAPHS_X_LABEL_FONT'} = "/usr/share/fonts/dejavu/DejaVuSans.ttf";
-#$CONFIG{'GRAPHS_Y_LABEL_FONT'} = "/usr/share/fonts/dejavu/DejaVuSans.ttf";
-#$CONFIG{'GRAPHS_LEGEND_FONT'}  = "/usr/share/fonts/dejavu/DejaVuSans-Bold.ttf";
+$CONFIG{'GRAPHS_X_LABEL_FONT'} = "/usr/local/lib/X11/fonts/dejavu/DejaVuSans.ttf";
+$CONFIG{'GRAPHS_Y_LABEL_FONT'} = "/usr/local/lib/X11/fonts/dejavu/DejaVuSans.ttf";
+$CONFIG{'GRAPHS_LEGEND_FONT'}  = "/usr/local/lib/X11/fonts/dejavu/DejaVuSans-Bold.ttf";

 # Add customized settings below
-$CONFIG{'LOCAL_DOMAIN'}        = "example.org";
+$CONFIG{'LOCAL_DOMAIN'}        = "mojadomena.pl";

 $ENV{'PATH'}           = "$ENV{'PATH'}:$CONFIG{'DSPAM_BIN'}";

 # Autodetect filesystem layout and preference options
-$CONFIG{'AUTODETECT'}  = 1;
+##$CONFIG{'AUTODETECT'}        = 1;

 # Or, if you're running dspam.cgi as untrusted, it won't be able to auto-detect
 # so you will need to specify some features manually:
-#$CONFIG{'AUTODETECT'} = 0;
+$CONFIG{'AUTODETECT'}  = 0;
 #$CONFIG{'LARGE_SCALE'}        = 0;
-#$CONFIG{'DOMAIN_SCALE'}= 0;
-#$CONFIG{'PREFERENCES_EXTENSION'} = 0;
+$CONFIG{'DOMAIN_SCALE'}= 1;
+$CONFIG{'PREFERENCES_EXTENSION'} = 1;

 # Get DSPAM version
 $CONFIG{'DSPAM_VERSION'} = "Unknown Version";

--- admins.sample       2014-06-25 12:45:46.388606000 +0200
+++ admins      2014-06-25 12:56:44.407559896 +0200
@@ -1 +1,2 @@
 root
+wtps0n

admingraph.cgi

W celu poprawnego wyświetlania obrazków należy poprawić plik admingraph.cgi w celu poprawnego wczytania pliku konfiguracyjnego configure.pl (linia 25-35):

#
# Read configuration parameters common to all CGI scripts
#
if (!(-e "/usr/local/www/dspam/configure.pl") || !(-r "/usr/local/www/dspam/configure.pl")) {
  &htmlheader;
  print "<html><head><title>Error!</title></head><body bgcolor='white' text='black'><center><h1>";
  print "Missing file configure.pl";
  print "</h1></center></body></html>\n";
  exit;
}
require "/usr/local/www/dspam/configure.pl";

Lokalizacja komunikatów

Można wykonać lokalizację komunikatów poprzez poniższe zadania:

cd /usr/local/www/dspam/templates/
mkdir pl/
cp -p strings.pl pl/
cp -p *.html pl/
perl -pi -e 's/iso-8859-1/UTF-8/' pl/*.html

A potem dokonać odpowiednich tłumaczeń.

Dopisanie kodowaęnia w skryptach PERLowych

W plikach PERLowych (strings.pl, admin.cgi oraz dspam.cgi) należy dopisać następujące linijki:

use utf8;

Dodatkowo w admin.cgi należy dopisać:

use open ':std' => ':encoding(UTF-8)';

Łatanie dspam.cgi

--- dspam.cgi.orig      2018-04-25 14:27:32.648151000 +0200
+++ dspam.cgi   2018-09-20 13:27:52.534507000 +0200
@@ -22,6 +22,8 @@ use POSIX qw(strftime ctime);
 use Time::Local;
 use vars qw { %CONFIG %DATA %FORM %LANG $MAILBOX $CURRENT_USER $USER $TMPFILE $USERSELECT };
 use vars qw { $CURRENT_STORE $LANGUAGE };
+use utf8;
+use open ':std' => ':encoding(UTF-8)';

 #
 # Read configuration parameters common to all CGI scripts
@@ -1662,7 +1664,7 @@ sub htmlheader {
   print "Expires: now\n";
   print "Pragma: no-cache\n";
   print "Cache-control: no-cache\n";
-  print "Content-type: text/html\n\n";
+  print "Content-type: text/html;charset=utf-8\n\n";
 }

 sub output {

Dodanie uprawnień do katalogu /var/db/dspam

Aby możliwe było czytanie statystyk z przetworzonej poczty, konieczne jest poprawienie uprawnień do plików dspam

/usr/local/admin/setfacl-in-dir.sh -z /var/db/dspam/ www r
setfacl -m u:www:rx::allow /var/db/dspam/

# aby móc ponownie trenować za pomocą panelu www
#
setfacl -m u:www:x::allow /usr/local/bin/dspam

Integracja z Apache

Utworzenia pliku do autentykacji

htpasswd -m -c /var/www/htdocs/virtuals/rtm.bsdserwis.com/authdb/dspamdb wtps0n

.htaccess

Zawartość pliku /usr/local/www/dspam/.htaccess:

AuthName "Dspam Control Center"
AuthType Basic
AuthUserFile /var/www/htdocs/virtuals/rtm.bsdserwis.com/authdb/dspamdb
require valid-user

Konfiguracja Apache

Zawartość pliku /usr/local/etc/apache22/Includes/common.dspam.directory.conf:

# --- definicja katalogu z plikami/skryptami webowymi --------------------
#
<Directory /usr/local/www/dspam>
    Options Indexes FollowSymLinks ExecCGI
    AllowOverride AuthConfig
    Order allow,deny
    Allow from all
    <IfModule mod_php5.c>
        php_value default_charset "utf-8"
    </IfModule>

</Directory>

A następnie wykonanie aliasu (najlepiej dla witryny https):

Alias /dspam/ /usr/local/www/dspam/

Integracja z nginx

Integracja z serwerem nginx opisana została w oddzielnym dokumencie.

Nauczanie dspam

Na podstawie powyższej dokumentacji można dokonywać nauczania dspam poprzez przesyłanie maili na następujące adresy:

  1. spam@spam.spam

  2. ham@ham.ham

Inne próby mogą się zakończyć niepowodzeniem. Wynika to z konfiguracji zapisanej w dspam_filter_access.pcre oraz transport.px (patrz konfiguracja powyżej)

Przydatne linki w sieci internet

Lista linków, które były pomocne przy utworzeniu powyższego przepisu:

  1. http://tobias.schroepf.de/doku/doku.php?id=linux:postfix_dspam_and_clamav

  2. http://wiki.linuxwall.info/doku.php/en:ressources:dossiers:dspam

  3. http://forums.gentoo.org/viewtopic-t-526102-view-previous.html?sid=d1da1fff42605f078890146a50046000 (w przypadku komunikatu o braku danych historycznych).


{i}  (c) 2004 - 2026 BSD Serwis Krzysztof Stryjek. W przypadku błędów, poprawek proszę kontaktować się z administratorem wiki.

PostfixDspam (ostatnio edytowane 2019-12-07 09:56:01 przez wtps0n)