Stránok, popisujúcich inštaláciu a konfiguráciu mailservera, je kopa, ale nájsť niekedy riešenie na určitý problém býva dosť ťažké. Ja som na mailový server uprednostnil systém postfix+cyrus z dôvodu dobrej konfigurovateľnosti a bezpečnosti postfixu (podobne aj cyrusu :).
Ja používam výhradne distribúciu Linux/Debian (stable) a preto sa nebudem podrobne zaoberať samotnou inštaláciou jednotlivých balíkov (it’s so easy ;). Samozrejme, ak si potrpíte na najnovšie verzie jednotlivých balíkov, tak si ich môžete stiahnuť z internetu (na ich vyhľadanie skúste použiť www.google.com).
Takže ako MTA použijeme vyššie spomínaný postfix, ako POP3 a IMAP daemon cyrus, POP3S a IMAPS stunnel a pre web rozhranie IMP. Poštu z postfixu spracujeme procmailom a pošleme spamassassinu (kvôli filtrovaniu spamu). Inštalácia IMP-u vyžaduje balík horde, PHP4, MySQL, apache-ssl (resp. apache, ale my uprednostníme apache-ssl ;-).
daemon_directory=/usr/lib/postfix
program_directory=/usr/lib/postfix
smtpd_banner=$myhostname ESMTP $mail_name
setgid_group = postdrop
biff = no
append_dot_mydomain=no
myhostname=mail.mojadomena.sk
mydomain=mojadomena.sk
alias_maps=hash:/etc/aliases
alias_database=hash:/etc/aliases
myorigin=/etc/mailname
mydestination=localhost, mojadomena.sk, mail.mojadomena.sk
mynetworks=127.0.0.0/8,158.195.1.0/24 #nastavíme vlastnú sieť 😉
relay_domains=$mydestination, $mynetworks
mailbox_command=procmail -a “$EXTENSION”
mailbox_size_limit = 0
recipient_delimiter=+
mailbox_transport=cyrus #doručovať maily bude samotný cyrus (toto však spravíme cez procmail kvôli spamassassinu)
virtual_maps=hash:/etc/postfix/virtual #nastavíme cestu, kde sa budú nachádzať naše virtuálne domény
transport_maps=hash:/etc/postfix/transport #ak budeme mať klientov, ktorý budú mať vlastný mailový server a náš bude plniť iba úlohu záložného servera
header_checks=pcre:/etc/postfix/header_checks #budeme kontrolovať príjemcov, resp. samotných adresátov
body_checks=regexp:/etc/postfix/body_checks
#kontrola tela mailov (ich príloh)
maps_rbl_domains=relays.ordb.org
smtpd_client_restrictions=reject_maps_rbl
/etc/postfix/master.cf:
flags=R user=cyrus argv=/usr/bin/procmail -p /etc/procmailrc EXTENSION=${extension} USER=${user}
/etc/postfix/virtual:
#
# Virtuálne domény
#
mojadomena.sk VIRTUAL
virtualnadomena1.sk VIRTUAL
virtualnadomena2.sk VIRTUAL
#
# Emailové kontá
#
#
# doména mojadomena.sk
#
peter@mojadomena.sk peter
lucia@mojadomena.sk lucia
#
# doména virtualnadomena1.sk
#
michal@virtualnadomena1.sk michal
peter@virtualnadomena1.sk peter2
obaja@virtualnadomena1.sk michal peter2
jan@virtualnadomena1.sk jan@pobox.sk
#
# doména virtualnadomena2.sk
#
peter@virtualnadomena2.sk peter
peter.demo@virtualnadomena2.sk demo
/etc/postfix/transport:
domenazakaznika.sk smtp:mail.domenazakaznika.sk
domenazakaznika2.sk smtp:192.145.32.23
/etc/postfix/header_checks:
/^From: .*@mail-gerant\.com/ REJECT
/^To: .*@mail-gerant\.com/ REJECT Domena mail-gerant.com je blokovana!
Nastavenie spôsobí odmietnutie všetkých emailov pre/z doménu/domény mail-gerant.com. Ak sa za REJECT nenachádza text, email bude odmietnutý bez akéhokoľvek upozornenia. Ďalšie možnosti sú: IGNORE (vymaže header z emailu), WARN (zapíše do logu header s upozornením).
/etc/postfix/body_checks:
/^(content.*[[:space:]]+|[[:space:]]*)(filename|name)= “.*\.(scr|pif|exe|com|bat|shs|shb|vxd|rm|chm|vbs|ini|cmd|do|hta|xl|reg|lnk|js|jse)”/ REJECT Vas e-mail bol zrejme nainfikovany virusom, alebo obsahoval nepovolene subory a preto nebol doruceny. (Your e-mail appears to be infected by a virus or contains illegal files and therefore it has not been delivered.)
Odfiltrujeme z emailov všetky súbory s príponami .scr, .pif, .exe, .com… Po úpravách /etc/postfix/virtual (resp. transport) musíme danú table aktualizovať:
root# postmap /etc/postfix/virtual
root# /etc/init.d/postfix reload
Po úpravách /etc/aliases použijeme:
root# postalias /etc/aliases
root# /etc/init.d/postfix reload
Po úpravách /etc/postfix/header_checks (resp. body_checks) stačí reloadnúť postfix..
Cez procmail budeme posielať emaily spamassassinu. V adresári /var/spool/cyrus/ si vytvoríme adresár log s právami 750 a vlastníkom cyrus:mail. Adresár bude slúžiť na logy o doručení emailov jednotlivým užívateľom.
/etc/procmailrc:
HOME=/var/spool/cyrus
DELIVERMAIL=/usr/sbin/cyrdeliver
LOGFILE=/var/spool/cyrus/log/$USER.log #logovanie doručovania emailov jednotlivým užívateľom
:0fw
| /usr/bin/spamc | $DELIVERMAIL -e $USER
:0
/dev/null
Postačí nám prednastavená konfigurácia, kto sa chce ale vyhrať, medze sa nekladú 😉
V /etc/default/spamassassin zmeníme ENABLED=0 na ENABLED=1, OPTIONS=”-c” zmeníme na OPTIONS=”-F 0 -x” a spustíme samotného spamassassina: /etc/init.d/spamassassin start.
V adresári /var/spool/cyrus si vytvoríme adresár .spamassassin, do ktorého si skopírujeme súbor /etc/spamassassin/user_prefs.template pod názvom user_prefs: /var/spool/cyrus/.spamassassin/user_prefs. V ňom si môžeme definovať vlastné pravidlá na kontrolu spamu. Vlastníkom spomínaného adresára a súboru bude cyrus:mail.
Štandardne nastavený spamassassin bude do poľa Subject u emailov, ktoré spĺňajú podmienky spamu, pridávať na začiatok reťazec *****SPAM*****. Samozrejme si môžeme nastaviť pravidlo, ktorým sa dané emaily budú automaticky mazať.
Cyrus sa spúšťa cez inetd, resp. xinetd.
Po úpravách /etc/imapd.conf daný daemon reštartneme.
/etc/xinetd.conf:
service imap2
{
flags = NAMEINARGS
socket_type = stream
protocol = tcp
wait = no
user = cyrus
server = /usr/sbin/tcpd
server_args = /usr/sbin/imapd
}
service pop3
{
flags = NAMEINARGS
socket_type = stream
protocol = tcp
wait = no
user = cyrus
server = /usr/sbin/tcpd
server_args = /usr/sbin/pop3d
}
/etc/imapd.conf:
configdirectory: /var/lib/cyrus
defaultpartition: default
partition-default: /var/spool/cyrus/mail/domains/mojadomena.sk
partition-mojadomena: /var/spool/cyrus/mail/domains/mojadomena.sk
partition-zakaznik1: /var/spool/cyrus/mail/domains/virtualnadomena1.sk
partition-zakaznik2: /var/spool/cyrus/mail/domains/virtualnadomena2.sk
partition-news: /var/spool/cyrus/news
newsspool: /var/spool/news
admins: root, cyrus
allowanonymouslogin: no
popminpoll: 0 #nastavením na číslo väčšie ako 0 obmedzíme prístup medzi dvomi sťahovaniami POP na daný počet minút
umask: 077
quotawarn: 90 #užívateľ bude upozornený po prekročení 90% veľkosti mailboxu
poptimeout: 20
defaultacl: anyone lrs
Úprava samotného imapd.conf samozrejme nestačí, ešte musíme pridať samotných užívateľov:
root# cyradm -user root localhost
localhost password: ******
localhost> help
createmailbox, cm create a mailbox
deleteaclmailbox, dam delete an ACL on a mailbox
deletemailbox, dm delete a mailbox
help get help on commands
listaclmailbox, lam list the ACL on a mailbox
listmailbox, lm list mailboxes
listquota, lq list quota on root
listquotaroot, lqr, lqm list quota roots on mailbox
quit exit program
renamemailbox, renm rename a mailbox
setaclmailbox, sam set an ACL on a mailbox
setquota, sq set quota limits
localhost> cm user.peter mojadomena
localhost> sq user.peter 50000 #50MB quota
localhost> cm user.lucia mojadomena
localhost> sq user.lucia 10000
localhost> cm user.michal zakaznik1
localhost> sq user.michal 20000
localhost> cm user.peter2 zakaznik1
localhost> sq user.peter2 20000
localhost> cm user.demo zakaznik2
localhost> sq user.demo 20000
localhost> quit
Daných užívateľov pridáme aj do POP accounts (napr. cez userconf).
/etc/stunnel.conf:
VERIFY 1
SERVERCERT /etc/ssl/certs/stunnel.pem #poprípade si vytvoríme vlastný certifikát (viď nižšie)
ADDLOPTS -s nobody -g nogroup #stunnel spúšťame pod užívateľom nobody a skupinou nogroup
TUNNEL pop3s -r pop-3
TUNNEL imaps -r imap2
Vytvorenie vlastného certifikátu:
root# cd /etc/ssl/certs/
root# openssl req -new -x509 -nodes -config /usr/share/doc/stunnel/examples/stunnel.cnf -days 365 -out stunnel.pem -keyout stunnel.pem
root# chmod 600 stunnel.pem
root# dd if=/dev/random of=temp_file count=2
root# openssl dhparam -rand temp_file 512 >> stunnel.pem
root# ln -sf stunnel.pem `openssl x509 -noout -hash < stunnel.pem`.0
Nebudem uvádzať celý konfigurák httpd.conf, dôležité sú hlavne nasledovné 2 riadky:
/etc/apache-ssl/httpd.conf:
LoadModule php4_module /usr/lib/apache/1.3/libphp4.so
AddType application/x-httpd-php .php .php3
Prvým zabezpečíme nahratie modulu pre podporu PHP4, druhým korektné zobrazenie stránky (IMP je písaný v PHP3 a my máme PHP4 😉
Ešte si vytvoríme SSL certifikát (platný 365 dní):
root# ssl-certificate -days 365
Vyplníme údaje, ako skratku krajiny, jej meno, lokalitu, meno organizácie, meno servera, email
/etc/imp/defaults.php3:
$default->server = ‘mojadomena.sk’;
$default->from_server = ‘mojadomena.sk’;
$default->port = 143; #resp. 110
$default->servtype = ‘imap’; #resp. pop3
$default->folders = ”;
$default->personal_folders = ‘INBOX.’;
Reštartneme inetd/xinetd.
Ešte si nastavíme firewall. Použijeme upravený Wilderkov konfiguračný skript na IPTables:
#!/bin/sh
IPTABLES=”/sbin/iptables”
INIT_IPTABLES=”/etc/init.d/iptables”modprobe ip_conntrack_ftp
modprobe ip_nat_ftp#echo “1” > /proc/sys/net/ipv4/ip_forward
# zmazame obsah vsetkych chainsov
$IPTABLES -F -t nat
$IPTABLES -F
# zmazame jednotlive chainsy
$IPTABLES -X
# nastavime default POLICY pre incoming packety na DROP
$IPTABLES -P INPUT DROP
$IPTABLES -P FORWARD DROP$IPTABLES -N icmp_packets
$IPTABLES -N tcp_packets_ext
$IPTABLES -N udpincoming_packets
echo Starting IPTables…
$IPTABLES -N allowed
# povolime len novovytvorene spojenia (SYN), uz vytvorene
# (ESTABLISHED) a suvisiace s vytvorenymi (RELATED, ftp-data napr.)
$IPTABLES -A allowed -p TCP –syn -j ACCEPT
$IPTABLES -A allowed -p TCP -m state –state ESTABLISHED,RELATED -j ACCEPT
# zvysne TCP spojenia dropneme (vecicka koli portscannom)
$IPTABLES -A allowed -p TCP -j DROP
# Povolime Echo reply, Destinantion Unreachable, Redirect, Echo a Time Exceeded
$IPTABLES -A icmp_packets -p ICMP -s 0/0 –icmp-type 0 -j ACCEPT
$IPTABLES -A icmp_packets -p ICMP -s 0/0 –icmp-type 3 -j ACCEPT
$IPTABLES -A icmp_packets -p ICMP -s 0/0 –icmp-type 5 -j ACCEPT
$IPTABLES -A icmp_packets -p ICMP -s 0/0 –icmp-type 8 -j ACCEPT
$IPTABLES -A icmp_packets -p ICMP -s 0/0 –icmp-type 11 -j ACCEPT
# povolime TCP connect na SSH a SMTP (pre vonkajsi interfejs)
$IPTABLES -A tcp_packets_ext -p TCP -s 0/0 -m multiport –dport 22,25,110,143,443,993,995 -j allowed #Povolíme porty 110(POP3), 143(IMAP), 443(https), 993(IMAPS), 995(POP3S). V podstate môžeme porty pre POP3 a IMAP zakázať a užívateľom ostanú povolené iba bezpečné POP3S a IMAPS.
# povolime UDP reply z DNS serverov (nutne koli resolvovaniu)
$IPTABLES -A udpincoming_packets -p UDP -s 0/0 –source-port 53 -j ACCEPT
# pridame politiku icmp_packets, tcp_packets, udpincoming_packets
$IPTABLES -A INPUT -p ICMP -j icmp_packets
$IPTABLES -A INPUT -p UDP -j udpincoming_packets
$IPTABLES -A INPUT -p TCP -j tcp_packets_ext
# povolime lokalne spojenie
$IPTABLES -A INPUT -i lo -j ACCEPT
# inak povolime uz vytvorene spojenia (ESTABLISHED) a suvisiace s vytvorenymi
$IPTABLES -A INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT
# a pretoze sme slusni, tak odpovieme icmp-port-unreachable
$IPTABLES -A INPUT -p TCP –syn -j REJECT
$IPTABLES -A INPUT -j DROP
echo done.
$INIT_IPTABLES save active #v prípade inej distribúcie Linuxu ako je Debian, tento riadok zakomentujeme
Tak a mailserver máme spravený! ;-D
Special thanks to: R0B0