Spam és vírus szűrés
A spam és a levélben érkező vírusok korunk rákfenéi... védekeznünk kell ellenük, klónozzuk a template fájlrendszer, legyen az új jail neve mailscanner, állítsuk be a megszokott módon, hozzunk létre neki adatokat hordozó fájlrendszer, amelyet csatoljunk fel a /data alá, adjuk hozzá a DNS-hez a címeit, majd indítsuk el.
Hasonlóan, mint a mail jail esetén tettük, tiltsuk le a Sendmail futását, és telepítsünk fel egy postfix programot, amelynek egyetlen feladat a levelek fogadása lesz. A konfiguráció is egyszerű lesz, mindössze annyit mondunk meg, hogy mi a neve a kiszolgálónak, s honnan fogadunk leveleket, illetve hova küldjük tovább:
myhostname = mailscanner.jails.javaforum.hu mydomain = mailscanner.jails.javaforum.hu myorigin = mailscanner.jails.javaforum.hu mydestination = mailscanner.jails.javaforum.hu, spam.javaforum.hu mynetworks = 127.0.0.0/8, 192.168.1.0/24, 192.168.2.0/24 alias_maps = hash:/etc/aliases relayhost = [mail.jails.javaforum.hu] queue_directory = /data/postfix
Ne feledjük a /etc/rc.conf fájlban felvenni a _postfix_indítását:
sendmail_enable="NONE" postfix_enable="YES"
S másoljuk át a postfix könyvtárát a megadott helyre:
[root@mailscanner:~]$ mv /var/spool/postfix/ /data/
Ezek után már el is indíthatjuk a szolgáltatást.
Postgrey – a szürke zóna
A spam elleni védekezés első védelmi vonala már akkor hatásos, amikor a spam még be se érkezett. A postgrey program egyszerűen késlelteti a levelek beérkezését, feltételezve, hogy a legális levelező partnerek szervere kis idő után újra megpróbálja kézbesíteni a levelet. A postgrey ekkor már beengedi a levelet, amelyet a mögötte lévő spam szűrő még megvizsgál. Ha újra levelet kapunk egy olyan helyről, amelyet a postgrey már átengedett, akkor nincs késlekedés, ugyanis a postgrey letárolja a küldő gép IP címét, a küldő email címét és a helyi címzettet (ez a triplet). Telepítsük fel a programot, majd elindításához az /etc/rc.conf állományába fel kell vennünk az alábbit:
postgrey_enable="YES" postgrey_enable="YES" postgrey_pidfile="/var/run/postgrey.pid" postgrey_flags="--greylist-text 'User disk quota has been exceeded' \ --pidfile=/var/run/postgrey.pid \ --whitelist-clients=/data/postgrey/whitelist_clients \ --whitelist-recipients=/data/postgrey/whitelist_recipients \ --inet=10023 -d --user=postgrey --group=postgrey --dbdir=/data/postgrey"
Mielőtt elindítanánk a programot, mozgassuk át az általunk megadott helyre az adatait:
[root@mailscanner:~]$ mv /var/db/postgrey/ /data/ [root@mailscanner:~]$ ln -s /data/postgrey/ /var/db/postgrey [root@mailscanner:~]$ cp /usr/local/etc/postfix/postgrey_whitelist_clients /data/postgrey/whitelist_clients [root@mailscanner:~]$ cp /usr/local/etc/postfix/postgrey_whitelist_recipients /data/postgrey/whitelist_recipients
A szolgáltatás indítása után a megfelelő logban az alábbit kell látnunk:
Jan 18 17:42:21 mailscanner postgrey[43104]: Process Backgrounded Jan 18 17:42:21 mailscanner postgrey[43104]: 2009/01/18-17:42:21 postgrey (type Net::Server::Multiplex) starting! pid(43104) Jan 18 17:42:21 mailscanner postgrey[43104]: Binding to TCP port 10023 on host localhost
Most már csak a mail jail-ben futó postfix-et kell erről értesítenünk, a meglévő smtpd_recipient_restrictions sort kell kiegészítenünk:
smtpd_recipient_restrictions = permit_sasl_authenticated,permit_mynetworks,check_policy_service inet:mail.system.jails.javaforum.hu:10023
A jail újraindítása után próbáljunk meg levelet küldeni saját gépünkről a szerverre:
auth.gabor@laptop:~> telnet javaforum.hu 25 Trying 91.83.48.130... Connected to javaforum.hu. Escape character is '^]'. 220 mail.javaforum.hu ESMTP Postfix (2.5.5) HELO localhost 250 mail.javaforum.hu Mail from: auth.gabor@javaforum.hu 250 2.1.0 Ok Rcpt to: valakinek@javaforum.hu 450 4.2.0 <valakinek@javaforum.hu>: Recipient address rejected: User disk quota has been exceeded quit 221 2.0.0 Bye Connection closed by foreign host.
Mint látható, meg se várja a levél törzsét a megoldás, már visszadobja, hogy greylisted. Mivel az alapértelmezett üzenet túlságosan árulkodó, ezért célszerű kicserélni valami olyanra, ami gyakori lehet, de mégis a levél üzemszerű újraküldésére ingerli a küldő szerverét (a 450-es hibakód átmeneti hibát jelez, ilyen esetben a küldő szervernek kötelessége többször is próbálkozni).
A postgrey 5 perc után engedi be a próbálkozókat, így ha eltelt ennyi idő, próbáljuk újra a levélküldést:
auth.gabor@laptop:~> telnet javaforum.hu 25 Trying 91.83.48.130... Connected to javaforum.hu. Escape character is '^]'. 220 javaforum.hu ESMTP Postfix (2.5.4) HELO localhost 250 javaforum.hu Mail from: auth.gabor@javaforum.hu 250 2.1.0 Ok Rcpt to: valakinek@javaforum.hu 250 2.1.5 Ok DATA 354 End data with <CR><LF>.<CR><LF> Subject: Test mail Test mail . 250 2.0.0 Ok: queued as 9DE973EED quit 221 2.0.0 Bye Connection closed by foreign host.
A spam szűrő
Az egyik legrugalmasabb spam (és vírus) szűrő az amavisd-new, bár kissé lassú, mivel az egész egy nagy halom perl scriptből áll, s rengeteg más programtól függ, és még víruskereső is kell neki. Telepítsük fel az amavisd-new és a clamav csomagot, majd lássunk neki a beállításnak.
Az amavisd-new részéről a beállítások nagyjából rendben vannak, pár dolgot kell máshova tenni, illetve az összes localhost vagy 127.0.0.1 hivatkozást cseréljük le a mailscanner jail nevére címére:
$mydomain = 'javaforum.hu'; $MYHOME = '/data/amavis'; $QUARANTINEDIR = '/data/virusmails'; $syslog_priority = 'notice'; @inet_acl = qw( 127.0.0.1 ::1 192.168.1.0/24 192.168.2.0/24 ); $notify_method = 'smtp:[mail.jails.javaforum.hu]:10025'; $forward_method = 'smtp:[mail.jails.javaforum.hu]:10025';
Keressük meg a ClamAV bejegyzését, és szedjük ki a komment jeleket:
['ClamAV-clamd', \&ask_daemon, ["CONTSCAN {}\n", "/var/run/clamav/clamd"], qr/\bOK$/, qr/\bFOUND$/, qr/^.*?: (?!Infected Archive)(.*) FOUND$/m ],
Ezek után a fenti beállításnak megfelelően mozgassuk át az általunk megadott helyre a virusmails könyvtárat, mivel ez a végtelenségig fog nőni, többször törölni kell majd belőle, s jobb ezt olyan fájlrendszeren tartani, amit erre a célra hoztunk létre:
[root@mail:~]$ mv /var/virusmails/ /data/ [root@mail:~]$ mv /var/amavis/ /data/ [root@mailscanner:~]$ ln -s /data/amavis/ /var/amavis
A clamd is mindent jól tud alapértelmezésben, de állítsuk be neki, hogy a syslog-ng-n át loggoljon, illetve adjuk meg neki is, hogy a /data alá hozza létre az állományait:
#LogFile /var/log/clamav/clamd.log LogSyslog yes LogFacility LOG_MAIL DatabaseDirectory /data/clamav LocalSocket /var/run/clamav/clamd
Ugyanezt tegyük meg a frissítést végző freshclam konfiggal is:
DatabaseDirectory /data/clamav #UpdateLogFile /var/log/clamav/freshclam.log LogSyslog yes LogFacility LOG_MAIL
Adjuk hozzá a /etc/rc.conf fájlhoz az amavisd és a clamav indítását is:
amavisd_enable="YES" clamav_clamd_enable="YES" clamav_freshclam_enable="YES"
Mozgassuk át az adatbázist az új helyre:
[root@mailscanner:~]$ mv /var/db/clamav/ /data/ [root@mailscanner:~]$ ln -s /data/clamav/ /var/db/clamav
Majd adjuk hozzá a clamav felhasználót a vscan csoporthoz.
vscan:*:110:clamav
Ezek után kissé módosítanunk kell a mail jail postifx master.cf állományát:
smtp inet n - n - - smtpd -o content_filter=smtp:[mailscanner.jails.javaforum.hu]:10024 smtps inet n - n - - smtpd -o smtpd_tls_wrappermode=yes -o smtpd_sasl_auth_enable=yes -o smtpd_client_restrictions=permit_sasl_authenticated,reject -o milter_macro_daemon_name=ORIGINATING mail.jails.javaforum.hu:10025 inet n - n - - smtpd -o content_filter=
Az SMTPS protokollhoz nem teszünk szűrést, hiszen itt még nem valószínű, hogy spam jönne... még...
Az egész konfig sorozat után indítsuk újra a jail-t, majd nézzük meg, működik-e:
auth.gabor@laptop:/var/log> telnet javaforum.hu 2525 Trying 91.83.48.130... Connected to javaforum.hu. Escape character is '^]'. 220 mail.javaforum.hu ESMTP Postfix (2.5.5) HELO localhost 250 mail.javaforum.hu Mail from: auth.gabor@javaforum.hu 250 2.1.0 Ok Rcpt to: valakinek@javaforum.hu 250 2.1.5 Ok DATA 354 End data with <CR><LF>.<CR><LF> Message-ID: <486DA3CD.2080607@lakecumberlandky.com> Date: Fri, 4 Jul 2008 12:15:09 +0800 From: <kolaci@pw.utc.com> User-Agent: Thunderbird 2.0.0.6 (Windows/20070728) MIME-Version: 1.0 To: rendszergazda@javaforum.hu Subject: Stars and Strips forever Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Well done 4th! http://24.130.139.182/ . 250 2.0.0 Ok: queued as 54F6BB9 quit 221 2.0.0 Bye Connection closed by foreign host.
Nézzük meg, mi került a naplóba végére:
Jan 18 18:58:31 mail postfix/smtpd[84796]: connect from catv-80-98-243-212.catv.broadband.hu[80.98.243.212] Jan 18 18:58:36 mail postfix/smtpd[84796]: B839ABD: client=catv-80-98-243-212.catv.broadband.hu[80.98.243.212] Jan 18 18:58:41 mail postfix/cleanup[84800]: B839ABD: message-id=<486DA3CD.2080607@lakecumberlandky.com> Jan 18 18:58:41 mail postfix/qmgr[83800]: B839ABD: from=<auth.gabor@javaforum.hu>, size=598, nrcpt=1 (queue active) Jan 18 18:58:43 mail postfix/smtpd[84796]: disconnect from catv-80-98-243-212.catv.broadband.hu[80.98.243.212] Jan 18 18:58:44 mail postfix/smtpd[83951]: timeout after END-OF-MESSAGE from mailscanner.jails.javaforum.hu[192.168.2.9] Jan 18 18:58:44 mail postfix/smtpd[83951]: disconnect from mailscanner.jails.javaforum.hu[192.168.2.9] Jan 18 18:58:44 mail postfix/smtpd[83951]: connect from mailscanner.jails.javaforum.hu[192.168.2.9] Jan 18 18:58:44 mail postfix/smtpd[83951]: 62123BE: client=mailscanner.jails.javaforum.hu[192.168.2.9] Jan 18 18:58:44 mail postfix/cleanup[84800]: 62123BE: message-id=<SSD531+6trS+c6@mailscanner.jails.javaforum.hu> Jan 18 18:58:44 mail postfix/qmgr[83800]: 62123BE: from=<>, size=3527, nrcpt=1 (queue active) Jan 18 18:58:44 mail postfix/smtp[84802]: B839ABD: to=<valakinek@javaforum.hu>, relay=mailscanner.jails.javaforum.hu[192.168.2.9]:10024, delay=9, delays=6/0.02/0.01/3, dsn=2.5.0, status=sent (250 2.5.0 Ok, id=82821-01, BOUNCE) Jan 18 18:58:44 mail postfix/qmgr[83800]: B839ABD: removed Jan 18 18:58:44 mail postfix/virtual[84804]: 62123BE: to=<auth.gabor@javaforum.hu>, relay=virtual, delay=0.13, delays=0.06/0.06/0/0.01, dsn=2.0.0, status=sent (delivered to maildir) Jan 18 18:58:44 mail postfix/qmgr[83800]: 62123BE: removed
Ebből nem derül ki sokminden, nézzük meg a mailscanner logot is:
Jan 18 18:58:44 mailscanner amavis[82821]: (82821-01) Blocked SPAM, [80.98.243.212] [80.98.243.212] <auth.gabor@javaforum.hu> -> <valakinek@javaforum.hu>, quarantine: spam-D531+6trS+c6.gz, Message-ID: <486DA3CD.2080607@lakecumberlandky.com>, mail_id: D531+6trS+c6, Hits: 9.802, size: 598, 2996 ms
Hát... elkapta.
A vírus szűrő
A spamek szűrésével már működik is a vírusok szűrése is, ezt nehezebb kipróbálni, valószínűleg működik is, bár az ingyenes clamav teszi a dolgát, ha nem bízunk meg benne, akkor fel kell szerelkeznünk egy olyan víruskeresővel, amely fut FreeBSD alatt, az amavisd-new is ismeri, és mindezen túl meg is bízunk benne... nem is olyan rossz az a clamav...
A tanítás
A spam szűrőt érdemes tanítani, ennek legkényelmesebb módja az, ha erre rendszeresítünk kettő email címet:
- spam@spam.javaforum.hu, amelyre az átcsúszott spam leveleket továbbíthatjuk
- ham@spam.javaforum.hu, amelyre az elkapott, de nem spam leveleket továbbítjuk
A feladathoz kell írnunk egy rövid C programot, amely elindítja a SpamAssassin tanuló programját:
#include <unistd.h> #include <stdio.h> #include <string.h> int main( int args, char *argv[], char *envp[] ) { char name[80] = "/usr/local/bin/sa-learn"; execve( name, argv, envp); }
A hivatkozott fájl egy perl script, amelyre nem tudunk suid bitet tenni, de a sa-wrapper programra igen, mégpedig a tanulásnak vscan felhasználóként kell futnia, de a postfix fogja végrehajtani:
[root@mailscanner:~]$ gcc sa-wrapper.c -o sa-wrapper [root@mailscanner:~]$ chmod 4755 sa-wrapper [root@mailscanner:~]$ chown vscan:vscan sa-wrapper [root@mailscanner:~]$ ls -l sa-wrapper -rwsr-xr-x 1 vscan vscan 6888 Jan 18 19:06 sa-wrapper [root@mailscanner:~]$ mv sa-wrapper /usr/local/bin/
A végrehajtáshoz annyi kell, hogy a /etc/aliases végére írjuk:
## spamassassin learn spam: "|/usr/local/bin/sa-wrapper --spam" ham: "|/usr/local/bin/sa-wrapper --ham"
Ezek után generáljuk újra az adatbázist:
[root@mailscanner:~]$ newaliases [root@mailscanner:~]$ ls -l /etc/aliases* lrwxr-xr-x 1 root wheel 12 Jan 14 14:42 /etc/aliases -> mail/aliases -rw-r--r-- 1 root wheel 16384 Jan 18 19:10 /etc/aliases.db
Az átirányításhoz a mail jail-ben futó postfix is kell, hiszen ő kezeli az összes bejövő levelet. A main.cf végére vegyük fel:
relay_domains = spam.javaforum.hu transport_maps = hash:/usr/local/etc/postfix/transport
Ezen után módosítanunk kell a transport fájlt is:
spam.javaforum.hu relay:[mailscanner.jails.javaforum.hu]:25
Generáljunk egy adatbázist is, majd indítsuk újra a postfix szolgáltatást:
[root@mail:~]$ cd /usr/local/etc/postfix/ [root@mail:/usr/local/etc/postfix]$ postmap transport [root@mail:/usr/local/etc/postfix]$ /usr/local/etc/rc.d/postfix restart postfix/postfix-script: stopping the Postfix mail system postfix/postfix-script: starting the Postfix mail system