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:
$ 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:
> 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:
> 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…
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/
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:
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