Changes

Email Server - MailScanner alapok

19,267 bytes added, 22:32, 29 September 2016
Amavis – 2.9.1
=Áttekintés=
Email szkennelőnek az AmavisNew programot fogjuk használni. Az AmaivsNew ...
 
:[[File:ClipCapIt-160926-214529.PNG|400px]]
 
 
 
 
=ClamAV-0.98.5=
 
==Installálás==
Két programot kell felrakni. Magát a clamav vírus kereső programot, és clamd démont, amin keresztül az amaivs hozzá fog csatlakozni a clamAV-hez.
 
A clamav-t meg kell hívni a megfelelő argumentumokkal, hogy átvizsgáljon egy fájlt vagy egy mappát, tehát nem egy futó démon. Ezzel szemben a clamd-t el kell indítani, hogy folyamatosan fogadja a hozzá beérkező kéréseket, majd a megfelelő paraméterekkel meghívja a clamav programot, hogy vizsgálja át a neki átadott fájlt, pl. egy email-t.
 
Ehhez elsőként a EPEL repót hozzá kell adni a yum-hoz.
<pre>
# rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
</pre>
<pre>
# yum install clamav clamd
</pre>
 
/etc/clamad.conf
<pre>
DatabaseDirectory /var/lib/clamav
User clam
 
ScanMail yes
ScanArchive yes
</pre>
 
 
==Vírus definíciók frissítése==
A vírus adatbázis frissítését a freshclam program végzi. Ennek van egy saját config fájlja. Ebben fontos, hogy a vírus adatbázis helye ugyan ott legyen, mint amit a clamav.conf-ban megadtunk.
/etc/freshclam.conf
<pre>
DatabaseDirectory /var/lib/clamav
DatabaseOwner clam
</pre>
 
Így kell frissíteni:
<pre>
# /usr/bin/freshclam --no-warnings
</pre>
 
A telepítés létrehozott egy alap ClamAV frissítő fájlt a /etc/crond.daily-ben. Ezt egészítsük ki azzal, hogy küldje el email-ben a freshclam logját ha lefutott. Írjuk át úgy a freshclam futtatását, hogy ne írjon ki warning-okat, és, szedjük ki a quiet kapcsolót, és az output-ot irányítsuk egy fájlba, amit az emial mellékletéhez csatolni fogunk.
<pre>
/etc/cron.daily/freshclam
!/bin/sh
 
### A simple update script for the clamav virus database.
### This could as well be replaced by a SysV script.
 
### fix log file if needed
LOG_FILE="/var/log/clamav/freshclam.log"
if [ ! -f "$LOG_FILE" ]; then
touch "$LOG_FILE"
chmod 644 "$LOG_FILE"
chown clam.clam "$LOG_FILE"
fi
 
/usr/bin/freshclam \
--no-warnings \
--datadir="/var/lib/clamav" \
--log="$LOG_FILE" \
> /tmp/freshclam.log
 
 
/bin/echo "" | /bin/mail -a /tmp/freshclam.log -s "[SERVER] ClamAV database Refreshment" -r "root" root
</pre>
A mail parancsnak a -r kapcsolóval megadhatjuk a küldőt, de nem szükséges, mert ha nem adunk meg semmit, akkor a küldő a root@system.berki2.org-lesz.
 
 
==Automatikus fájlrendszer szkennelés==
Letölthető egy okos script, ami elvégzi a megadott mappák vírus vizsgálatát, majd az eredményt elküldi emailben.
Hozzunk létre egy karantén mappát, és adjunk rá mindenkinek írási jogot:
<pre>
# mkdir /var/local/virus_quaraintin/dailyScan
# chmod 722 /var/local/virus_quaraintin/dailyScan
</pre>
 
Tegyük a cron.weekly mappába a szkennelő szkriptet.
 
