Postfix Konfiguration · 8 min read · Dec 29, 2025

Virtuelle Benutzer und Domains mit Postfix, Courier, MySQL und SquirrelMail (Fedora 14 x86_64) - Seite 2

6 MySQL-Passwörter setzen und phpMyAdmin konfigurieren

Starten Sie MySQL:

chkconfig --levels 235 mysqld on  
/etc/init.d/mysqld start

Setzen Sie dann Passwörter für das MySQL-Root-Konto:

mysql_secure_installation

[root@server1 ~]# mysql_secure_installation

HINWEIS: DAS AUSFÜHREN ALLER TEILE DIESER SCRIPTES WIRD FÜR ALLE MySQL
SERVER IM PRODUKTIONSEINSATZ EMPFOHLEN! BITTE LESEN SIE JEDEN SCHRITT SORGFÄLTIG!

Um sich bei MySQL anzumelden und es zu sichern, benötigen wir das aktuelle
Passwort für den Root-Benutzer. Wenn Sie MySQL gerade installiert haben und
noch kein Root-Passwort gesetzt haben, ist das Passwort leer,
Sie sollten hier einfach die Eingabetaste drücken.

Geben Sie das aktuelle Passwort für root ein (Eingabetaste für keines): <– EINGABETASTE
OK, Passwort erfolgreich verwendet, weiter…

Das Setzen des Root-Passworts stellt sicher, dass niemand ohne die
richtige Autorisierung auf den MySQL-Root-Benutzer zugreifen kann.

Root-Passwort setzen? [Y/n] <– EINGABETASTE
Neues Passwort: <– IhrRootSQLPasswort
Neues Passwort erneut eingeben: <– IhrRootSQLPasswort
Passwort erfolgreich aktualisiert!
Privilegientabellen werden neu geladen..
… Erfolg!

Standardmäßig hat eine MySQL-Installation einen anonymen Benutzer,
was es jedem ermöglicht, sich bei MySQL anzumelden, ohne ein
Benutzerkonto erstellen zu müssen. Dies ist nur für Tests gedacht,
und um die Installation etwas reibungsloser zu gestalten.
Sie sollten diese vor dem Wechsel in eine Produktionsumgebung entfernen.

Anonyme Benutzer entfernen? [Y/n] <– EINGABETASTE
… Erfolg!

Normalerweise sollte root nur von ‘localhost’ aus zugelassen werden.
Dies stellt sicher, dass niemand das Root-Passwort über das
Netzwerk erraten kann.

Root-Login aus der Ferne verbieten? [Y/n] <– EINGABETASTE
… Erfolg!

Standardmäßig kommt MySQL mit einer Datenbank namens ‘test’, auf die
niemand zugreifen kann. Dies ist ebenfalls nur für Tests gedacht
und sollte vor dem Wechsel in eine Produktionsumgebung entfernt werden.

Testdatenbank und Zugriff darauf entfernen? [Y/n] <– EINGABETASTE

  • Testdatenbank wird gelöscht…
    … Erfolg!
  • Berechtigungen auf Testdatenbank werden entfernt…
    … Erfolg!

Das Neuladen der Berechtigungstabellen stellt sicher, dass alle
Änderungen, die bisher vorgenommen wurden, sofort wirksam werden.

Berechtigungstabellen jetzt neu laden? [Y/n] <– EINGABETASTE
… Erfolg!

Aufräumen…

Alles erledigt! Wenn Sie alle oben genannten Schritte abgeschlossen haben,
sollte Ihre MySQL-Installation jetzt sicher sein.

Danke, dass Sie MySQL verwenden!

[root@server1 ~]#

Jetzt konfigurieren wir phpMyAdmin. Wir ändern die Apache-Konfiguration,
so dass phpMyAdmin Verbindungen nicht nur von localhost zulässt
(indem wir die -Stanza auskommentieren):

vi /etc/httpd/conf.d/phpMyAdmin.conf

| # phpMyAdmin - Webbasierter MySQL-Browser, geschrieben in PHP # # Erlaubt standardmäßig nur localhost # # Aber phpMyAdmin für jeden anderen als localhost zuzulassen, sollte als # gefährlich angesehen werden, es sei denn, es ist ordnungsgemäß durch SSL gesichert Alias /phpMyAdmin /usr/share/phpMyAdmin Alias /phpmyadmin /usr/share/phpMyAdmin # # Order Deny,Allow # Deny from All # Allow from 127.0.0.1 # Allow from ::1 # Order Deny,Allow Deny from All Allow from 127.0.0.1 Allow from ::1 # Diese Verzeichnisse erfordern keinen Zugriff über HTTP - entnommen aus dem ursprünglichen # phpMyAdmin-Upstream-Tarball # Order Deny,Allow Deny from All Allow from None Order Deny,Allow Deny from All Allow from None # Diese Konfiguration verhindert, dass mod_security in phpMyAdmin-Verzeichnissen # SQL usw. filtert. Dies kann Ihre mod_security-Implementierung beeinträchtigen. # # # # SecRuleInheritance Off # # |

