Aysad Kozanoglu - Mimarist

Server Howtos & Tutorials

Mailserver mit Postfix, Dovecot, PostfixAdmin und MySQL

16 Mai, 2017 | Server Anleitungen

Diese Mailserver kann am ende dieser Anleitung im produktivumgebung benutzt und für mittlere bis Grosse (je nach Speicherkapzität) eingesetzt werden.

Diese Anleitung wurde in realen Umgebung unter DigitalOcean Debian 8.8 64bit Vserver mit realen mx eintrag und host a record mehrfach erfolgreich getestet/probiert.


während der installation von postfix "internet site" modus abgefragte fqdn darf nicht im nachhinein in main.cf unter mydestination= enthalten sein. (die Abfrage fqdn kann  mit irgendein subdomain, der auf den Server zeigt, eingetragen werden, es sollte auch in hosts und hostname entsprechend aussehen (siehe unten), den mydestination sind die domains enthalten die mails empfangen sollen und durch MTA abgehändelt werden)

nano /etc/hosts
10.10.10.11 server1.high-t.de server1
nano /etc/hostname
server1
/etc/init.d/hostname.sh
# für auto installer script gegeignet
debconf-set-selections <<< "postfix postfix/mailname string your.hostname.com"
debconf-set-selections <<< "postfix postfix/main_mailer_type string 'Internet Site'"
sudo debconf-set-selections <<< 'mysql-server mysql-server/root_password password your_password'
sudo debconf-set-selections <<< 'mysql-server mysql-server/root_password_again password your_password'

essentielle Pakete in einem abzug auf frisch installierten Debian installieren.
+nginx als webserver runtergeladen und source kompiliert installiert mit openssl. /usr/local/nginx
+exim4 wird von system entfernt
+postfix dovecot imapd wird installiert
+mysqlserver und phpfpm wird installiert


apt-get update && apt-get -y install build-essential libpcre3 libpcre3-dev zlib1g zlib1g-dev && apt-get -y remove --purge exim4 && apt-get -y install git mysql-server postfix php5 php5-curl php5-mcrypt php5-imap php5-mysql php5-fpm dovecot-common dovecot-imapd dovecot-pop3d dovecot-mysql postfix-mysql openssl && mkdir /source && cd /source && wget -q http://nginx.org/download/nginx-1.10.2.tar.gz && wget -q http://s.tip90.com/source/packages/openssl-0.9.8zf.tar.gz && tar zxvf nginx-1.10.2.tar.gz && tar zxvf openssl-0.9.8zf.tar.gz && cd nginx-1.10.2 && ./configure --sbin-path=/usr/local/sbin --with-http_ssl_module --user=www-data --group=www-data --with-openssl=/source/openssl-0.9.8zf/ && make && make install

nginx.conf über conf template ersetzen und virtual host für php proxy anlegen

templates:
https://raw.githubusercontent.com/AysadKozanoglu/mytools/master/conf/nginx/nginx.Prod.conf
https://raw.githubusercontent.com/AysadKozanoglu/mytools/master/conf/nginx/virtualserver-Prod-withConnlimit.conf

phpfpm und nginx starten


/etc/init.d/php5-fpm start && nginx

Postfix Admin WebGui runterladen

wget -O pfa.tar.gz "http://s.tip90.com/source/postfixadmin3.0.2.tar.gz"

entpacken und unter /usr/local/nginx/html verschieben/kopieren

mysql user und db anpassen für postfix

mysql -u root -p -e "CREATE USER 'postfix'@'localhost' IDENTIFIED BY 'mysqlpw';" &&
mysql -u root -p -e "create database postfix" &&
mysql -u root -p -e "GRANT ALL PRIVILEGES ON postfix . * TO 'postfix'@'localhost';" &&
mysql -u root -p -e "FLUSH PRIVILEGES;"

postfixadmin webGui conf anpassen pfa/config.inc.php

