Procedura instalacji serwera pocztowego qmail

Zalety konfiguracji

Używany zestaw

Testowane na qmail 1.03-38 (z paczki src debiana), simscan 1.2, vpopmail 5.4.13, qmail-smtpd-auth 0.5.7. Inne wersje mogą dawać jakieś konflikty (np. simscan 1.2 z K.Dąbrowski smtp-auth patch)

Uwaga: aktualny qmail-maildir++.patch jest zepsuty dla aktualnego qmaila. Należy wywalić stamtąd definicję puts i zastąpić wszędzie pisanie na stdout przez substdio_puts(&ssout,"…"); w qmail-pop3d.c. Ta zmiana jest wystarczająca, nie ma potrzeby zmieniać put(…)

Procedura instalowania

(w debianie qmail-src jest w repozytorium non-free, więc należy mieć je dopisane)

  1. apt-get install checkinstall openssl expect zlib1g-dev
    
    apt-get install clamav clamav-base clamav-daemon clamav-freshclam
            # lub ze źródełek clamav (./configure bez opcji)
            # useradd clamav, group clamav
    apt-get install spamassassin spamc libnet-dns-perl libpcre3-dev
    apt-get install dcc-client dcc-common
    
  2. apt-get install ucspi-tcp-src
  3. apt-get install qmail-src
  4. build-ucspi-tcp (tcprules, tcpserver, rblsmtpd)
  5. build-qmail
    • te łaty mamy od razu z debiana:
      • netscape-progress - Fixes compatibility bug in POP3 daemon
      • pop3-supplementarygroups - Update to checkpasswd to allow multiple groups
      • qmail-link-sync - Filesystem performance patch
      • qmailqueue - Allows use of external qmail-queue programs
      • qregex - Allows use of regular expressions for anti-relay / spam control
      • errno - Fixes glibc compatibility error
      • qmail_local - Fixes memory corruption in certain .qmail files
    • Zamiast poniższych trzech łat można użyć: mój qmail patchset (smtp auth 0.5.7 + custom error + chkuser 2.0 + mini poprawki). Mam też taki sam mój patchset ale z qmail-maildir++ (bardziej eksperymentalny).
      Uwaga2: łata chkuser wymaga plików nagłówkowych od vpopmaila… więc może być konieczność dwókrotnej instalacji: najpierw (niestarannie) surowego qmaila i vpopmaila, a potem zapatchowane.
    • SMTP AUTH.
      UWAGA: Aby używać uwierzytelniania CRAM-MD5 z vpopmailem, trzeba hasła w vpopmailu trzymać niezadokowane (aby można było obliczyć skróty do CRAM-MD5). Tak samo z APOP. Ponadto w vpopmail nie może być skompilowany z disable-clear-passwd
      Jedna z dwóch łat do SMTP AUTH:
      1. Napisany na bazie łaty K.Dąbrowskiego, aktualniejszy, poprawiony
        http://www.fehcom.de/qmail/smtpauth.html (qmail-smtpd-auth-0.5.7)
        • rozpakować do katalogu z qmailem
        • ./install_auth.sh
        • poprawić konflikty w Makefile i qmail-smtpd.c
        • poprawić wywołania die_nomem() w mailfrom_parms() w qmail-smtpd.c, jeśli autor jeszcze tego nie zrobił
        • wyłączyć CRAM-MD5 w qmail-smtpd.c
      2. nie używać raczej: K.Dąbrowski qmail-smtpd-auth qmail-smtpd-auth
        • poprawić konflikty w Makefile i qmail-smtpd.c
    • dołożyć qmail-queue-custom-error z simscana (ewentualnie)
      poprawić konflikt w qmail.c
    • tutaj dorzucić chkuser chkuser 2.0
      • do skompilowaniu z chkuser trzeba wcześnie już mieć zainstalownego w systemie vpopmaila
        • instalacja vpopmaila wymaga zainstalowanego qmaila
          więc trzeba instalować w dwóch przebiegach. najpierw bez chkuser
      • nałożyć netqmail-1.05_chkuser-2.0.8.patch
      • poprawić konflikty w Makefile i qmail-smtpd.c
      • ustawić parametry chkuser_settings.h (domyślne ok, ale jest sporo ważnych)
        • wyłączyć quotę, dopóki jest zepsuta w vpopmailu.
        • ja ustawiam:
          #define CHKUSER_ENABLE_UIDGID
          #define CHKUSER_ERROR_DELAY 500
          // #define CHKUSER_MBXQUOTA_VARIABLE “CHKUSER_MBXQUOTA”
    • tutaj można by dorzucić qmail-maildir++.patch z contrib/ z vpopmaila.
      Poprawi to egzekwowanie kwot (aliasy) i doda aktualizaowanie kwot do qmail-pop3d. courier-imapd robi to samoczynnie
    • skompilować, zainstalować paczkę
    • uruchomić /usr/lib/qmail/qmailconfig
      To ustawi:
      • me, defaultdomain, plusdomain, locals, rcpthosts
    • sprawdzić /var/qmail/control :
      • concurrencyremote 2
      • databytes 10000000
      • defaultdomain
      • locals
      • me
      • plusdomain
      • rcpthosts
      • virtualdomains
    • cd /etc ; tcprules tcp.smtp.cdb `mktemp` < tcp.smtp ; chmod
      644 tcp.smtp.cdb`127.0.0.1:allow,RELAYCLIENT=""
      192.168:allow,RELAYCLIENT=""
      1.2.3.4:allow,RELAYCLIENT=""
      :allow
      przy vpopmailu /etc/tcp.smtp* i tak nie będą mogły być używane (vpopmail chce tworzyć pliki tymczasowe w /etc, więc musiałby mieć +w w /etc)
  6. ściągnąć vpopmaila
    • czytać install.txt
    • dodać konto i grupę vchkpw:
      groupadd -g 89 vchkpw
      useradd -g vchkpw -u 89 vpopmail -s /bin/false -d /home/vpopmail
    • mv /etc/tcp.smtp* ~ [ważne, aby configure nie znalazło tcp.smtp w /etc]
    • configure
      domainquotas to kwoty per całe domeny (nie per user). są obecnie zepsute.
      podanie –disable-clear-passwd spowoduje, że nie będzie działać APOP w qmail-popup
    • ./configure
      –enable-roaming-users
      –enable-relay-clear-minutes=60
      –disable-clear-passwd
      # –enable-tcpserver-file=~vpopmail/etc/tcp.smtp
      # –enable-domainquotas (szkoda nie przejdzie, obecnie “code is broken”)
      # –enable-default-domain= (teraz ~vpopmail/etc/defaultdomain)
      # –disable-spamassassin (dla nowego vpopmaila: kierujemy do spamassassina przez simscana)
    • make
    • checkinstall make install-strip
    • mv ~/tcp.smtp* ~vpopmail/etc/
    • cd ~vpopmail/etc/; tcprules tcp.smtp.cdb `mktemp` < tcp.smtp ; chmod 644 tcp.smtp.cdb
    • echo glowna.domena > defaultdomain
    • można dać uprawnienia:
      drwxr-x--- 8 vpopmail vchkpw 4096 Sep 13 2005 /home/vpopmail/
    • vadddomain glowna.domena
    • vadduser itd
  7. tutaj można powrócić do punktu 5 i dołożyć chkuser
  8. qmhandle
  9. ripmime
  10. simscan
    UWAGA:
    simscan-1.2 psuł mi się z (KD) qmail-smtpd-auth. kawalek logu szedł na deskryptor gniazda klienta zamiast do pliku i psuł protokół bylo tak tylko przy bezpiecznym uwierzytelnianiu (tylko OE nie mógł odbierać poczty). powinienem używać 1.1, aby było ok.
    BYĆ MOŻE używanie opcji –enable-spam-auth-user=y w simscan by to naprawiło
    • useradd -g clamav -s /bin/false -d /var/qmail/simscan simscan

    • ./configure –enable-clamav
      –enable-spam \ –enable-custom-smtp-reject \ # jeśli założyliśmy łatę z simscana na qmaila
      –enable-spam-auth-user=y \ # skanować także z relayowanych adresów
      –enable-per-domain \ –enable-attach \ –enable-ripmime \ –enable-spam-hits \ –enable-received \ –enable-regex \ –enable-quarantinedir \ –enable-spam-passthru

    • powinien być następujący output:

      Current settings
      -————————————–
      user = simscan
      qmail directory = /var/qmail
      work directory = /var/qmail/simscan
      control directory = /var/qmail/control
      qmail queue program = /var/qmail/bin/qmail-queue
      clamdscan program = /usr/bin/clamdscan
      clamav scan = ON
      trophie scanning = OFF
      attachement scan = ON
      ripmime program = /usr/local/bin/ripmime
      custom smtp reject = ON
      drop message = OFF
      regex scanner = ON
      quarantine processing = ON
      quarantine directory = /var/qmail/quarantine
      domain based checking = ON
      add received header = ON
      spam scanning = ON
      spamc program = /usr/bin/spamc
      spamc arguments =
      spamc user = OFF
      authenticated users scanned = ON
      spam passthru = ON
      spam hits = 10.0

    • make

    • checkinstall make install-strip

    • /var/qmail/control/simcontrol
      :clam=yes,spam=yes,spam_hits=8.5,spam_passthru=yes,attach=.scr:.bat:.com:.pif:.exe

    • simscanmk -g - wygenerowanie pliku z wersjami

    • Do testowania:
      `QMAILQUEUE=/var/qmail/bin/simscan SIMSCAN_DEBUG=3 qmail-inject
      rob@test.com < rob/spam1

      QMAILQUEUE=/var/qmail/bin/simscan SIMSCAN_DEBUG=3 strace -s 512
      -fvvv -o log.txt qmail-inject rob@test.com < mail `

    • BARDZO WAŻNE - najczęstsza przyczyna nie działania: clamdscan musi móc odczytywać pliki tworzone przez simscana w podkatalogach /var/qmail/simscan. Często sprawę psuje umask. można np

      chown simscan.simscan /var/qmail/simscan
      chmod 2750 /var/qmail/simscan
      clamav do grupy simscan

      albo

      usermod -g clamav simscan
      # i zrobić:
      drwxr-x— 5 simscan clamav 192 Aug 24 00:01 /var/qmail/simscan
      -rwx–s–x 1 simscan clamav 27236 Aug 23 23:35 /usr/sbin/simscan

    • umask. ustawienie umask w init.d/qmail nie skutkuje, bo często powłoka, pośrednicząc, będzie je zmieniać. Można zrobić tak (brudny hack, ale skuteczny – obejście kwestii umask) simscan-wrapper.c:

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>

int main() {
   umask(0027);
   execl("/var/qmail/bin/simscan", "simscan", (char*)NULL);
}
  1. vim /etc/init.d/qmail
  1. do crontaba:
17 */2 * * * /home/vpopmail/bin/clearopensmtp 2>&1 > /dev/null
39 */6 * * * /usr/local/bin/freshclam 2>&1 > /dev/null
13 6 * * * find /var/qmail/quarantine/ -type f -print0 | xargs -0 -n 3 rm
  1. ewentualnie dodać można greylisting - cqgreylist: cqGreylist.
    Implementacja napisana w C, bardzo szybka, w zasadzie lite-Greylisting (tylko po adresie IP).
    Uwaga: greylisting spowalnia dochodzenie maili (kikana(naście) minut-godzin) lub od niektórych (lichych) serwerów może nie dochodzić.

    • dostosować cqgreylist.c:

            /* RFC 2821 specifies the timeout for
            recieving a command to at least 5 mins */
            #define TIMEOUT 300
            /* specify the greylisting time in which to not accept mail from
            a sender */
            #define GREY_SECONDS 60
      
            char* hostname = "serwer.exapmle.org";
            char* message = "you are greylisted try again";
            char* base_directory = "/var/qmail/cqgreylist/";
      
    • make

    • cp cqgreylist /var/qmail/bin

    • chown 0:vchkpw /var/qmail/bin/cqgreylist

    • chmod 750 /var/qmail/bin/cqgreylist

    • mkdir /var/qmail/cqgreylist

    • chown vpopmail /var/qmail/cqgreylist

    • poprawić init.d/qmail (dodane tylko opakowanie qmail-smtpd przez cqgreylist):

            sh -c "start-stop-daemon --start --quiet
               --user qmaild \
               --pidfile /var/run/tcpserver_smtpd.pid --make-pidfile \
               --exec /usr/bin/tcpserver -- -R -H \
               -u `id -u vpopmail` -g `id -g vpopmail` -x
            ~vpopmail/etc/tcp.smtp.cdb 0 smtp \
               $rblsmtpd /var/qmail/bin/cqgreylist \
               /usr/sbin/qmail-smtpd /home/vpopmail/bin/vchkpw /bin/true 2>&1 \
               | $logger &"
      
    • dodać do crontaba:

            23 * * * * find /var/qmail/cqgreylist -mtime +1 -type f -exec rm -f {} \;
      
    • ustawić whitelist dla greylistingu.
      RELAYCLIENT jest nadrzędne w stosunku do WHITELISTED. do ~vpopmail/etc/tcp.smtp dodajemy

            whitelist:`64.124.204.39:allow,WHITELISTED=""
            64.125.132.254:allow,WHITELISTED=""
      
            # cała klasa C:
            66.94.237:allow,WHITELISTED=""
      
            # ... itd
      

      Adresy to whitelisty można wziąć np. stąd: whitelist_ip.txt
      Trzeba dodać yahoo, gmail, wp, onet itp

  2. courier-authlib

    ./configure --without-authpam --without-authldap --without-authpwd
      --without-authshadow --without-authpgsql --without-authmysql \
      --without-authcustom --with-authvchkpw
  1. courier-imap (niezły jest też binc-imap i powinien działać ok z vchkpw)
    • configure
      configure --enable-workarounds-for-imap-client-bugs

    • make

    • su

    • umask 22

    • checkinstall –inspect

    • make install-configure

    • /usr/lib/courier-imap/share/mkimapdcert

    •       chgrp vchkpw /usr/lib/courier-imap
            chmod 710 /usr/lib/courier-imap
            chmod og+rX /usr/lib/courier-imap
            chmod 711 /usr/local/var /usr/local/var/spool
            chgrp vchkpw /usr/local/var/spool/authdaemon
      
    • /usr/local/sbin/authdaemond start && echo ok ; /usr/lib/courier-imap/libexec/imapd.rc start && echo ok

  2. stunnel
    • configure (bez arg)

    • make && checkinstall

    • stunnel.conf:

            cert = /usr/local/etc/stunnel/server.crt
            key = /usr/local/etc/stunnel/server.key
            chroot = /srv/stunnel ; tylko umozliwic zapisanie pidfile
            setuid = stunnel
            setgid = stunnel
            pid = /tmp/stunnel.pid
            [pop3s]
            accept = 995
            connect = nasz.serwer.example.org:110
      
            [imaps]
            accept = 993
            connect = nasz.serwer.example.org:143
      
            [ssmtp]
            accept = 465
            connect = nasz.serwer.example.org:25
      

