Hetzner - DokuWiki

DebianMailserver3

Zunächst folgen nur "Raw" Hinweise, basierend aus dem Gedächtnis und Notizen. Im Verlauf dann in "schön". Ausgangslage ist ein Debian Sarge Image, welches Ihr über die Rescue Konsole installiert habt.

WORK IN PROGRESS!!!!


Inhaltsverzeichnis

libpam-mysql

~$ apt-get install libpam-mysql
~$ nano /etc/pam.d/imap

Inhalt von /etc/pam.d/imap

auth sufficient pam_mysql.so user=<DB_USER> passwd=<DB_PASSWD> \
host=127.0.0.1 db=mail table=accountuser  usercolumn=username \
passwdcolumn=password crypt=1 logtable=log logmsgcolumn=msg \
logusercolumn=user loghostcolumn=host logpidcolumn=pid \
logtimecolumn=time
account required pam_mysql.so user=<DB_USER> passwd=<DB_PASSWD> \
host=127.0.0.1 db=mail table=accountuser usercolumn=username \
passwdcolumn=password crypt=1 logtable=log logmsgcolumn=msg \
logusercolumn=user loghostcolumn=host logpidcolumn=pid \
logtimecolumn=time


Anschließend SymLinks auf pop, smtp und sieve anlegen.

~$ ln -s /etc/pam.d/imap /etc/pam.d/pop
~$ ln -s /etc/pam.d/imap /etc/pam.d/smtp
~$ ln -s /etc/pam.d/imap /etc/pam.d/sieve


Cyrus SASL

~$ apt-get install libsasl2 libsasl2-modules libsasl2-modules-sql sasl2-bin
~$ nano /etc/default/saslauthd

'#START=yes' kommentieren wir aus. Nach einem Reboot wird der Daemon folgend automatisch gestartet.


Postfix

Debian Sarge

~$ apt-get install openssl postfix postfix-mysql postfix-tls postfix-pcre

Debian Etch

~$ apt-get install openssl postfix postfix-mysql postfix-pcre

Evtl. Nachfragen von APT bez. der Konfiguration von Postfix werden verneint. Die Konfigurationsdateien werden manuell angelegt.

Der Benutzer postfix muss der Gruppe sasl angehören. Sonst funktioniert SMTP-AUTH nicht.

~$ adduser postfix sasl

Bearbeiten der Konfigurationsdateien.

~$ nano /etc/postfix/mysql-canonical.cf
 # the user name and password to log into the mysql server
 hosts = 127.0.0.1
 user = <DB_USER>
 password = <DB_PASSWD>
 # the database name on the servers
 dbname = <DB_NAME>
 # the table name
 table = virtual
 #
 select_field = alias
 where_field = username
 # Return the first match only
 additional_conditions = and status = '1' limit 1
~$ nano /etc/postfix/mysql-mydestination.cf
 # the user name and password to log into the mysql server
 hosts = 127.0.0.1
 user = <DB_USER>
 password = <DB_PASSWD>
 # the database name on the servers
 dbname = <DB_NAME>
 # the table name
 table = domain
 #
 select_field = domain_name
 where_field = domain_name
~$ nano /etc/postfix/mysql-virtual.cf
# the user name and password to log into the mysql server
hosts = 127.0.0.1
user = <DB_USER>
password = <DB_PASSWD>
# the database name on the servers
dbname = <DB_NAME>
# the table name
table = virtual
#
select_field = dest
where_field = alias
additional_conditions = and status = '1'


Konfiguration von Postfix: master.cf

~$ nano /etc/postfix/master.cf

Aus ....

smtp      inet  n       -       -       -       -       smtpd
#smtps    inet  n       -       -       -       -    
 smtpd -o smtpd_tls_wrappermode=yes -o smtpd_sasl_auth_enable=yes -o
 smtpd_client_restrictions=permit_sasl_authenticated,reject

wird ...

smtp      inet  n       -       n       -       -       smtpd
smtps     inet  n       -       n       -       -       
 smtpd -o smtpd_tls_wrappermode=yes -o smtpd_sasl_auth_enable=yes -o
 smtpd_client_restrictions=permit_sasl_authenticated,reject

Dadurch wird Postfix aus dem chroot Gefängnis befreit. Wir ersparen uns Zeit und Nerven, entsprechend MySQL und SASL anzupassen.

Weiterhin modifizieren (Debian Sarge) bzw. ergänzen (Debian Etch) die master.cf um folgenden Eintrag, damit Cyrus seinen Dienst verrichtet.