/etc/cron.weekly/clam_scan_home.sh
<pre>
#!/bin/bash
# Email alert cron job script for ClamAV
# Original, unmodified script by: Deven Hillard
#(http://www.digitalsanctuary.com/tech-blog/debian/automated-clamav-virus-scanning.html)
# Modified to show infected and/or removed files
# Directories to scan
SCAN_DIR="/home/adam2"
 
QUARANTINE_DIR="/var/local/virus_quaraintin/dailyScan"
# Location of log file
LOG_FILE="/var/log/clamav/manual_clamscan.log"
# Uncomment to have scan move files
AGGRESSIVE=1
# Uncomment to have scan not move files
#AGGRESSIVE=0
# Email Subject
SUBJECT="[SERVER] ClamAV virus scan result"
# Email To
EMAIL="root"
 
EMAIL_FROM="root"
 
SCAN_ARGUMENTS="--scan-archive=yes"
check_scan () {
# If there were infected files detected, send email alert
if [ `tail -n 12 ${LOG_FILE} | grep Infected | grep -v 0 | wc -l` != 0 ]
then
# Count number of infections
SCAN_RESULTS=$(tail -n 10 $LOG_FILE | grep 'Infected files')
INFECTIONS=${SCAN_RESULTS##* }
if [ $AGGRESSIVE = 1 ]
then
echo -e "\n`tail -n $((10 + ($INFECTIONS*2))) $LOG_FILE`" | /bin/mail -s "${SUBJECT}" -r "${EMAIL_FROM}" ${EMAIL}
else
echo -e "\n`tail -n $((10 + $INFECTIONS)) $LOG_FILE`" | /bin/mail -s "${SUBJECT}" -r "${EMAIL_FROM}" ${EMAIL}
fi
else
/bin/echo "NO virus found" | /bin/mail -s "${SUBJECT}" -r "${EMAIL_FROM}" ${EMAIL}
fi
}
if [ $AGGRESSIVE = 1 ]
then
#/usr/bin/clamscan -ri --remove $SCAN_DIR >> $LOG_FILE
/usr/bin/clamscan -ri --move=$QUARANTINE_DIR $SCAN_ARGUMENTS $SCAN_DIR >> $LOG_FILE
 
 
else
/usr/bin/clamscan -ri $SCAN_ARGUMENTS $SCAN_DIR >> $LOG_FILE
fi
check_scan
</pre>
 
Adjunk rá futási jogot:
<pre>
# chmod +x /etc/cron.weekly/clam_scan_home.sh
</pre>
 
 
 
=Spamassassin=
 
{{note|Itt csak az alap Spamassassin konfigurációt végezzük el, ezt fogjuk kibővíteni a [[Email Server - Extended Spam filtering|Kiterjesztett spam szűrés ]] című fejezetben.}}
==Spamassassin==
<pre>
# yum install spamassassin
</pre>
}}
 
=Amavis – 2.9.1=
 
==Installáció==
<pre>
rpm -Uvh http://apt.sw.be/redhat/el6/en/x86_64/rpmforge/RPMS/rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm
</pre>
<pre>
# yum install amavisd-new
</pre>
 
/etc/amavisd/amavisd.conf
<pre>
$daemon_user = 'amavis'; # (no default; customary: vscan or amavis), -u
$daemon_group = 'amavis'; # (no default; customary: vscan or amavis), -g
 
$mydomain = 'berki2.org';
...
$myhostname = 'berki2.org'; # must be a fully-qualified domain name!
 
############################################################
# Virusok karantén mappába + értesítés=admin, felhasználó
############################################################
$QUARANTINEDIR = '/var/spool/amavisd/quarantine';
$virus_quarantine_method = 'local: virus-%m'; # Filename in $QUARANTINEDIR
$virus_quarantine_to = 'virus-quarantine';
$virus_admin = "adam\@berki.org";
$warnvirusrecip = 1;
 
$mailfrom_notify_admin = "root\@berki.org"; # notifications sender
$mailfrom_notify_recip = "root\@berki.org"; # notifications sender
$mailfrom_notify_spamadmin = "root\@berki.org"; # notifications sender
 