SpamAssassin:
Razora lepiej nie używać, bo jest fatalna łączność z serwerami razora (cloudmark)
Z pyzorem nie lepiej

clamav conf

# Example
LogFile /var/log/clamd.log
LogFileMaxSize 30M
TemporaryDirectory /tmp
MaxDirectoryRecursion 15
User clamav
AllowSupplementaryGroups   # bardzo ważne do współpracy z simscanem
ScanPE
ScanOLE2
ScanMail
ScanHTML
ScanArchive
ArchiveMaxRecursion 5

freshclam conf

# Example
AllowSupplementaryGroups
NotifyClamd

SpamAssassin

/etc/default/spamassassin

ENABLED=1
OPTIONS="--create-prefs --max-children 4 --helper-home-dir"
PIDFILE="/var/run/spamd.pid"

init.pre

loadplugin Mail::SpamAssassin::Plugin::URIDNSBL
loadplugin Mail::SpamAssassin::Plugin::Hashcash
loadplugin Mail::SpamAssassin::Plugin::SPF

local.cf

rewrite_header Subject *****SPAM*****
blacklist_to jakis@adres.blah

required_score 5.0
trusted_networks 192.168.0.0/16

score USER_IN_BLACKLIST_TO 7.0
score ALL_TRUSTED -15.0