cyrus     unix -        n       n       -       -       pipe
 flags= user=cyrus argv=/usr/sbin/cyrdeliver -r ${sender} -m ${extension} ${user}


Konfiguration von Postfix: main.cf

Beispiel ...

#
# general
#
mydomain = name.tld
myorigin = $mydomain
mydestination = mysql:/etc/postfix/mysql-mydestination.cf
mynetworks = 127.0.0.0/8
relay_domains =
mailbox_transport = cyrus
virtual_alias_maps = mysql:/etc/postfix/mysql-virtual.cf
sender_canonical_maps = mysql:/etc/postfix/mysql-canonical.cf
alias_maps = $alias_database
#
# sasl auth
# for clients
#
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
broken_sasl_auth_clients = yes
smtpd_delay_reject = yes
smtpd_helo_required = yes
disable_vrfy_command = yes
strict_rfc821_envelopes = yes
smtpd_sender_restrictions =
        permit_sasl_authenticated,
        permit_mynetworks,
        reject_non_fqdn_sender,
        reject_unknown_sender_domain,
        permit
smtpd_recipient_restrictions =
        reject_invalid_hostname,
        reject_non_fqdn_hostname,
        reject_non_fqdn_sender,
        reject_non_fqdn_recipient,
        reject_unknown_sender_domain,
        reject_unknown_recipient_domain,                                
        reject_unauth_pipelining,
        permit_sasl_authenticated,
        permit_mynetworks,
        reject_unauth_destination,
        reject_rbl_client relays.ordb.org,
        reject_rbl_client dnsbl.sorbs.net,
        reject_rbl_client list.dsbl.org,
        reject_rbl_client sbl-xbl.spamhaus.org,
        reject_rbl_client bl.spamcop.net,
        permit
smtpd_data_restrictions =
        reject_unauth_pipelining,
        permit 
#
# SASL TLS
# for server
#
smtp_use_tls = yes
#
# SASL TLS
# for clients
#
smtpd_use_tls = yes
smtpd_sasl_local_domain =
smtpd_sasl_auth_only = yes
smtpd_tls_note_starttls_offer = yes
smtpd_tls_cert_file = /etc/ssl/certs/smtps.pem
smtpd_tls_key_file = /etc/ssl/certs/smtps.pem
smtpd_tls_CAfile = /etc/ssl/certs/smtps.pem
smtpd_tls_loglevel = 1
smtpd_tls_received_header = yes
smtpd_tls_session_cache_timeout = 3600s
tls_random_source = dev:/dev/urandom

Cyrus

Debian Sarge

~$ apt-get install cyrus21-common cyrus21-admin cyrus21-imapd cyrus21-pop3d cyrus21-clients

Debian Etch (sowohl Cyrus 2.1 als auch 2.2 verfügbar!)

~$ apt-get install cyrus-common-2.2 cyrus-admin-2.2 cyrus-imapd-2.2 cyrus-pop3d-2.2 cyrus-clients-2.2

Konfiguration von /etc/imapd.conf

Folgende Einträge gilt es sicherzustellen ...

unixhierarchysep: yes
admins: cyrus
sasl_mech_list: PLAIN
sasl_pwcheck_method: saslauthd auxprop
sasl_auxprop_plugin: sasldb

Unterstützung für IMAPs(ecure) und POPs(ecure) via SSL

# File containing the global certificate used for ALL services (imap, pop3,
# lmtp, sieve)
tls_cert_file: /etc/ssl/certs/cyrus.pem
# File containing the private key belonging to the global server  # certificate.
tls_key_file: /etc/ssl/certs/cyrus.pem


Konfiguration von /etc/cyrus.conf

Wir überprüfen ...

imap            cmd="imapd -U 30" listen="imap" prefork=0 maxchild=100
imaps           cmd="imapd -s -U 30" listen="imaps" prefork=0 maxchild=100
pop3           cmd="pop3d -U 30" listen="pop3" prefork=0 maxchild=50
pop3s          cmd="pop3d -s -U 30" listen="pop3s" prefork=0 maxchild=50
squatter_1      cmd="/usr/bin/nice -n 19 /usr/sbin/squatter -s" period=120

Damit Autenfizierung via SASL/libpam-mysql/MySQL funktioniert müssen wir den SASL Benutzer 'cyrus' anlegen.

~$ saslpasswd2 -c cyrus

Passwort für den 'cyrus' merken, wir brauchen es nochmal für WebCyradm!

SSL Zertifikate für Postfix (SMTPs), Cyrus IMAPs & POPs, erzeugen

~$ cd /etc/ssl/certs/
~$ openssl req -new -x509 -keyout smtps.pem -out smtps.pem -days 365 -nodes
~$ cp smtps.pem cyrus.pem