############################################################
# Rossz fejléc karantén mappába + értesítés=adimin
############################################################
$bad_header_quarantine_method = 'local: bad_header-%m'; # Filename in $QUARANTINEDIR
$bad_header_quarantine_to = 'bad_header-quarantine';
$bad_header_admin = "adam\@berki.org";
 
##################################################################
# Tiltott formátum karantén mappába + értesítés=admin, felhasználó
##################################################################
$banned_files_quarantine_method = 'local: banned-%m'; # Filename in $QUARANTINEDIR
$banned_quarantine_to = 'banned-quarantine';
$banned_admin = "adam\@berki.org";
$warnbannedrecip = 1;
$warnbannedsender = 1;
 
##################################################################
# SPAM kezelés
##################################################################
 
#Spam értékek beállítása
#########################
$sa_spam_subject_tag = '***Spam*** ';
$sa_tag_level_deflt = 2.0; # add spam info headers if at, or above that level
$sa_tag_level_deflt = -999; # add 'spam detected' headers at that level
$sa_kill_level_deflt = 6.9; # triggers spam evasive actions (e.g. blocks mail)
$sa_dsn_cutoff_level = 10; # spam level beyond which a DSN is not sent
$sa_crediblefrom_dsn_cutoff_level = 18; # likewise, but for a likely valid From
# $sa_quarantine_cutoff_level = 25; # spam level beyond which quarantine is off
$penpals_bonus_score = 8; # (no effect without a @storage_sql_dsn database)
$penpals_threshold_high = $sa_kill_level_deflt; # don't waste time on hi spam
$bounce_killer_score = 100; # spam score points to add for joe-jobbed bounces
 
 
#Spamek elküldése emailcímre értesítése nélkül.
###############################################
$spam_quarantine_method = 'smtp:[127.0.0.1]:10025';
$spam_quarantine_to = 'system@berki2.org';
 
 
$sa_debug = 1;
$log_level = 5;
 
 
1; # insure a defined return value
</pre>
Szerintem ami már a config-ban fentebb is szerepelt, azt nem kell kiszedni, mert itt felülírjuk. Meg kell adni a mydomain és a myhostname paramétereket, szerintem nem fotnos, hogy mit írunk oda.
 
A '''$sa_tag_level_deflt = -999;''' beállításával rákényszerítjük az amavis-t hogy mindig belerakja a header-be a spam szűrés végeredményét, még akkor is ha nem gondolja spam-nek az üzenetet.
 
A '''$sa_debug = 1;''' és a '''$log_level = 5;''' el maximálisra emeltük az amavis + spamassassin logolását. Ez a kísérletező időszakban nagyon praktikus.
 
{{note|Az amavis azért tudja kiküldeni a figyelmeztetéseket is publikus email címekre, mert meg van adva a sneder mind három esetre:
<pre>
$mailfrom_notify_admin = "root\@berki.org"; # notifications sender
$mailfrom_notify_recip = "root\@berki.org"; # notifications sender
$mailfrom_notify_spamadmin = "root\@berki.org"; # notifications sender
</pre>
Ha ez nem lenne megadva, akkor a publikus email szerverek eldobálnák a figyelmeztető leveleket.
}}
 
 
/etc/cron.daily/amavisd
<pre>
/usr/sbin/tmpwatch 24 /var/spool/amavisd/tmp
/usr/sbin/tmpwatch -d 720 /var/spool/amavisd/quarantine
</pre>
A tmpwatch kitörli azokat a fájlokat, amihez egy megadott ideig nem nyúlt senki. A conrtab-ban az van beállítva, hogy törölje a tmp mappából azokat a fájlokat, amiket 24 óráig senki nem nyúlt hozzá, és a karanténból azokat a fájlokat, amiket 720 óráig (30 nap) senki nem nézett meg.
 
