Howto Qmail+checkpassword+Mysql+Spamcontrol+(E)SMTP auth+ucspi+daemontools.

Dott. Emiliano Bruni, info/at/ebruni_dot_it

Ultima modifica: 2004/01/22 23:30

Copyright 2003
Emiliano Bruni

Licenza: GNU Free Document License
(http://www.gnu.org/licenses/fdl.html)

Abstract

Semplice guida che porta, passo dopo passo, all'installazione di Qmail+checkpassword basati su MySQL con applicate le patch per lo Spamcontrol, l'accesso SMTP con autenticazione, oltre all'installazione di Ucspi e dei daemontools. Questa procedura, con eventuali lievi adattamente, è stata testata su RedHat7.x,8.x,9.x e Slackware 9.0

Download dei pacchetti

Potete scaricare i pacchetti ed applicarvi le relative patch, o saltare direttamente al punto 22 scaricando il sorgente con le patch già installate

  1. Download del pacchetto qmail da http://www.qmail.org/

  2. Download patch mysql x qmail (ver 1.1.9) da http://iain.cx/qmail/mysql/download.html

  3. Download SpamControl con (E)SMTP auth da http://www.fehcom.de/qmail/spamcontrol.html

  4. Download Checkpassword 0.90 http://cr.yp.to/checkpwd/install.html

  5. Download pacth per Checkpassword 2.0.1pre2 su http://iain.cx/qmail/mysql/download.html

  6. Download mysqldump da http://iain.cx/qmail/mysql/download.html

  7. Download daemontools  da ftp://cr.yp.to/daemontools/daemontools-0.76.tar.gz)

Applicazione patch a qmail

  1. tar zxvf qmail-1.03.tar.gz

  2. cd qmail-1.03

  3. Installazione patch Spamcontrol
    tar zxvf ../spamcontrol_2073.tgz
    vi spamcontrol.sh e impostare variabile SOLARIS a 0
    ./spamcontrol.sh

  4. Installazione patch qmail-mysql-1.1.9.patch. (Questa e' una versione patchata per essere applicata dopo la patch spamcontrol. Il file che patcha la versione originale per renderla utilizzabile si chiama qmail-mysql-1.1.9.emi.patch)
    cd ..
    patch < ../qmail-mysql-1.1.9.emi.patch
    cd qmail-1.03
    patch < ../qmail-mysql-1.1.9.patch

  5. Correggere un errore in qmail-getpw dove:
    pw = (struct passwd *) malloc(sizeof(struct passwd *));
    sostituire con
    pw = (struct passwd *) malloc(sizeof(struct passwd));

  6. cd ..

  7. per redhat 9 installare le seguenti patch da
    http://www.qmail.org/moni.csi.hu/pub/glibc-2.3.1/qmail-1.03.errno.patch
    http://www.qmail.org/moni.csi.hu/pub/glibc-2.3.1/qmail-1.03.qmail_local.patch
    patch -p1 < /usr/src/qmail/qmail-1.03.errno.patch
    patch -p1 < /usr/src/qmail/qmail-1.03.qmail_local.patch

Installazione patch a checkpassword

  1. tar zvxf checkpassword-0.90.tar.gz; cd checkpassword-0.90

  2. patch < ../checkpassword-mysql-2.0.1pre2.patch

  3. per redhat 9 installare la seguenti patch da
    http://www.qmail.org/moni.csi.hu/pub/glibc-2.3.1/checkpassword-0.90.errno.patch
    patch -p1 < /usr/src/qmail/checkpassword-0.90.errno.patch

Configurazione sorgenti di qmail

  1. Aprire il file conf-qmail e conf-home in qmail-1.03 e inserire la riga /usr/local/qmail

  2. vi Makefile e modificare in questo modo
    MYSQL_LIBS=/usr/lib/mysql/libmysqlclient.a -lm -lz -lcrypt #-lsocket -lnsl
    MYSQL_INCLUDE=-I/usr/include
    LOGGING=#-DO_NOT_LOG_CONNECTS -DO_NOT_LOG
    Dopo la compilazione e il testing ricordarsi di ricompilare con differenti valori di logging.

Configurazione sorgenti di checkpassword

  1. vi conf-qmail e modificare la riga in /usr/local/qmail

  2. vi Makefile e modificare le seguenti riga in questo modo:
    MYSQL_LIBS=/usr/lib/mysql/libmysqlclient.a -lm -lz -lcrypt #-lsocket -lnsl
    MYSQL_INCLUDE=-I/usr/include
    LOGGING=#-DO_NOT_LOG_SQL -DO_NOT_LOG -DO_NOT_LOG_ERRORS
    Dopo la compilazione e il testing ricordarsi di ricompilare con differenti valori di logging.

Download sorgenti con patch già applicate.

  1. Se non volete perdere tempo ad applicare le patch potete scaricare il sorgente qmail con le patch e le configurazioni sopra già applicate da http://www.ebruni.it/docs/qmail_mysql/bin/qmail+mysql+esmtp.tar.gz

  2. Se non volete perdere tempo ad applicare le patch potete scaricare il sorgente di checkpassword con le patch e le configurazioni  già applicate da http://www.ebruni.it/docs/qmail_mysql/bin/checkpassword-0.90+mysql.tar.gz

Installazione di qmail

  1. mkdir /usr/local/qmail

  2. groupadd -g 601 nofiles;groupadd -g 602 qmail

  3. Aggiunta degli utenti necessari
    useradd -g nofiles -d /usr/local/qmail/alias -s /bin/true alias
    useradd -g nofiles -d /usr/local/qmail -s /bin/true qmaild
    useradd -g nofiles -d /usr/local/qmail -s /bin/true qmaill
    useradd -g nofiles -d /usr/local/qmail -s /bin/true qmailp
    useradd -g qmail -d /usr/local/qmail -s /bin/true qmailq
    useradd -g qmail -d /usr/local/qmail -s /bin/true qmailr
    useradd -g qmail -d /usr/local/qmail -s /bin/true qmails

  4. Compilazione del sorgente
    cd /usr/src/qmail/qmail-1.03
    make setup check
    ./config-fast <host.domain>

  5. Configurazione script startup del qmail
    cp /usr/local/qmail/boot/home /usr/local/qmail/rc.qmail
    vi /usr/local/qmail/rc.qmail e modificare ./Mailbox in ./Maildir/

Installazione di checkpassword

  1. Compilazione del sorgente
    cd /usr/src/qmail/checkpassword-0.90
    make setup check

  2. Impostare il checkpassword a 711 con flag suid per il funzionamento con patch di auth
    chmod 711 /usr/local/qmail/bin/checkpassword
    chmod u+s /usr/local/qmail/bin/checkpassword

Installazione UCSPI per filtro sulle connessioni

  1. Installazione ucspi-tcp-0.88-1.i386.rpm
    rpm -ivh ftp://rpmfind.net/linux/contrib/libc6/i386/ucspi-tcp-0.88-1.i386.rpm
    (per redhat 9 questo rpm non va bene. prendere il sorgente, http://www.qmail.org/moni.csi.hu/pub/glibc-2.3.1/ucspi-tcp-0.88-005patch.src.rpm e fare un rebuild
    rpmbuild --rebuild ucspi-tcp-0.88-005patch.src.rpm e poi
    rpm -ivh /usr/src/redhat/RPMS/i386/ucspi-tcp-0.88-005patch.i386.rpm
    )
    se non si ha il supporto rpm si può scaricare il sorgente da
    http://cr.yp.to/ucspi-tcp/ucspi-tcp-0.88.tar.gz
    e installarlo con
    tar zxvf ucspi-tcp-0.88.tar.gz
    cd ucspi-tcp-0.88
    make
    make setup check

  2. mkdir /etc/tcp

  3. Creare file smtp e mettere le regole per le connessioni tcp all'smtp tipo:
    cat >/etc/tcp/smtp <<EOF
    127.0.0.1:allow,RELAYCLIENT=""
    EOF

  4. Compilare le regole in /etc/tcp/smtp con
    tcprules /etc/tcp/smtp.cdb /etc/tcp/smtp.tmp < /etc/tcp/smtp

  5. Creare file pop-3 e mettere le regole per le connessioni tcp al pop3 tipo:
    cat >/etc/tcp/pop-3<<EOF
    :allow
    :deny
    EOF

  6. Compilare le regole in /etc/tcp/pop-3 con
    tcprules /etc/tcp/pop-3.cdb /etc/tcp/pop-3.tmp < /etc/tcp/pop-3

Creazione del database di Qmail

  1. Creazione db "qmail" su mysql
    mysqladmin -p create qmail

  2. Installazione dump del database
    mysql -p qmail < /usr/src/qmail/mysqldump

  3. creazione utente "qmail" con permessi sul database "qmail"
    GRANT USAGE ON *.* TO "qmail"@"localhost" IDENTIFIED BY "qmailpass";
    GRANT SELECT ,INSERT ,UPDATE , DELETE ON `qmail`.* TO "qmail"@"localhost";

    e ricaricare la tabella degli utenti con
    mysqladmin -p reload

  4. creare file /usr/local/qmail/control/sqlserver cosi fatto
    cat >/usr/local/qmail/control/sqlserver<<EOF
    server localhost
    login qmail
    password qmailpass
    db qmail
    EOF

  5. Impostare i permessi al file con
    chmod 644 /usr/local/qmail/control/sqlserver
    chown qmaild.qmail /usr/local/qmail/control/sqlserver

Creazione cartelle di posta elettronica

  1. Creazione e impostazione caselle di posta elettronica
    mkdir /var/spool/pop
    chown qmaild:qmail /var/spool/pop
    chmod 711 /var/spool/pop
    mkdir /var/spool/pop/domains
    chown qmaild:qmail /var/spool/pop/domains
    chmod 711 /var/spool/pop/domains

Installazione daemontools

  1. Installazione daemontools che eseguira e terrà sotto monitoring i processi di qmail

  2. Creazione della directory
    mkdir /usr/local/daemontools
    cd /usr/local/daemontools

  3. per redhat 9 installare la seguente patch:
    http://www.qmail.org/moni.csi.hu/pub/glibc-2.3.1/daemontools-0.76.errno.patch
    patch -p1 < /usr/src/qmail/daemontools-0.76.errno.patch

  4. Installazione del pacchetto
    tar zxvf /usr/src/qmail/daemontools-0.76.tar.gz
    cd admin/daemontools-0.76
    ./package/install

  5. Creazione delle directory per il supervise dei servizi
    mkdir -p /usr/local/qmail/supervise/qmail-send/log
    mkdir -p /usr/local/qmail/supervise/qmail-smtpd/log
    mkdir -p /usr/local/qmail/supervise/qmail-pop3d/log
    mkdir /var/log/qmail
    mkdir /var/log/qmail/smtpd
    mkdir /var/log/qmail/pop3d

  6. Impostazione permessi per i file di log
    chown -R qmaill /var/log/qmail

  7. Creare il file di startup del qmail-send
    cat >/usr/local/qmail/supervise/qmail-send/run <<EOF
    #!/bin/sh
    exec /usr/local/qmail/rc.qmail
    EOF

  8. Creare il file di log per questo servizio
    cat > /usr/local/qmail/supervise/qmail-send/log/run<<EOF
    #!/bin/sh
    exec /usr/local/bin/setuidgid qmaill /usr/local/bin/multilog t \
    s100000 /var/log/qmail
    EOF

  9. Creare il file di start per qmail-smtpd
    cat >/usr/local/qmail/supervise/qmail-smtpd/run<<EOF
    #!/bin/sh
    QMAILDUID=\`id -u qmaild\`
    NOFILESGID=\`id -g qmaild\`
    MAXSMTPD=\`cat /usr/local/qmail/control/concurrencyincoming\`
    exec /usr/local/bin/softlimit -m 4000000 \\
    /usr/local/bin/tcpserver -v -l localhost -p -x /etc/tcp/smtp.cdb -c "\$MAXSMTPD" \\
    -u "\$QMAILDUID" -g "\$NOFILESGID" 0 smtp \\
    /usr/local/bin/rblsmtpd -r relays.ordb.org \\
    sh -c '{ test -z "\$TCPREMOTEHOST" && [ "\$TCPREMOTEIP" != "127.0.0.1" ] ; } \\
    && echo "451 bad reverse DNS \$TCPREMOTEIP" \\
    || /usr/local/qmail/bin/qmail-smtpd \\
    /usr/local/qmail/bin/checkpassword /bin/true' 2>&1
    EOF

    se non si vuole utilizzare le blacklist usare questo script
    cat >/usr/local/qmail/supervise/qmail-smtpd/run<<EOF
    #!/bin/sh
    QMAILDUID=\`id -u qmaild\`
    NOFILESGID=\`id -g qmaild\`
    MAXSMTPD=\`cat /usr/local/qmail/control/concurrencyincoming\`
    exec /usr/local/bin/softlimit -m 4000000 \\
    /usr/local/bin/tcpserver -v -l localhost -p -x /etc/tcp/smtp.cdb -c "\$MAXSMTPD" \\
    -u "\$QMAILDUID" -g "\$NOFILESGID" 0 smtp \\
    sh -c '{ test -z "\$TCPREMOTEHOST" && [ "\$TCPREMOTEIP" != "127.0.0.1" ] ; } \\
    && echo "451 bad reverse DNS \$TCPREMOTEIP" \\
    || /usr/local/qmail/bin/qmail-smtpd \\
    /usr/local/qmail/bin/checkpassword /bin/true' 2>&1
    EOF

    se non si vuole il controllo del reverse DNS usare quest'altro script
    cat >/usr/local/qmail/supervise/qmail-smtpd/run<<EOF
    #!/bin/sh
    QMAILDUID=\`id -u qmaild\`
    NOFILESGID=\`id -g qmaild\`
    MAXSMTPD=\`cat /usr/local/qmail/control/concurrencyincoming\`
    exec /usr/local/bin/softlimit -m 4000000 \\
    /usr/local/bin/tcpserver -v -l localhost -p -x /etc/tcp/smtp.cdb -c "\$MAXSMTPD" \\
    -u "\$QMAILDUID" -g "\$NOFILESGID" 0 smtp \\
    /usr/local/qmail/bin/qmail-smtpd \\
    /usr/local/qmail/bin/checkpassword /bin/true 2>&1
    EOF

  10. Creare un file per il log di questo servizio
    cat >/usr/local/qmail/supervise/qmail-smtpd/log/run<<EOF
    #!/bin/sh
    exec /usr/local/bin/setuidgid qmaill /usr/local/bin/multilog t \\
    s100000 /var/log/qmail/smtpd
    EOF

  11. Creare un file di run per il servizio pop3
    cat > /usr/local/qmail/supervise/qmail-pop3d/run<<EOF
    #!/bin/sh
    exec /usr/local/bin/softlimit -m 4000000 \\
    /usr/local/bin/tcpserver -v -x /etc/tcp/pop-3.cdb -R -H -l 0 0 pop-3 \\
    /usr/local/qmail/bin/qmail-popup \\
    host.domain /usr/local/qmail/bin/checkpassword \\
    /usr/local/qmail/bin/qmail-pop3d Maildir 2>&1
    EOF

  12. Creare un file per il log di questo servizio
    cat >/usr/local/qmail/supervise/qmail-pop3d/log/run<<EOF
    #!/bin/sh
    exec /usr/local/bin/setuidgid qmaill /usr/local/bin/multilog t \\
    s100000 /var/log/qmail/pop3d
    EOF

  13. Rendere gli script sopra eseguibili con il comando
    chmod 755 /usr/local/qmail/supervise/qmail-send/run
    chmod 755 /usr/local/qmail/supervise/qmail-send/log/run
    chmod 755 /usr/local/qmail/supervise/qmail-smtpd/run
    chmod 755 /usr/local/qmail/supervise/qmail-smtpd/log/run
    chmod 755 /usr/local/qmail/supervise/qmail-pop3d/run
    chmod 755 /usr/local/qmail/supervise/qmail-pop3d/log/run

  14. Creare il file concurrencyincoming
    echo 20 > /usr/local/qmail/control/concurrencyincoming
    chmod 664 /usr/local/qmail/control/concurrencyincoming

  15. aggiunta dei filtri
    echo '*@*@*' > /usr/local/qmail/control/badrcptpatterns
    echo '*!*' >> /usr/local/qmail/control/badrcptpatterns
    echo '*@*@*' > /usr/local/qmail/control/badmailpatterns
    echo '*!*' >> /usr/local/qmail/control/badmailpatterns

  16. Link dei file di esecuzione nella directory /services
    ln -s /usr/local/qmail/supervise/qmail-pop3d /service
    ln -s /usr/local/qmail/supervise/qmail-send /service
    ln -s /usr/local/qmail/supervise/qmail-smtpd /service

  17. Scaricare lo script di startup da 
    http://www.ebruni.it/docs/qmail_mysql/bin/qmaild e
    cp qmaild /etc/rc.d/init.d/qmaild
    chmod 755 /etc/rc.d/init.d/qmaild

  18. Rimozione sendmail
    /etc/rc.d/init.d/sendmail stop
    rpm -e --nodeps sendmail

  19. Rimozione pop3
    vi /etc/xinetd.d/ipop3  e impostare disable=yes
    service xinetd restart

  20. eseguire qmail
    /etc/rc.d/init.d/qmaild start

  21. inserire lo script nei runlevel
    chkconfig --add qmaild
    chkconfig --level 235 qmaild on

  22. simulazione sendmail
    ln -s /usr/local/qmail/bin/sendmail /usr/sbin/sendmail

Altre impostazioni

  1. In /etc/login.defs deremmare QMAIL_DIR MailDir e remmare MAILDIR

  2. Se non si vuole far utilizzare il DNS (perche', per esempio, si sta facendo delle prove offline)  per il dominio dell'email del mittente bisogna modificare nelllo script /usr/local/qmail/supervise/qmail-smtpd/run l'inizio:
    exec /usr/local/bin/softlimit ...
    in
    exec /usr/local/bin/envdir ./env /usr/local/bin/softlimit ...
    mkdir /usr/local/qmail/supervise/qmail-smtpd/env
    echo "" > /usr/local/qmail/supervise/qmail-smtpd/env/NODNSCHECK

  3. Se non si vuole utilizzare il DNS neanche nel tcpserver sostituire la riga
     /usr/local/bin/tcpserver -v -l localhost -p -x /etc/tcp/smtp.cdb -c "\$MAXSMTPD" \\
    con
    /usr/local/bin/tcpserver -v -l localhost -P -H -R -x /etc/tcp/smtp.cdb -c "\$MAXSMTPD" \\

  4. E' possibile creare degli script che dinamicamente impostano le variabili d'ambiente per il qmail. Per esempio e' possibile impostare la variabile d'ambiente $RELAYCLIENT per permettere il relay a client basandosi su logiche diverse dal range di indirizzi IP, per esempio guardando ad un fle di log per vedere se l'utente, collegato con un qualche indirizzo ip è collegato con un servizio gestito da noi.
    Per esempio, creiamo una cartella
    mkdir /usr/local/qmail/supervise/qmail-smtpd/envdyn
    modifichiamo il file /usr/local/qmail/supervise/qmail-smtpd/run
    in questo modo:
    ...
    -u "$QMAILDUID" -g "$NOFILESGID" 0 smtp \
    ./envdyn/relay_wifi_user \
    /usr/local/qmail/bin/qmail-smtpd \
    ...

    e creiamo il nostro file relay_wifi_user ricordando che, per aggiungere una variabile d'ambiente basta scrivere del codice tipo $ENV{RELAYCLIENT} = "" e che, all'uscita del nostro programma (in ogni caso) bisogna sempre continuare la sequenza lanciando gli altri programmi con exec @ARGV;