Ganz wichtig:

Common Name (eg, YOUR name) []: SERVERNAME.TLD

Übrige Daten für das selbstsignierte Zertifikat sind beliebig.

WebCyradm installieren & konfigurieren

Folgender Snapshot ist als stabil zu bewerten, ältere Versionen sollten nicht mehr eingesetzt werden.

Voraussetzungen: PHP IMAP, PHP PEAR DB, PHP safe_mode off (!)

~$ wget http://www.web-cyradm.org/web-cyradm-svn-0.5.5.tar.gz

... entpacken und bearbeiten von scripts/insertuser_mysql.sql

Im ersten Statement (DB) 'User' und (DB) 'Password' setzen.

Im zweiten Statement Name der Datenbank 'Db' und Datenbank-Benutzer 'User' angeben.

Es folgt:

~$ mysql -u root -p < insertuser_mysql.sql

Anpassen von scripts/create_mysql.sql

INSERT INTO adminuser (username, password) VALUES ('USERNAME_WEBCRYADM', ENCRYPT('PASSWORD'));
INSERT INTO domainadmin (domain_name,adminuser) VALUES ('*','USERNAME_WEBCRYADM');
INSERT INTO accountuser (username, password) VALUES ('cyrus', ENCRYPT('PASSWORT_VON_USER_CYRUS!!!'));
INSERT INTO `settings` ( `username` , `style` , `maxdisplay` , `warnlevel` ) VALUES ( 'USERNAME_WEBCRYADM', 'default', '15', '90');

Anschließend:

~$ mysql -u root -p DB_NAME < create_mysql.sql

Modifizieren von config/conf.php.dist und speichern als /config/conf.php

# The Cyrus login stuff
$CYRUS = array(
       'HOST'  => 'localhost',
       'PORT'  => 143,
       'ADMIN' => 'cyrus',
       'PASS'  => 'PASSWORT_VON_USER_CYRUS!!!'
);
#
$DB = array(
       'TYPE'  => 'mysql',
       'USER'  => 'DB_USER',
       'PASS'  => 'DB_PASSWORD',                
       'PROTO' => 'unix',      // set to "tcp" for TCP/IP
       'HOST'  => 'localhost',
       'NAME'  => 'DB_NAME'
);
#
# Where should web-cyradm write its log to?
$LOG_DIR = "/var/log";
#
$CRYPT = "crypt";
#
$DOMAIN_AS_PREFIX = 1;

Das Logfile anlegen und Rechte anpassen ...

~$ touch /var/log/web-cyrdm-login.log
~$ chown www-data:www-data /var/log/web-cyradm-login.log

Testen des Systems

Wir starten beteiligte Dienste neu.

~$ /etc/init.d/cyrus21 restart (respektive cyrus2.2)
~$ /etc/init.d/saslauthd restart
~$ /etc/init.d/postfix restart

Benutzer Cyrus kann sich einloggen ?

~$ cyradm --user cyrus --server localhost --auth plain
~$ Password: ist_schnuppe_user_cyrus_hat_kein_postfach
~$ IMAP Password: <Passwort_vom_Benutzer_Cyrus>
~$ quit

Postfix/SMTP Zugang klappt?

~$ telnet localhost 25
~$ Trying 127.0.0.1...
~$ Connected to nostromo.
~$ Escape character is '^]'.
~$ 220 nostromo.soellner.info ESMTP Postfix
~$ EHLO huhu.de
~$ 250-nostromo.soellner.info
~$ 250-PIPELINING
~$ 250-SIZE 10240000
~$ 250-ETRN
~$ 250-STARTTLS
~$ 250-AUTH LOGIN PLAIN
~$ 250-AUTH=LOGIN PLAIN
~$ 250-ENHANCEDSTATUSCODES
~$ 250-8BITMIME
~$ 250 DSN
~$ MAIL FROM: <huhu@huhu.de>
~$ 250 2.1.0 Ok
~$ RCPT TO: <huhu@huhu.de>
~$ 250 2.1.5 Ok
~$ DATA
~$ 354 End data with <CR><LF>.<CR><LF>
~$ TEST BLABLA 
~$ .
~$ 250 2.0.0 Ok: queued as ED913AD0159
~$ QUIT
~$ 221 2.0.0 Bye
~$ Connection closed by foreign host.

Hakt es irgendwo: Ein Blick in die LOG Daten - auth.log, syslog, mail.log, mysql.log et cetera - hilft immer.



© 2019. Hetzner Online GmbH. Alle Rechte vorbehalten.