<pre>
# mkdir -p /var/spool/amavisd/quarantine
# chown amavis:amavis /var/spool/amavisd/quarantine
# chmod 750 /var/spool/amavisd/quarantine
</pre>
 
 
 
Indítsuk el:
<pre>
# service amavisd start
# chkconfig amavisd on
</pre>
 
 
==Vírus szűrés - clamd==
A clamd démon fogadja a kéréseket a Amavis-töl, és meghívja a ClamAV-t a levelek átvizsgálására. A clamd és az amaivs egy socket-en keresztük kommunikálnak. Ezt a clamd.conf-ban és az amavisd.conf-ban fontos, hogy ugyan arra állítsuk, és mind két démon tudja írni ezt a fájlt.
 
/etc/clamad.conf
<pre>
...
LocalSocket /var/run/clamav/clamd.sock
...
User clam
...
AllowSupplementaryGroups yes
...
</pre>
 
Indítsuk el a clamd-t.
<pre>
# service clamd start
# chkconfig clamd on
</pre>
 
Ekkor létrejön a clamd.sock socket fájl.
 
Nézzük meg, hogy kinek a tulajdonában van
<pre>
# ls -l /var/run/clamav/clamd.sock
srw-rw-rw-. 1 clam clam 0 Jan 31 17:06 /var/run/clamav/clamd.sock
</pre>
Láthatjuk, hogy a clam user és csoport tulajdonában van, és a csoport írhatja és olvashatja a fájlt. Ezért fontos, hogy az amaivis user is benne legyen a clam csoportba, hogy tudja írni a socektet ő is.
 
<pre>
# usermod -G amavis clam
# cat /etc/group | grep clam
clam:x:489:
amavis:x:488:clam
</pre>
 
Ezen felül, meg kell engedni, hogy a /var/spool/amavisd mappát a csoport is tudja írni. Ez ahhoz kell, hogy a clamd is bele tudjon írni a mappába.
<pre>
# chmod g+rx /var/spool/amavisd/tmp
 
/etc/amavisd/amavisd.conf
['ClamAV-clamd',
\&ask_daemon, ["CONTSCAN {}\n", "/var/run/clamav/clamd.sock"],
qr/\bOK$/m, qr/\bFOUND$/m,
qr/^.*?: (?!Infected Archive)(.*) FOUND$/m ],
</pre>
Az amaivis az amaivis user és gourp nevében fut. Ami nagyon fontos, hogy a ClamAV-clamd szekcióban a socket fájl ugyan az legyen mint ami clamd.conf-ban meg van adva. Ezt ellenőrizzük.
 
 
==Spam szűrés - spamd==
 
Ahhoz hogy az amaivs át tudja adni a leveleket, a clmad-hez hasonló démont kell elindítani, a spamd démont.
Indítsuk el:
<pre>
# service spamassassin start
# chkconfig spamassassin on
</pre>
 
Az amavis-nak nem kell megmondani, hogy hol van a spamd, mert alapértelmezés szerint azt akarja használni. Amúgy így kéne megadni az amavis.conf-ban:
<pre>
@spam_scanners = ( ['SpamAssassin', 'Amavis::SpamControl::SpamAssassin'] );
</pre>
 
 
==Posfix integráció==
A postfix-ben be kell állítani, hogy minden emailt adjon át kézbesítés előtt az Amavis-nak az 10024-es portra, és fogadja azokat, mikor az amavis visszaküldi az 10025-ös porton.
 
Ehhez két új szolgáltatást kell beállítani a /etc/postfix/maser.cf-ben.
<pre>
# ==========================================================================
# service type private unpriv chroot wakeup maxproc command + args
# (yes) (yes) (yes) (never) (100)
# ==========================================================================
amavisfeed unix - - n - 2 lmtp
-o lmtp_data_done_timeout=1200
-o lmtp_send_xforward_command=yes
-o disable_dns_lookups=yes
-o max_use=20
 