# ganz am ende
$CONF['configured'] = true;
$CONF['database_type'] = 'mysqli';
$CONF['database_host'] = '127.0.0.1';
$CONF['database_user'] = 'postfix';
$CONF['database_password'] = 'mysqlpw';
$CONF['database_name'] = 'postfix';
$CONF['database_prefix'] = '';
// Verschlüsselungsart der Passwörter
$CONF['encrypt'] = 'md5';
// Falls Einstellung vorhanden, einsetzen
$CONF['postfix_admin_url'] = 'http://your.address/to/postfixadmin';
// Emails werden hiermit mit dem Muster /var/vmail/%domain%/%username%/ gespeichert.
$CONF['domain_path'] = 'YES';
$CONF['domain_in_mailbox'] = 'NO';
chmod -R 777 postfixadmin/templates_c

setup.php aufrufen. ggf. fehlende pakete nach installieren die benötigt angezeigt werden. Beim erstaufruf der setup.php muss eine hash für das initial install erzeugt werden, dies geschieht ebenfalls über setup gui. die erzeugte hash muss dann im config.inc.php unter $CONF['setup_password'] ersetzt werden. Anschliessend setup.php erneut aufrufen und die installation kann fortgesetzt werden.

postfix system benutzer anlegen

groupadd -g 5000 vmail && useradd -g vmail -u 5000 vmail && mkdir /var/vmail && chown -R vmail:vmail /var/vmail
mkdir /etc/postfix/sslcert
cd /etc/postfix/sslcert
openssl req -new -newkey rsa:4096 -nodes -keyout server.key -days 730 -x509 -out server.crt
chmod go-rwx server.key

postfix main.cf anpassen ergänzen:

nano /etc/postfix/main.cf

<<
# orginal Prod: https://raw.githubusercontent.com/AysadKozanoglu/mytools/master/conf/postfix/main.cf
# a bit more spam protection
disable_vrfy_command = yes

# Restrictions

# nachricht an den entfernten SMTP-Server, wenn er als "Spam-Schleuder" erkannt wurde
default_rbl_reply = $rbl_code RBLTRAP: Sorry, but I decided that you are a spammer, you are not welcome here!

# Zum eigene Wohl nicht ändern ;)
smtpd_delay_reject = yes

# Wir wollen begrüßt werden
smtpd_helo_required = yes

# Die Begrüßung muss aber höflich und korrekt sein :)
smtpd_helo_restrictions =
permit_sasl_authenticated
permit_mynetworks
reject_unauth_destination
reject_non_fqdn_sender
reject_non_fqdn_recipient
reject_unknown_recipient_domain
reject_non_fqdn_hostname
reject_invalid_hostname
reject_rbl_client zen.spamhaus.org
reject_unauth_pipelining
permit

# Das Wichtigste: die Empfänger-Beschränkungen
smtpd_recipient_restrictions =
permit_sasl_authenticated
permit_mynetworks
# check_policy_service inet:127.0.0.1:60000
reject_invalid_hostname
reject_non_fqdn_hostname
reject_non_fqdn_recipient
reject_non_fqdn_sender
reject_unknown_sender_domain
reject_unknown_recipient_domain
reject_sender_login_mismatch
reject_unauth_pipelining
reject_unauth_destination
reject_multi_recipient_bounce
reject_non_fqdn_helo_hostname
reject_invalid_helo_hostname
reject_rbl_client zen.spamhaus.org
permit

# Die Sender-Restriktionen
smtpd_sender_restrictions =
permit_sasl_authenticated
permit_mynetworks
reject_unauth_destination
reject_non_fqdn_sender
reject_non_fqdn_recipient
reject_unknown_recipient_domain
reject_unauth_pipelining
reject_rbl_client zen.spamhaus.org
permit

# Die MUA Restriktionen
smtpd_client_restrictions = reject_invalid_hostname

# Mail Body Restriktionen
smtpd_data_restrictions =
reject_unauth_pipelining
reject_multi_recipient_bounce
permit

# Authentification
smtpd_sasl_type=dovecot
smtpd_sasl_path=private/auth_dovecot
smtpd_sasl_auth_enable = yes
smtpd_sasl_authenticated_header = yes
broken_sasl_auth_clients = yes