Dann erstellen wir die Systemstartlinks für Apache und starten ihn:

chkconfig --levels 235 httpd on  
/etc/init.d/httpd start

Jetzt können Sie Ihren Browser auf http://server1.example.com/phpMyAdmin/ oder http://192.168.0.100/phpMyAdmin/ leiten und sich mit dem Benutzernamen root und Ihrem neuen Root-MySQL-Passwort anmelden.

7 Erstellen Sie die MySQL-Datenbank für Postfix/Courier

Wir erstellen eine Datenbank namens mail:

mysqladmin -u root -p create mail

Als nächstes gehen wir zur MySQL-Shell:

mysql -u root -p

In der MySQL-Shell erstellen wir den Benutzer mail_admin mit dem Passwort mail_admin_password (ersetzen Sie es durch Ihr eigenes Passwort), der SELECT, INSERT, UPDATE, DELETE-Berechtigungen auf der Mail-Datenbank hat. Dieser Benutzer wird von Postfix und Courier verwendet, um sich mit der Mail-Datenbank zu verbinden:

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;

Immer noch in der MySQL-Shell erstellen wir die Tabellen, die Postfix und Courier benötigen:

USE mail;
CREATE TABLE domains (  
domain varchar(50) NOT NULL,  
PRIMARY KEY (domain) )  
TYPE=MyISAM;
CREATE TABLE forwardings (  
source varchar(80) NOT NULL,  
destination TEXT NOT NULL,  
PRIMARY KEY (source) )  
TYPE=MyISAM;
CREATE TABLE users (  
email varchar(80) NOT NULL,  
password varchar(20) NOT NULL,  
quota bigint(20) DEFAULT '10485760',  
PRIMARY KEY (email)  
) TYPE=MyISAM;
CREATE TABLE transport (  
domain varchar(128) NOT NULL default '',  
transport varchar(128) NOT NULL default '',  
UNIQUE KEY domain (domain)  
) TYPE=MyISAM;
quit;

Wie Sie vielleicht bemerkt haben, haben wir mit dem quit;-Befehl die MySQL-Shell verlassen und sind zurück in der Linux-Shell.

Die domains-Tabelle speichert jede virtuelle Domain, für die Postfix E-Mails empfangen soll (z.B. example.com).

domain
example.com

Die forwardings-Tabelle dient dazu, eine E-Mail-Adresse auf eine andere zu verweisen, z.B. E-Mails für [email protected] an [email protected] weiterzuleiten.

sourcedestination
[email protected][email protected]

Die users-Tabelle speichert alle virtuellen Benutzer (d.h. E-Mail-Adressen, da die E-Mail-Adresse und der Benutzername identisch sind) und Passwörter (in verschlüsselter Form!) sowie einen Quota-Wert für jedes Postfach (in diesem Beispiel beträgt der Standardwert 10485760 Bytes, was 10 MB entspricht).

emailpasswordquota
[email protected]No9.E4skNvGa. (“secret” in verschlüsselter Form)10485760

Die transport-Tabelle ist optional, sie ist für fortgeschrittene Benutzer. Sie ermöglicht es, E-Mails für einzelne Benutzer, ganze Domains oder alle E-Mails an einen anderen Server weiterzuleiten. Zum Beispiel,

domaintransport
example.comsmtp:[1.2.3.4]

würde alle E-Mails für example.com über das SMTP-Protokoll an den Server mit der IP-Adresse 1.2.3.4 weiterleiten (die eckigen Klammern [] bedeuten “keine MX-DNS-Abfrage durchführen” (was für IP-Adressen sinnvoll ist…). Wenn Sie stattdessen einen vollqualifizierten Domainnamen (FQDN) verwenden, würden Sie die eckigen Klammern nicht verwenden).

8 Postfix konfigurieren

Jetzt müssen wir Postfix mitteilen, wo es alle Informationen in der Datenbank finden kann. Dazu müssen wir sechs Textdateien erstellen. Sie werden feststellen, dass ich Postfix anweise, sich über die IP-Adresse 127.0.0.1 anstelle von localhost mit MySQL zu verbinden. Dies liegt daran, dass Postfix in einem Chroot-Jail läuft und keinen Zugriff auf den MySQL-Socket hat, auf den es zugreifen würde, wenn ich Postfix anweisen würde, localhost zu verwenden. Wenn ich 127.0.0.1 verwende, verwendet Postfix TCP-Netzwerke, um sich mit MySQL zu verbinden, was auch in einem Chroot-Jail kein Problem darstellt (die Alternative wäre, den MySQL-Socket in das Chroot-Jail zu verschieben, was einige andere Probleme verursacht).