use_bayes               0
auto_learn              0

skip_rbl_checks         0
rbl_timeout             10

use_razor2              0
use_pyzor               0

use_dcc                 0
dcc_timeout             15
dcc_dccifd_path         /var/lib/dcc/dccifd
dcc_home                /var/lib/dcc

ok_languages            en de pl
ok_locales              en

Klasyfikator Bayesowski w SpamAssassinie

use_bayes               1
auto_learn              1
bayes_auto_learn        1

sa-learn --learn --spam spam-mbox
sa-learn --learn --ham  good-mbox

mkdir /var/qmail/simscan/.spamassassin/
chown sinscan:clamav /var/qmail/simscan/.spamassassin/
chmod 700 /var/qmail/simscan/.spamassassin/

su -s /bin/bash - simscan
sa-learn --dump magic

Warunki relayowania poczty

obsługujemy wyłącznie pocztę, która jest:

Testowanie

Sprawdzić czy:

echo-smtp - przydatne do testów

#!/bin/sh

if [ "$3" ]; then
   BODY="$3"
else
   BODY="BLABLALBA\r\nZZZZ\r\n     TEST\r\naaaa"
fi

echo -e \
"HELO submarine.ath.cx\r\n\
MAIL FROM: $1\r\n\
RCPT TO: $2\r\n\
DATA\r\n\
From: $1\r\n\
To: $2\r\n\
Subject: Test `date '+%Y-%m-%d %H:%M'`\r\n\
\r\n\
$BODY\r\n\
.\r\n\
QUIT\r\n\c"

