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 ;-).

  • Konfigurácia postfixu:
  • /etc/postfix/main.cf:
    command_directory=/usr/sbin
    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
    V súbore master.cf si skontrolujeme, resp. pridáme nasledovný riadok:
    /etc/postfix/master.cf:
    cyrus unix – n n – – pipe
    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..

  • Konfigurácia procmailu:
  • 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

  • Konfigurácia spamassassina:
  • 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ť.

  • Konfigurácia cyrusu:
  • 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).

  • Konfigurácia stunnel-u:
  • /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

  • Konfigurácia apache-ssl:
  • 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

  • Konfigurácia IMP:
  • Podobne nebudem uvádzať celý konfigurák IMP-u.
    /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

    Leave a Reply