proxy_read_maps = $local_recipient_maps $mydestination $virtual_alias_maps $virtual_alias_domains $virtual_mailbox_maps $virtual_mailbox_domains $relay_recipient_maps $relay_domains $canonical_maps $sender_canonical_maps $recipient_canonical_maps $relocated_maps $transport_maps $mynetworks $smtpd_sender_login_maps

smtpd_sender_login_maps = proxy:mysql:/etc/postfix/mysql_sender_login_maps.cf

# Mailboxen
virtual_alias_maps = proxy:mysql:/etc/postfix/mysql_virtual_alias_maps.cf
virtual_mailbox_base = /var/vmail/
virtual_mailbox_domains = proxy:mysql:/etc/postfix/mysql_virtual_domains_maps.cf
virtual_mailbox_limit = 124000000
virtual_mailbox_maps = proxy:mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf
virtual_minimum_uid = 104
#virtual_transport = virtual
virtual_uid_maps = static:5000
virtual_gid_maps = static:5000
virtual_transport = dovecot
dovecot_destination_recipient_limit = 1
>>

 

nano /etc/postfix/main.cf

<<
smtpd_tls_cert_file = /etc/postfix/sslcert/server.crt
smtpd_tls_key_file = /etc/postfix/sslcert/server.key
>>

die beiden Zeilen ersetzen

 

postfix master.cf anpassen ergänzen

nano /etc/postfix/master.cf
dovecot unix - n n - - pipe
flags=DRhu user=vmail:vmail argv=/usr/lib/dovecot/deliver -d ${recipient}
smtps inet n - - - - smtpd
-o smtpd_tls_wrappermode=yes

folgenden conf dateien neu anlegen

nano /etc/postfix/mysql_virtual_alias_maps.cf
hosts = 127.0.0.1
user = postfix
password = mysqlpw
dbname = postfix
query = SELECT goto FROM alias WHERE address='%s' AND active = 1
nano /etc/postfix/mysql_virtual_mailbox_maps.cf
hosts = 127.0.0.1
user = postfix
password = mysqlpw
dbname = postfix
query = SELECT maildir FROM mailbox WHERE username='%s' AND active = 1
nano /etc/postfix/mysql_sender_login_maps.cf
hosts = 127.0.0.1
user = postfix
password = mysqlpw
dbname = postfix
query = SELECT username AS allowedUser FROM mailbox WHERE username='%s' AND active = 1 UNION SELECT goto FROM alias WHERE address='%s' AND active = 1

nano /etc/postfix/mysql_virtual_domains_maps.cf
hosts = 127.0.0.1
user = postfix
password = mysqlpw
dbname = postfix
query = SELECT domain FROM domain WHERE domain='%s' AND active = 1

Rechte setzen

cd /etc/postfix/ && chmod o-rwx,g+r mysql_* && chgrp postfix mysql_*

dovecot.conf orginal verschieben und neuanlegen

mv /etc/dovecot/dovecot.conf /etc/dovecot/dovecot.conf.sample

nano /etc/dovecot/dovecot.conf
auth_mechanisms = plain login
log_timestamp = "%Y-%m-%d %H:%M:%S "
passdb {
args = /etc/dovecot/dovecot-mysql.conf
driver = sql
}
protocols = imap pop3
service auth {
unix_listener /var/spool/postfix/private/auth_dovecot {
group = postfix
mode = 0660
user = postfix
}
unix_listener auth-master {
mode = 0600
user = vmail
}
user = root
}
ssl_cert =</etc/postfix/sslcert/server.crt
ssl_key =</etc/postfix/sslcert/server.key
userdb {
args = /etc/dovecot/dovecot-mysql.conf
driver = sql
}
protocol pop3 {
pop3_uidl_format = %08Xu%08Xv
}
protocol lda {
auth_socket_path = /var/run/dovecot/auth-master
postmaster_address = postmaster@example.com
}
nano /etc/dovecot/dovecot-mysql.conf
driver = mysql
connect = host=localhost dbname=postfix user=postfix password=mysqlpw
default_pass_scheme = PLAIN-MD5
password_query = SELECT password FROM mailbox WHERE username = '%u'
user_query = SELECT CONCAT('maildir:/var/vmail/',maildir) AS mail, 5000 AS uid, 5000 AS gid FROM mailbox WHERE username = '%u'

