Mailserver mit Postfix, Dovecot und MariaDB unter Centos 7

mailserver

In diesem Artikel gehen wir auf die Installation und Einrichtung eines Mailserver unter CentOS 7 mit Postfix, Dovecot und MariaDB ein. Dieses Tutorial ist auf 1-2 E-Mail Adressen ausgelegt, es ist aber ohne Probleme möglich mehrere anzulegen.

Sollten bei bei Konfiguration des Mailserver Probleme auftauchen oder ihr nicht folgen könnt, so nutzt bitte die Kommentarfunktion oder das Forum unter https://forum.fragz.de

Voraussetzungen für den Mailserver

  • Gültiger Hostname, zb. dev.fragz.de
  • Domain fragz.de und dev.fragz.de zeigen auf die ServerIP <<< entsprechend eurer Domain anpassen
  • RDNS (dev.fragz.de) richtig gesetzt. Entweder selber durchführen oder euren euren Hoster fragen

Wir bringen unser System erst mal auf den neusten Stand und sorgen für einige Grundvoraussetzungen.

yum update
yum upgrade
yum install epel-release

Jetzt können wir die benötigten Pakete Installieren.

yum install postfix dovecot mariadb-server mariadb-client dovecot-mysql

Wir sorgen auch direkt dafür das der MariaDB Server bei einem Server Neustart direkt gestartet wird.

systemctl enable mariadb.service
systemctl start mariadb.service

Soweit so gut. Kümmern wir uns nun um die Einrichtigung von MariaDB. Wir führen auf der Console aus

mysql_secure_installation

Es werden ein paar Fragen gestellt. Es sollte selbsterklärend sein.

Kommen wir nun zu dem eigentlichen Mailserver. Wir legen eine Datenbank für diesen an. Entweder via PhpMyAdmin oder über die Console.
Login über die Console

mysql -u root -p

Erstellen der Datenbank „mail“ und wechseln in diesen

CREATE DATABASE mail;
USE mail;

Jetzt erstellen wir den User „mail_admin“, geben ihm ein Passwort und weisen ihm die Datenbak „mail“ zu. Achtung, ersetzt mail_admin_password durch ein von euch gewähltes Passwort.

GRANT SELECT, INSERT, UPDATE, DELETE ON mail.* TO 'mail_admin'@'localhost' IDENTIFIED BY 'mail_admin_password';
GRANT SELECT, INSERT, UPDATE, DELETE ON mail.* TO 'mail_admin'@'localhost.localdomain' IDENTIFIED BY 'mail_admin_password';
FLUSH PRIVILEGES;

Jetzt legen wir einige benötigte Tabellen an.

CREATE TABLE domains (domain varchar(50) NOT NULL, PRIMARY KEY (domain) );
CREATE TABLE forwardings (source varchar(80) NOT NULL, destination TEXT NOT NULL, PRIMARY KEY (source) );
CREATE TABLE users (email varchar(80) NOT NULL, password varchar(20) NOT NULL, PRIMARY KEY (email) );
CREATE TABLE transport ( domain varchar(128) NOT NULL default '', transport varchar(128) NOT NULL default '', UNIQUE KEY domain (domain) );

Und zum Schluss verlassen wir die MariaDB Console

quit;

Konfiguartion von Postfix für die zusammenarbeit mit MariaDB
Ersetzt „mail_admin_password“ durch das von euch gewählte Passwort beim Anlegen des MySQL User „mail“

Wir legen 4 Dateien im Verzeichnis /etc/postfix/ an.

/etc/postfix/mysql-virtual_domains.cf

user = mail_admin
password = mail_admin_password
dbname = mail
query = SELECT domain AS virtual FROM domains WHERE domain='%s'
hosts = 127.0.0.1

/etc/postfix/mysql-virtual_forwardings.cf

user = mail_admin
password = mail_admin_password
dbname = mail
query = SELECT destination FROM forwardings WHERE source='%s'
hosts = 127.0.0.1

/etc/postfix/mysql-virtual_mailboxes.cf

user = mail_admin
password = mail_admin_password
dbname = mail
query = SELECT CONCAT(SUBSTRING_INDEX(email,'@',-1),'/',SUBSTRING_INDEX(email,'@',1),'/') FROM users WHERE email='%s'
hosts = 127.0.0.1

/etc/postfix/mysql-virtual_email2email.cf

user = mail_admin
password = mail_admin_password
dbname = mail
query = SELECT email FROM users WHERE email='%s'
hosts = 127.0.0.1

Nun ändern wir noch zur Sicherheit die Rechte für diese Dateien und erstellen ebenfalls den User vmail und weisen ihm das Verzeichniss /home/vmail zu

chmod o= /etc/postfix/mysql-virtual_*.cf
chgrp postfix /etc/postfix/mysql-virtual_*.cf

groupadd -g 5000 vmail
useradd -g vmail -u 5000 vmail -d /home/vmail -m

Jetzt machen wir uns an den Konfigurationsdateien des Postfix zu schaffen. Dazu öffnen wir die /etc/postfix/main.cf und fügen folgende Zeilen hinzu sofern diese noch nicht vorhanden sind. Ersetzt bitte dev.fragz.de durch euren Hostnamen.