Jetzt lassen Sie uns unsere sechs Textdateien erstellen.

vi /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 |

vi /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 |

vi /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 |

vi /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 |

vi /etc/postfix/mysql-virtual_transports.cf

| user = mail_admin password = mail_admin_password dbname = mail query = SELECT transport FROM transport WHERE domain='%s' hosts = 127.0.0.1 |

vi /etc/postfix/mysql-virtual_mailbox_limit_maps.cf

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

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

Jetzt erstellen wir einen Benutzer und eine Gruppe namens vmail mit dem Home-Verzeichnis /home/vmail. Hier werden alle Postfächer gespeichert.

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

Als nächstes nehmen wir einige Postfix-Konfigurationen vor. Stellen Sie sicher, dass Sie server1.example.com durch einen gültigen FQDN ersetzen, andernfalls funktioniert Ihr Postfix möglicherweise nicht richtig!

postconf -e 'myhostname = server1.example.com'  
postconf -e 'mydestination = server1.example.com, localhost, localhost.localdomain'  
postconf -e 'mynetworks = 127.0.0.0/8'  
postconf -e 'virtual_alias_domains ='  
postconf -e ' virtual_alias_maps = proxy:mysql:/etc/postfix/mysql-virtual_forwardings.cf, mysql:/etc/postfix/mysql-virtual_email2email.cf'  
postconf -e 'virtual_mailbox_domains = proxy:mysql:/etc/postfix/mysql-virtual_domains.cf'  
postconf -e 'virtual_mailbox_maps = proxy:mysql:/etc/postfix/mysql-virtual_mailboxes.cf'  
postconf -e 'virtual_mailbox_base = /home/vmail'  
postconf -e 'virtual_uid_maps = static:5000'  
postconf -e 'virtual_gid_maps = static:5000'  
postconf -e 'smtpd_sasl_auth_enable = yes'  
postconf -e 'broken_sasl_auth_clients = yes'  
postconf -e 'smtpd_sasl_authenticated_header = yes'  
postconf -e 'smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination'  
postconf -e 'smtpd_use_tls = yes'  
postconf -e 'smtpd_tls_cert_file = /etc/postfix/smtpd.cert'  
postconf -e 'smtpd_tls_key_file = /etc/postfix/smtpd.key'  
postconf -e 'transport_maps = proxy:mysql:/etc/postfix/mysql-virtual_transports.cf'  
postconf -e 'virtual_create_maildirsize = yes'  
postconf -e 'virtual_maildir_extended = yes'  
postconf -e 'virtual_mailbox_limit_maps = proxy:mysql:/etc/postfix/mysql-virtual_mailbox_limit_maps.cf'  
postconf -e 'virtual_mailbox_limit_override = yes'  
postconf -e 'virtual_maildir_limit_message = "Der Benutzer, den Sie zu erreichen versuchen, hat das Limit überschritten."'  
postconf -e 'virtual_overquota_bounce = yes'  
postconf -e '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'  
postconf -e 'inet_interfaces = all'

Anschließend erstellen wir das SSL-Zertifikat, das für TLS benötigt wird:

cd /etc/postfix  
openssl req -new -outform PEM -out smtpd.cert -newkey rsa:2048 -nodes -keyout smtpd.key -keyform PEM -days 365 -x509

Land (2-Buchstaben-Code) [XX]: <– Geben Sie Ihren Ländernamen ein (z.B. “DE”).
Bundesland oder Provinzname (vollständiger Name) []: <– Geben Sie den Namen Ihres Bundeslandes oder Ihrer Provinz ein.
Ortsname (z.B. Stadt) [Standardstadt]: <– Geben Sie Ihre Stadt ein.
Name der Organisation (z.B. Unternehmen) [Standardunternehmen GmbH]: <– Geben Sie den Namen Ihrer Organisation ein (z.B. den Namen Ihres Unternehmens).
Name der organisatorischen Einheit (z.B. Abteilung) []: <– Geben Sie den Namen Ihrer organisatorischen Einheit ein (z.B. “IT-Abteilung”).
Allgemeiner Name (z.B. Ihr Name oder der Hostname Ihres Servers) []: <– Geben Sie den vollqualifizierten Domainnamen des Systems ein (z.B. “server1.example.com”).
E-Mail-Adresse []: <– Geben Sie Ihre E-Mail-Adresse ein.

Ändern Sie dann die Berechtigungen der smtpd.key:

chmod o= /etc/postfix/smtpd.key
Share: X/Twitter LinkedIn

Erhalte neue Beiträge in deinem Posteingang.

Kein Spam. Jederzeit abmelden.