POP3, (E)SMTP

Inne dobre MTA

Postfix

Do standardowej konfiguracji debiana należy dodać w main.cf:

 mailbox_transport = dovecot
 mailbox_command = /usr/lib/dovecot/deliver
 dovecot_destination_recipient_limit = 1
 virtual_mailbox_domains = nasze.org, domeny-example.org
 virtual_transport = dovecot
 virtual_mailbox_maps = hash:/etc/dovecot/passwd
 smtpd_sasl_type = dovecot
 smtpd_sasl_path = private/auth
 smtpd_sasl_auth_enable = yes
 smtpd_recipient_restrictions =
         permit_mynetworks,
         permit_sasl_authenticated,
         reject_unauth_destination,
         reject_unlisted_recipient,
         check_policy_service inet:127.0.0.1:60000
 broken_sasl_auth_clients = yes
 smtp_sasl_security_options = noanonymous

dovecot.conf:

protocols = imap pop3 imaps pop3s
disable_plaintext_auth = no
log_path = /var/log/dovecot.log
mail_location = maildir:~/Maildir
first_valid_uid = 107  # (vmail)
protocol lda {
  postmaster_address = postmaster@example.org
}
auth default {
   mechanisms = plain login
   passdb passwd-file {
     args = /etc/dovecot/passwd
   }
  userdb static {
    args = uid=107 gid=109 home=/srv/mail/%d/%n
  }
  socket listen {
    master {
      path = /var/run/dovecot/auth-master
      mode = 0600
      user = vmail
      group = vmail
    }
    client {
      path = /var/spool/postfix/private/auth
      mode = 0660
      user = postfix
      group = postfix
    }
  }
}

dopisać do master.cf:

dovecot   unix  -       n       n       -       -       pipe
  flags=DRhu user=vmail:vmail argv=/usr/lib/dovecot/deliver -f ${sender} -d ${recipient}

linki