Om de accounts en gebruikers uit MySQL op te kunnen halen, moeten we natuurlijk een database aanmaken en een aantal files waarin de informatie staat hoe Postfix deze database kan benaderen. Allereerst is het natuurlijk van belang dat je MySQL geinstalleerd hebt, net als Postfix. Ik ga ervan uit dat je dat gedaan hebt. Als je Postfix volgens de tutorial van deze sote hebt geinstalleerd, dan heb je ook al de package postfix-mysql geinstallereerd. Zoniet, dan moet je deze alsnog installeren.
Daarnaast is het ook van belang dat je LetsEncrypt geinstalleerd hebt. Als je dat nog niet gedaan hebt, moet je daar ook voor zorgen. Als je deze site gevolgd hebt, is dat al in orde.
MySQL
- We maken eerst een nieuwe database aan, voordat we inloggen op MySql:
[codebox]mysqladmin -u root -p create mailserver
[/codebox]Je systeem zal vragen naar het password van je root-account. Voer dat in.
- Log in bij MySQL:
[codebox]mysql -u root -p mailserver
[/codebox]
- Maak een MySQL gebruiker aan voor de mailbox en geef deze de juiste rechten over de database. Vervang <mail-password> door een sterk wachtwoord: (vergeet de ‘;’ niet)
[codebox]GRANT SELECT ON mailserver.* TO 'mailuser'@'127.0.0.1' IDENTIFIED BY '<mail-password>';
[/codebox]
- Zorg ervoor dat de veranderingen toegepast worden:
[codebox]FLUSH PRIVILEGES;
[/codebox]
- Maak een tabel aan voor de domein(en) die mail kunnen ontvangen op jouw server:
[codebox]CREATE TABLE `virtual_domains`( `id` int(11) NOT NULL auto_increment, `name` varchar(50) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
[/codebox]
- Maak een tabel voor alle emailadressen en wachtwoorden:
[codebox]CREATE TABLE `virtual_users` ( `id` int(11) NOT NULL auto_increment, `domain_id` int(11) NOT NULL, `password` varchar(106) NOT NULL, `email` varchar(100) NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `email` (`email`), FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
[/codebox]
- Maak een tabel voor alle email aliasen:
[codebox]CREATE TABLE `virtual_aliases` ( `id` int(11) NOT NULL auto_increment, `domain_id` int(11) NOT NULL, `source` varchar(100) NOT NULL, `destination` varchar(100) NOT NULL, PRIMARY KEY (`id`), FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
[/codebox]
Data invoeren
De database is nu gereed. We voeren wat data in.
-
- Voer je domeingegevens in, in de virtual_domains tabel. Vervang voorbeeld.nl door je eigen domeinnaam:
[codebox]INSERT INTO `mailserver`.`virtual_domains` (`id` ,`name`) VALUES ('1', 'voorbeeld.nl');
[/codebox]
Let op!Als je meerdere domeinen invoert is het van belang dat je goed op let welk ‘id’ je instelt voor elk domein. Dat ‘id’ moet je in de volgende tabellen ook overnemen in de kolom ‘domain_id’. - Voer je emailadressen in, in de virtual_users table. Vervang de emailadressen natuurlijk door de juiste adressen en vervang de wachtwoorden door sterke wachtwoorden:
[codebox]INSERT INTO `mailserver`.`virtual_users` (`id`, `domain_id`, `password` , `email`) VALUES ('1', '1', ENCRYPT('wachtwoord1', CONCAT('$6$', SUBSTRING(SHA(RAND()), -16))), 'email1@voorbeeld.nl'), ('2', '1', ENCRYPT('wachtwoord2', CONCAT('$6$', SUBSTRING(SHA(RAND()), -16))), 'email2@voorbeeld.nl');
[/codebox]
- Je kunt email aliasen toevoegen aan de tabel ‘virtual_aliases’:
[codebox]INSERT INTO `mailserver`.`virtual_aliases` (`id`, `domain_id`, `source`, `destination`) VALUES ('1', '1', 'alias@voorbeeld.nl', 'email1@voorbeeld.nl');[/codebox]
- Voer je domeingegevens in, in de virtual_domains tabel. Vervang voorbeeld.nl door je eigen domeinnaam:
- Da’s alles. Je kunt eventueel je data controleren a.d.h.v. de volgende commando’s:[codebox]
SELECT * FROM mailserver.virtual_domains; SELECT * FROM mailserver.virtual_users; SELECT * FROM mailserver.virtual_aliases;
[/codebox]
Als alles klopt kun je MySQL afsluiten.
[codebox]exit
[/codebox]
Mail toevoegen aan LetsEncrypt
We moeten mail.voorbeeld.nl nog toevoegen aan Let’s Encrypt.
Omdat we Nginx draaien moeten we daar even aangeven dat er een domein bij komt.
[codebox]
sudo nano /etc/nginx/sites-available/default
[/codebox]
Voeg het volgende stuk toe aan de file: Het wordt dus een 2e ‘server’-sectie. Vergeet niet om de servername aan te passen aan jouw eigen domeinnaam
[codebox]
server { listen 80; listen [::]:80; listen 443 ssl; listen [::]:443 ssl; root /var/www/html; # Add index.php to the list if you are using PHP index index.php index.html index.htm index.nginx-debian.html; server_name mail.voorbeeld.nl; location / { # First attempt to serve request as file, then # as directory, then fall back to displaying a 404. try_files $uri $uri/ =404; } # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 location ~ \.php$ { include snippets/fastcgi-php.conf; # # # With php7.0-cgi alone: # fastcgi_pass 127.0.0.1:9000; # With php7.0-fpm: fastcgi_pass unix:/run/php/php7.0-fpm.sock; } # deny access to .htaccess files, if Apache's document root # concurs with nginx's one # location ~ /\.ht { deny all; } }
[/codebox]
Je kunt nu controleren of het bestand dat je nu hebt gemaakt in orde is.
[codebox]
sudo nginx -t
[/codebox]
Je krijgt dan als het goed is:[entrybox]nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful[/entrybox]
Je moet nu alleen nginx opnieuw starten[codebox]
sudo systemctl reload nginx
[/codebox]
ALs je dat gedaan hebt, gaan we mail.voorbeeld.nl toevoegen aan letsencrypt. Let op dat er geen spaties tussen de domeinnamen staan, alleen komma’s.
[codebox]
sudo certbot --nginx -w /var/www/html --expand -d voorbeeld.nl,www.voorbeeld.nl,mail.voorbeeld.nl
[/codebox]
Kijk goed of je geen foutmeldingen krijgt.
Postfix
We maken nu aanpassingen in de configuratie van Postfix, zodat deze de gegevens uit MySQL gaat halen.
-
- Wijzig de /etc/postfix/main.cf file. [codebox]
sudo nano /etc/postfix/main.cf
[/codebox]Kijk in het gedeelte van de TLS parameters. Pas onderstaande regels aan of voeg de regels toe. [codebox]
# TLS parameters smtpd_tls_cert_file=/etc/letsencrypt/live/voorbeeld.nl/fullchain.pem smtpd_tls_key_file=/etc/letsencrypt/live/voorbeeld.nl/privkey.pem smtpd_use_tls=yes smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
smtpd_tls_auth_only = yes
smtpd_tls_loglevel = 1
smtpd_tls_security_level=may
smtpd_tls_protocols = !SSLv2, !SSLv3
smtp_tls_security_level = may
smtp_tls_loglevel = 1# Enable SMTP for authenticated users, and handing off authentication to Dovecot
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes[/codebox]
- Controleer of bij ‘myhostname’ jouw domeinnaam al ingevuld staat, en of er geen ‘#’ voor die regel staat. [codebox]
myhostname = voorbeeld.nl
[/codebox]
- Verander iets verderop ‘mydestination’. Zet een ‘#’ voor de bestaande regel en maak direct eronder een nieuwe regel. De bestaande regel kan er anders uitzien dan hieronder afgebeeld[codebox]
#mydestination = $myhostname, voorbeeld.nl, localhost.nl, , localhost mydestination = localhost
[/codebox]
- Aan het eind van de file hadden we eerder al ‘smtpd_recipient_restrictions’ toegevoegd. Voeg daar de laatste 2 regels ook toe. Let op de komma achter ‘check_policy_service unix:private/policyd-spf,’
[codebox]smtpd_recipient_restrictions = reject_unauth_destination, check_policy_service unix:private/policyd-spf, permit_sasl_authenticated, permit_mynetworks
[/codebox]
- Voeg nu aan het eind van de file de volgende regels toe:[codebox]
# Hand off local delivery to Dovecot's LMTP, and tell it where to store mail virtual_transport = lmtp:unix:private/dovecot-lmtp # Virtual domains, users, and aliases virtual_mailbox_domains = mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf virtual_alias_maps = mysql:/etc/postfix/mysql-virtual-alias-maps.cf, mysql:/etc/postfix/mysql-virtual-email2email.cf
[/codebox]Sla de file op en sluit nano af met <ctrl-X> gevolgd door een ‘Y’.
- Maak een file voor de inlog gegevens voor de virtual domains.[codebox]
sudo nano /etc/postfix/mysql-virtual-mailbox-domains.cf
[/codebox]Kopieer onderstaande gegevens in deze file en vervang mail-password door het door jouw gekozen wachtwoord.[codebox]
user = mailuser password = mailuserpass hosts = 127.0.0.1 dbname = mailserver query = SELECT 1 FROM virtual_domains WHERE name='%s'
[/codebox]Sla de file op en sluit nano af met <ctrl-X> gevolgd door een ‘Y’.
- Maak een file voor de inloggegevens van de virtuele mailboxen.[codebox]
sudo nano /etc/postfix/mysql-virtual-mailbox-maps.cf
[/codebox]Kopieer onderstaande gegevens in deze file en vervang mail-password door het door jouw gekozen wachtwoord.[codebox]
user = mailuser password = mail-password hosts = 127.0.0.1 dbname = mailserver query = SELECT 1 FROM virtual_users WHERE email='%s'
[/codebox]Sla de file op en sluit nano af met <ctrl-X> gevolgd door een ‘Y’.
- Maak een file voor de inloggegevens van de aliases.[codebox]
sudo nano /etc/postfix/mysql-virtual-alias-maps.cf
[/codebox]Kopieer onderstaande gegevens in deze file en vervang mail-password door het door jouw gekozen wachtwoord.[codebox]
user = mailuser password = mail-password hosts = 127.0.0.1 dbname = mailserver query = SELECT destination FROM virtual_aliases WHERE source='%s'
[/codebox]Sla de file op en sluit nano af met <ctrl-X> gevolgd door een ‘Y’.
- Maak een file voor de inloggegevens van de email2email tabel.[codebox]
sudo nano /etc/postfix/mysql-virtual-email2email.cf
[/codebox]Kopieer onderstaande gegevens in deze file en vervang mail-password door het door jouw gekozen wachtwoord.[codebox]
user = mailuser password = mail-password hosts = 127.0.0.1 dbname = mailserver query = SELECT email FROM virtual_users WHERE email='%s'
[/codebox]Sla de file op en sluit nano af met <ctrl-X> gevolgd door een ‘Y’.
- Herstart postfix
[codebox]sudo service postfix restart
[/codebox]
- We gaan de tabellen controleren. Voer het volgende commando uit en vervang daarbij voorbeeld.nl door jouw eigen domeinnaam. Als het goed is reageert het systeem met een ‘1’.[codebox]
postmap -q voorbeeld.nl mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf
[/codebox]
- Controleer nu of Postfix het eerste emailadres kan vinden. Voer het volgende commando uit en vervang email1@voorbeeld.nl door jouw eerste mailadres. Als het goed is reageert het systeem met een ‘1’.[codebox]
postmap -q email1@voorbeeld.nl mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf
[/codebox]
- Controleer nu of Postfix de eerste alias kan vinden. Voer het volgende comando uit en vervang alias@voorbeeld.nl door jouw eerste alias. Als het goed is reageert het systeem met het bijbehorende emailadres.[codebox]
postmap -q alias@voorbeeld.nl mysql:/etc/postfix/mysql-virtual-alias-maps.cf
[/codebox]
- We passen nu de file /etc/postfix/master.cf aan.[codebox]
sudo nano /etc/postfix/master.cf
[/codebox]Haal het ‘#’ weg voor onderstaande regels en pas de 2 ‘smtpd_client_restrictions’ aan. De regel ‘-o smtpd_tls_wrappermode=no’ heb je waarschijnlijk niet. Voeg deze toe. Let op, laat voor elke regel die begint met -o minimaal 1 spatie of tab staan![codebox]
submission inet n - y - - smtpd -o syslog_name=postfix/submission -o smtpd_tls_security_level=encrypt -o smtpd_sasl_auth_enable=yes -o smtpd_tls_wrappermode=no # -o smtpd_reject_unlisted_recipient=no -o smtpd_client_restrictions=permit_sasl_authenticated,reject # -o smtpd_helo_restrictions=$mua_helo_restrictions # -o smtpd_sender_restrictions=$mua_sender_restrictions # -o smtpd_recipient_restrictions= # -o smtpd_relay_restrictions=permit_sasl_authenticated,reject -o milter_macro_daemon_name=ORIGINATING smtps inet n - y - - smtpd -o syslog_name=postfix/smtps -o smtpd_tls_wrappermode=yes -o smtpd_sasl_auth_enable=yes # -o smtpd_reject_unlisted_recipient=no -o smtpd_client_restrictions=permit_sasl_authenticated,reject # -o smtpd_helo_restrictions=$mua_helo_restrictions # -o smtpd_sender_restrictions=$mua_sender_restrictions # -o smtpd_recipient_restrictions= # -o smtpd_relay_restrictions=permit_sasl_authenticated,reject -o milter_macro_daemon_name=ORIGINATING
[/codebox]Sla de file op en sluit nano af met <ctrl-X> gevolgd door een ‘Y’.
- Wijzig de rechten van de /etc/postfix directory zodat alleen de eigenaar en de betreffende group toegang heeft tot de bestanden.[codebox]
sudo chmod -R o-rwx /etc/postfix
[/codebox]
- Herstart Postfix:[codebox]
sudo service postfix restart
[/codebox]
- Wijzig de /etc/postfix/main.cf file. [codebox]
We zijn nu klaar met Postfix.