Rechte setzen

chmod o-rwx,g+r /etc/dovecot/dovecot-mysql.conf && chgrp vmail /etc/dovecot/dovecot-mysql.conf

Anschliessend dovecot und postfix starten

/etc/init.d/postfix restart && /etc/init.d/dovecot restart

 

letsenrypt generieren mit certbot

apt install git
git clone https://github.com/certbot/certbot
cd certbot
./certbot-auto certonly --standalone --rsa-key-size 4096 -d mail.mysystems.tld -d imap.mysystems.tld -d smtp.mysystems.tld

 

letsencrypt pfad:

ich lasse die orginalen IRedMail self signed so stehen und ändere direkt bei jeweiligen diensten den key pfad auf letencrpyt keys.

etc/letsencrypt/live/example.com/privkey.pem  zum /etc/ssl/private/iRedMail.key
/etc/letsencrypt/live/example.com/fullchain.pem zum /etc/ssl/certs/iRedMail.crt

 Info: CA file braucht man nicht, weil im fullchain von letsencrypt alles enthalten ist.

 

Letsencrypt sammelt alle SSL zertifikate für eine anderes Vorhaben und deshalb werden Zertifikate kostenlos zur Verfügung gestellt, damit man die Masse so gut es geht erreichen kann. Welches Vorhaben sie haben oder für wem diese Zertifikate dann nützlich ist, lasse ich jeden selbst die Entscheidung. Ich schlage jeden vor, einen rapidssl oder comodo ssl Zertifikat zu kaufen. sie sind billig und bei weitem vertrauenswürdiger!

 

Nginx ssl einbinden

    listen 443;
    server_name _;
    ssl on;
    ssl_certificate /etc/letsencrypt/live/mail.beispiel.de/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/mail.beispiel.de/privkey.pem;


    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

    # Fix 'The Logjam Attack'.
    ssl_ciphers EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH;
    ssl_prefer_server_ciphers on;
    ssl_dhparam /etc/ssl/dh2048_param.pem;

 

postfix ssl einbinden

smtpd_tls_key_file = /etc/letsencrypt/live/mail.beispiel.de/privkey.pem
smtpd_tls_cert_file = /etc/letsencrypt/live/mail.beispiel.de/fullchain.pem

# Disable SSLv2, SSLv3

smtpd_tls_protocols = !SSLv2 !SSLv3
smtpd_tls_mandatory_protocols = !SSLv2 !SSLv3
smtp_tls_protocols = !SSLv2 !SSLv3
smtp_tls_mandatory_protocols = !SSLv2 !SSLv3
lmtp_tls_protocols = !SSLv2 !SSLv3
lmtp_tls_mandatory_protocols = !SSLv2 !SSLv3

 

Dovecot ssl einbinden

ssl_protocols = !SSLv2 !SSLv3
ssl = required
verbose_ssl = no

ssl_cert = </etc/letsencrypt/live/mail.beispiel.de/fullchain.pem
ssl_key = </etc/letsencrypt/live/mail.beispiel.de/privkey.pem

# Fix 'The Logjam Attack'
ssl_cipher_list = EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH
# Dovecot 2.2.6 or greater:
# Specify the wanted DH parameters length
ssl_dh_parameters_length = 2048
ssl_prefer_server_ciphers = yes

 

nützliche links:

https://blog.unterhaltungsbox.com/mailserver-mit-postfix-dovecot-postfixadmin-und-mysql/

http://wiki.nefarius.at/linux/postfix_anti-spam_konfiguration

https://forum.iredmail.org/topic12500-iredmail-support-easy-lets-encrypt-guide-for-ubuntu-1604-iredmail-server-with-nginx.html