# ==========================================================================
# service type private unpriv chroot wakeup maxproc command + args
# (yes) (yes) (yes) (never) (100)
# ==========================================================================
127.0.0.1:10025 inet n - n - - smtpd
-o content_filter=
-o smtpd_delay_reject=no
-o smtpd_client_restrictions=permit_mynetworks,reject
-o smtpd_helo_restrictions=
-o smtpd_sender_restrictions=
-o smtpd_recipient_restrictions=permit_mynetworks,reject
-o smtpd_data_restrictions=reject_unauth_pipelining
-o smtpd_end_of_data_restrictions=
-o smtpd_restriction_classes=
-o mynetworks=127.0.0.0/8
-o smtpd_error_sleep_time=0
-o smtpd_soft_error_limit=1001
-o smtpd_hard_error_limit=1000
-o smtpd_client_connection_count_limit=0
-o smtpd_client_connection_rate_limit=0
-o receive_override_options=no_header_body_checks,no_unknown_recipient_checks,no_milters,no_address_mappings
-o local_header_rewrite_clients=
-o smtpd_milters=
-o local_recipient_maps=
-o relay_recipient_maps=
</pre>
Az első azon szolgáltatás, ami átadja a leveleket az Amavis-nak. A neve fontos, mert majd ezzel kell rá hivatkozni a main.cf-ben.
A második szolgáltatás fogadja az Amavis-től visszaérkező leveleket. Az itt felsorolt paraméterek mind felülírják a main.cf-ben felsorolt értékeket.
 
 
A main.cf végére pedig be kell állítani, hogy a leveleket adja
<pre>
###########################
# AMAVIS
###########################
content_filter = amavisfeed:[127.0.0.1]:10024
</pre>
 
 
==Üzenet hozzárakása a kimenő levelekhez (disclaimer)==
 
Vagy a kimenő vagy a bejövő levelekhez hozzá lehet csapni egy üzenetet, amennyiben a levelet tisztának találta az Amavis. Egyszerre mind két irányban nekem nem sikerült.
Az alábbi a kimenő levelekhez csapja hozzá az üzenetet.
Ezt az altermime program segítségével tesszük meg, ami az emailek manipulálását teszi lehetővé. Ehhez elsőként meg kell mondani az amaivis-nak hogy hol van az altermime, majd meg kell adni a két üzenet fájlt. Egy sima szöveges és egy html-es változatot. Az amavis a sima szöveges levelekhez a txt-s fájlt fogja hozzácsapni, míg a html üzenetekhez a html fájlt. A karakter kódolást nem tudom hogy lehet állítani, ezért ékezetek nélkül írtam.
<pre>
$altermime = '/usr/bin/altermime';
 
@altermime_args_disclaimer =
qw(--verbose --disclaimer=/var/spool/amavisd/disclaimer.txt \
--disclaimer-html=/var/spool/amavisd/disclaimer.html);
$defang_maps_by_ccat{+CC_CLEAN} = [ 'disclaimer' ];
 
$allow_disclaimers = 1;
</pre>
 
Ezen felül az összes policy_bank belsejébe kapcsoljuk be disclaimer küldést.
<pre>
$policy_bank{....} = {
...
allow_disclaimers => 1,
...
}
</pre>
 
 
==Értesítések lokalizációja==
Ha az email vírusos volt, vagy tiltott csatolmányt tartalmazott, akkor az amaivs a küldőnek és a címzettnek értesítést küld. Alapértelmezés szerint ehhez hard kódolt emial templétet használ. Ezeket felül lehet definiálni.
Hozzunk létre egy mappát a /etc/amaivsd/ alatt hu_HU néven. Ebben kötelezően el kell helyezni az alábbi fájlokat:
 
* /etc/amavisd/hu_HU/charset
* /etc/amavisd/hu_HU/template-dsn.txt
* /etc/amavisd/hu_HU/template-spam-admin.txt
* /etc/amavisd/hu_HU/template-spam-sender.txt
* /etc/amavisd/hu_HU/template-virus-admin.txt
* /etc/amavisd/hu_HU/template-virus-recipient.txt
* /etc/amavisd/hu_HU/template-virus-sender.txt
 