myhostname = dev.fragz.de
mydestination = localhost, localhost.localdomain
mynetworks = 127.0.0.0/8
inet_interfaces = all
message_size_limit = 30720000
virtual_alias_domains =
virtual_alias_maps = proxy:mysql:/etc/postfix/mysql-virtual_forwardings.cf, mysql:/etc/postfix/mysql-virtual_email2email.cf
virtual_mailbox_domains = proxy:mysql:/etc/postfix/mysql-virtual_domains.cf
virtual_mailbox_maps = proxy:mysql:/etc/postfix/mysql-virtual_mailboxes.cf
virtual_mailbox_base = /home/vmail
virtual_uid_maps = static:5000
virtual_gid_maps = static:5000
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
broken_sasl_auth_clients = yes
smtpd_sasl_authenticated_header = yes
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
smtpd_use_tls = yes
smtpd_tls_cert_file = /etc/pki/dovecot/certs/dovecot.pem
smtpd_tls_key_file = /etc/pki/dovecot/private/dovecot.pem
virtual_create_maildirsize = yes
virtual_maildir_extended = 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 $virtual_mailbox_limit_maps
virtual_transport = dovecot
dovecot_destination_recipient_limit = 1

Nun editieren wir die /etc/postfix/master.cf

Wir fügen am Ende der Datei folgende Zeile hinzu. Achtet bitte auf das einrücken und das unter der Zeile mindestens noch eine Leerzeile vorhanden ist.

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

Ergenzt auch folgende Teile, durch hinzufügen, auskommentieren etc.

#
# Postfix master process configuration file.  For details on the format
# of the file, see the master(5) manual page (command: "man 5 master").
#
# Do not forget to execute "postfix reload" after editing this file.
#
# ==========================================================================
# service type  private unpriv  chroot  wakeup  maxproc command + args
#               (yes)   (yes)   (yes)   (never) (100)
# ==========================================================================
smtp      inet  n       -       -       -       -       smtpd
#smtp      inet  n       -       -       -       1       postscreen
#smtpd     pass  -       -       -       -       -       smtpd
#dnsblog   unix  -       -       -       -       0       dnsblog
#tlsproxy  unix  -       -       -       -       0       tlsproxy
submission inet n       -       -       -       -       smtpd
  -o syslog_name=postfix/submission
  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
  -o milter_macro_daemon_name=ORIGINATING
smtps     inet  n       -       -       -       -       smtpd
  -o syslog_name=postfix/smtps
  -o smtpd_tls_wrappermode=yes
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
  -o milter_macro_daemon_name=ORIGINATING

Zum Schluss sorgen wir dafür das der Postfix auch bei einem Systemstart sofort gestartet wird und starten diesen auch direkt.

systemctl enable postfix.service
systemctl start  postfix.service

Kommen wir nun zu dovecot. Wir öffnen die Datei /etc/dovecot/dovecot.conf, leeren diese und füllen sie mit folgendem Inhalt

protocols = imap pop3
log_timestamp = "%Y-%m-%d %H:%M:%S "
mail_location = maildir:/home/vmail/%d/%n/Maildir

ssl_cert = </etc/pki/dovecot/certs/dovecot.pem
ssl_key = </etc/pki/dovecot/private/dovecot.pem

namespace {
    type = private
    separator = .
    prefix = INBOX.
    inbox = yes
}

service auth {
    unix_listener auth-master {
        mode = 0600
        user = vmail
    }

    unix_listener /var/spool/postfix/private/auth {
        mode = 0666
        user = postfix
        group = postfix
    }

user = root
}

service auth-worker {
    user = root
}

protocol lda {
    log_path = /home/vmail/dovecot-deliver.log
    auth_socket_path = /var/run/dovecot/auth-master
    postmaster_address = postmaster@example.com
}

protocol pop3 {
    pop3_uidl_format = %08Xu%08Xv
}

passdb {
    driver = sql
    args = /etc/dovecot/dovecot-sql.conf.ext
}

userdb {
    driver = static
    args = uid=5000 gid=5000 home=/home/vmail/%d/%n allow_all_users=yes
}

Jetzt legen wir die Datei /etc/dovecot/dovecot-sql.conf.ext an und füllen diese. Beachtet bitte wieder mail_admin_password. Das muss eurem gewählten angepasst werden.

driver = mysql
connect = host=127.0.0.1 dbname=mail user=mail_admin password=mail_admin_password
default_pass_scheme = CRYPT
password_query = SELECT email as user, password FROM users WHERE email='%u';

Jetzt geben wir der Datei noch entsprechende Rechte und sorgen auch gleich wieder dafür das dovecot bei einem Systemstart mit gestartet wird

chmod o= /etc/dovecot/dovecot-sql.conf.ext
Configure Dovecot to start on boot, and start it for the first time:

systemctl enable dovecot.service
systemctl start  dovecot.service

Jetzt können wir unsere erste E-Mail Adresse anlegen. Dazu loggen wir uns wieder in MariaDB ein, wechseln in die Tabelle mail und führen einige Inserts durch.
Ersetze bitte example.com und info@example.com durch deine Domain und E-Mail Adresse die du anlegen willst. Auch das Passwort musst du deinen wünschen entsprechend anpassen.

mysql -u root -p
USE mail;
INSERT INTO domains (domain) VALUES ('example.com');
INSERT INTO users (email, password) VALUES ('info@example.com', ENCRYPT('password'));
quit

Zum Schluss konfigurieren wir noch die Firewall

firewall-cmd --permanent --add-service=smtp
firewall-cmd --permanent --add-service=smtps
firewall-cmd --permanent --add-service=pop3
firewall-cmd --permanent --add-service=imap
firewall-cmd --reload

Wenn alles ohne Probleme durch gelaufen ist, können wir nun unsere E-Mails mit einem Client unserer Wahl abrufen.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.