Ezek letölthetők angolul több változatban is, bár nem túl egyszerű megtalálni őket. A legfontosabb a charset fájl. Itt meg kell mondani, hogy milyen karakter kódolású fájlokat használunk:
<pre>
/etc/amavisd/hu_HU/charset
utf-8
ignored lines after first one
</pre>
 
Az amavisd.conf végére, az 1-es elé írjuk oda:
<pre>
read_l10n_templates('/etc/amavisd/hu_HU');
 
 
1; # insure a defined return value
</pre>
 
A templét fájlokból két fontos van számunkra, csak ezeket kell lefordítani:
 
* /etc/amavisd/hu_HU/template-virus-recipient.txt
* /etc/amavisd/hu_HU/template-virus-sender.txt
 
A nevükkel ellentétben, ezeket nem csak vírusos üzenetek esetében használja. Ugyan ezt a templétet használja a szabálytalan header, a tiltott csatolmány, a spam és a vírusos üzenetek küldőjének és címzettjének értesítésére.
Az Amaivs-2.9-es verziója már nem tud értesítést küldeni a vírus feladójának, a '''$ warnvirussender = 1''' paramétert nem viszi már figyelembe.
 
=Tesztelés=
 
Ha már működik az alap rendszer, teszteljük le a rendszert.
 
== Spam szűrés tesztelése ==
Küldeni fogunk a parancssorból egy SPAM üzenetet a szervernek, és meg fogjuk nézni, hogyan fogja feldolgozni.
 
Töltsük le a spam-eket tartalmazó email-eket innen: [[File:Spam_teszt_levelek.tar]]
 
Mindig kell címzett. Vagy implicit megadjuk:
<pre>
# sendmail adam@berki2.org < spam1.eml
</pre>
 
vagy megmondjuk, hogy szedje ki a levélből.
 
<pre>
# sendmail -t < spam1.eml
</pre>
 
Nézzük meg a /var/log/maillog-ban az üzenet feldolgozását:
<pre>
Sep 26 20:56:28 centostest amavis[1505]: (01505-02) Blocked SPAM {RejectedInternal,Quarantined}, ORIGINATING LOCAL [127.0.0.1] [59.99.75.77] <system@berki.org> -> <adam@berki2.org>, quarantine: system@berki2.org, Message-ID: <668816996730456862921563@mail2love.com>, mail_id: vbdsjBOkRG4a, Hits: 27.535, size: 2539, 2035 ms
</pre>
 
A rendszerünk úgy van beállítva, hogy a spam üzeneteket ne a karantén mappába másolja, hanem küldje el a system user-nek. Most vizsgáljuk meg az email header-jét:
<pre>
X-Quarantine-ID: <WlQeNLMXlflo>
X-Spam-Flag: YES
X-Spam-Score: 29.093
X-Spam-Level: *****************************
X-Spam-Status: Yes, score=29.093 tag=2 tag2=6.2 kill=6.9
tests=[DATE_IN_FUTURE_03_06=2.426, DIGEST_MULTIPLE=0.001,
FREEMAIL_FROM=0.001, HTML_MESSAGE=0.001, PYZOR_CHECK=1.985,
RAZOR2_CF_RANGE_51_100=0.365, RAZOR2_CF_RANGE_E8_51_100=2.43,
RAZOR2_CHECK=1.729, RCVD_IN_BRBL_LASTEXT=1.644, RCVD_IN_PBL=3.558,
RCVD_IN_PSBL=2.7, RCVD_IN_SBL_CSS=3.558, RCVD_IN_XBL=0.724,
RDNS_NONE=1.274, URIBL_ABUSE_SURBL=1.948, URI_WP_DIRINDEX=2.996,
URI_WP_HACKED_2=1.753] autolearn=unavailable
</pre>
 
Ezeket a mezőket az email kliensek tudják értelmezni.