Konfigurace mailového serveru s uživateli v MySQL

Konfigurace mailového serveru s uživateli v MySQL

V tomto článku se dozvíte, jak nastavit Ubuntu server jako mailový server. Postfix (SMTP) bude kontrolovat uživatele v MySQL databázi, pro poštovní schránky bude využit Dovecot (POP3 i IMAP).

Předtím, než budete pokračovat, si připravte SSL certifikát – návod. Ten je nutný pro zabezpečené odesílání e-mailu, jak popisuji tady.

Plné doménové jméno serveru

SSL certifikát musí obsahovat stejné doménové jméno, jako bude Postfix používat – toto jméno lze nastavit v konfiguraci. Nemusí proto být stejné jako to vypsané příkazem hostname -f.

1. Instalace požadovaných balíčků

Předpokládám, že máte nainstalovaný a funkční MySQL server.
Ostatní balíčky nainstalujte pomocí příkazu:

apt-get install postfix postfix-mysql dovecot-core dovecot-imapd dovecot-pop3d dovecot-lmtpd dovecot-mysql dovecot-managesieved opendmarc spamassassin clamav clamav-daemon amavisd-new sqlgrey arj bzip2 cabextract cpio file gzip nomarch pax rar unrar unzip zip pyzor razor libdbi-perl libdbd-mysql-perl dovecot-sieve amavisd-new spamassassin clamav clamav-daemon zoo unzip bzip2 arj nomarch lzop cabextract apt-listchanges libnet-ldap-perl libauthen-sasl-perl clamav-docs daemon libio-string-perl libio-socket-ssl-perl libnet-ident-perl zip libnet-dns-perl libdbd-mysql-perl postgrey opendkim opendkim-tools postfix-policyd-spf-python postfix-pcre

Při instalaci budete vyzváni, abyste nakonfigurovali Postfix pomocí průvodce. V tomto průvodci zvolte druhou možnost shora (internetový server). Není to však důležité, protože konfiguraci upravíme později ručně.

2. Vytvoření uživatelů

Je potřeba vytvořit a nastavit uživatele. Použijte příkazy:

groupadd -g 5000 vmail
useradd -g vmail -u 5000 vmail -d /var/mail
adduser clamav amavis
adduser amavis clamav

3. Vytvoření tabulek v databázi

Vytvořte databázi a uživatele, který bude využit pouze pro postfix. V tomto návodu se databáze jmenuje mailserver. Nahraďte 3* heslem.

CREATE USER 'mailserver'@'localhost' IDENTIFIED BY '***';
GRANT USAGE ON *.* TO 'mailserver'@'localhost' IDENTIFIED BY '***' WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0;
CREATE DATABASE IF NOT EXISTS `mailserver`;
GRANT ALL PRIVILEGES ON `mailserver`.* TO 'mailserver'@'localhost';

Použijte následující SQL příkazy, pomocí kterých vytvoříte tabulky:

CREATE TABLE IF NOT EXISTS `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`),
 KEY `domain_id` (`domain_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `virtual_domains` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `name` varchar(50) NOT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `virtual_users` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `domain_id` int(11) NOT NULL,
 `password` varchar(500) NOT NULL,
 `email` varchar(100) NOT NULL,
 `active` tinyint(1) NOT NULL DEFAULT '1',
 PRIMARY KEY (`id`),
 UNIQUE KEY `email` (`email`),
 KEY `domain_id` (`domain_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
ALTER TABLE `virtual_aliases` ADD CONSTRAINT `virtual_aliases_ibfk_1` FOREIGN KEY (`domain_id`) REFERENCES `virtual_domains` (`id`) ON DELETE CASCADE;
ALTER TABLE `virtual_users` ADD CONSTRAINT `virtual_users_ibfk_1` FOREIGN KEY (`domain_id`) REFERENCES `virtual_domains` (`id`) ON DELETE CASCADE;

4. Úprava konfiguračních souborů

Postfix

Stáhněte si následující soubory a obsah z nich vložte do odpovídajícího souboru na serveru.

main.cf – uložte do /etc/postfix/main.cf

V main.cf přepište parametr myhostname na vaše plné doménové jméno, mynetworks kromě lokálního počítače obsahují IP adresy, ze kterých server přijímá e-maily bez ověření (přihlášení uživatele). relayhost je nyní zakázaná a povolit je třeba jen v případě, že váš poskytoval zakazuje odchozí SMTP port 25/tcp – to je častá praxe kvůli boji proti spamu.

Upravte cesty k certifikátům a k privátnímu klíči – parametry ssl_cert, ssl_key a ssl_ca. Tyto parametry jsou proměnnými, jsou použité na více místech, měnit je však musíte jen na tomto jednom místě. Jako ssl_ca certifikát použijte tento (odkaz).

master.cf – uložte do /etc/postfix/master.cf

V tomto souboru nejsou třeba žádné úpravy.

Vytvořte /etc/postfix/header_checks – obsah souboru můžete použít například odtud.

Vytvořte /etc/postfix/rbl_override – v tomto souboru se určuje, kdo má k Postfixu přístup – více na http://www.postfix.org/access.5.html . Po úpravě musíte použít příkaz postmap /etc/postfix/rbl_override .

Postfix – MySQL

V adresáři postfixu /etc/postfix vytvořte následující 4 soubory a vložte do nich odpovídající obsah (bez prvního == řádku). Nahraďte všude user, password a dbname vašimi údaji.

==> mysql-sasl-password-maps.cf <==
user = mailserver
password = heslo
hosts = 127.0.0.1
dbname = mailserver
query = SELECT password FROM virtual_users WHERE email='%u' LIMIT 1
==> mysql-virtual-alias-maps.cf <==
user = mailserver
password = heslo
hosts = 127.0.0.1
dbname = mailserver
query = SELECT destination FROM virtual_aliases WHERE source='%s'
==> mysql-virtual-mailbox-domains.cf <==
user = mailserver
password = heslo
hosts = 127.0.0.1
dbname = mailserver
query = SELECT 1 FROM virtual_domains WHERE name='%s'
==> mysql-virtual-mailbox-maps.cf <==
user = mailserver
password = heslo
hosts = 127.0.0.1
dbname = mailserver
query = SELECT 1 FROM virtual_users WHERE email='%s'

Dovecot

Do souboru /etc/dovecot/dovecot.conf přidejte parametr protocols a případně odkomentujte (změňte) login_greeting:

protocols = imap pop3 lmtp
login_greeting = Dovecot ready.

Upravte soubor /etc/dovecot/dovecot-sql.conf.ext – vložte obsah (nahraďte údaje pro připojení do MySQL):

driver = mysql
connect = host=127.0.0.1 dbname=mailserver user=mailserver password=heslo
default_pass_scheme = SHA512-CRYPT
password_query = SELECT email as user, password, 5000 as userdb_uid, 5000 as userdb_gid FROM virtual_users WHERE email='%u' and active = '1'

Nyní musíte upravit některé soubory z adresáře /etc/dovecot/conf.d.
Ponechte jejich obsah, odkomentujte a upravte jen uvedené parametry:

10-auth.conf

disable_plaintext_auth = no
auth_mechanisms = plain login
!include auth-sql.conf.ext (zakomentovat ostatní !include kolem)

10-logging.conf

log_path = /var/vmail/dovecot-deliver.log

10-mail.conf

mail_location = maildir:/var/vmail/%d/%n
mail_privileged_group = vmail
mail_uid = 5000
mail_gid = 5000
first_valid_gid = 5000
last_valid_gid = 5000
first_valid_uid = 5000
last_valid_uid = 5000

10-master.conf

service imap-login {
 inet_listener imap {
 port = 143
 }
 inet_listener imaps {
 port = 993
 ssl = yes
 }
}
service pop3-login {
 inet_listener pop3 {
 port = 110
 }
 inet_listener pop3s {
 port = 995
 ssl = yes
 }
}
service lmtp {
 unix_listener /var/spool/postfix/private/dovecot-lmtp {
 mode = 0600
 user = postfix
 group = postfix
 }
}
service auth {
 unix_listener /var/spool/postfix/private/auth {
 mode = 0660
 user = postfix
 group = postfix
 }
unix_listener auth-userdb {
 mode = 0600
 user = vmail
 group = vmail
 }
}
service auth-worker {
 user = vmail
}
service dict {
 }
}

10-ssl.conf

ssl = yes
ssl_cert = </etc/postfix/ssl/certifikat.crt
ssl_key = </etc/postfix/ssl/privatni.key
ssl_ca = </etc/postfix/ssl/startssl-ca-bundle.pem
ssl_verify_client_cert = no
auth_ssl_require_client_cert = no
ssl_parameters_regenerate = 0

15-lda.conf – obsah sekce protocol lda:

postmaster_address = postmaster@domena.cz
mail_plugins = sieve
auth_socket_path = /var/run/dovecot/auth-userdb
log_path = /var/vmail/dovecot-deliver.log

20-pop3.conf – přidejte do sekce pop3:

pop3_client_workarounds = outlook-no-nuls oe-ns-eoh

auth-sql.conf.ext

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

SpamAssassin – antispam

/etc/default/spamassassin

ENABLED=1
CRON=1

ClamAV – antivirus

Není třeba nic upravovat.

Amavis

Amavis je software předávající e-maily mezi Postfixem a jednotlivými content-filtery, tedy SpamAssassinem a ClamAV. Pro povolení antispamu i antiviru odkomentujte obě @bypass věty v souboru /etc/amavis/conf.d/15-content_filter_mode .

Upravte soubor /etc/amavis/conf.d/50-user a vložte mezi use strict; a 1 následující kód (nezapomeňte nastavit správné údaje pro připojení do MySQL):

$max_servers = 3;
$sa_tag_level_deflt = undef;
$sa_spam_subject_tag='***SPAM***';
$sa_tag2_level_deflt = 7;
$final_spam_destiny=D_PASS;
@lookup_sql_dsn = (
 ['DBI:mysql:database=mailserver;host=127.0.0.1;port=3306',
 'mailserver',
 'heslo']);
$sql_select_policy = 'SELECT name from virtual_domains WHERE CONCAT("@",name) IN (%k)';
$log_level = 2;

Pro smazání e-mailu, pokud je označen za spam, změňte v souboru /etc/amavis/conf.d/20-debian_defaults parametr na hodnotu:

$final_spam_destiny = D_DISCARD;

5. Úprava přístupových práv

chown -R vmail:dovecot /etc/dovecot
chmod -R o-rwx /etc/dovecot
chown -R root:mail /var/mail
mkdir -p /var/vmail
chown -R vmail:vmail /var/vmail
mkdir -p /etc/postfix/tlscache
chown -R root:root /etc/postfix
chmod 700 /etc/postfix -R
chown vmail:vmail /var/vmail/dovecot-deliver.log
chmod 700 /var/vmail/dovecot-deliver.log

usermod -a -G amavis clamav

AllowSupplementaryGroups false -> true
in /etc/clamav/clamd.conf

6. Vytvoření domény a uživatele

INSERT INTO `virtual_domains` (`name`) VALUES ('domena.cz');
INSERT INTO `virtual_users` (`domain_id`, `password` , `email`) VALUES ('1', ENCRYPT('heslo', CONCAT('$6$', SUBSTRING(SHA(RAND()), -16))) , 'uzivatel@domena.cz');

7. Aliasy – směrování e-mailů

V tabulce virtual_aliases můžete nastavit, co se stane s e-mailem po příchodu na váš server – kam zamíří. Můžete ho jak uložit do lokální schránky uživatele, tak ho (i zároveň) přeposlat na jinou adresu (i externí).

-- Vše do domény @domena.cz se přesměruje na adresu david@domena.cz
INSERT INTO `virtual_aliases` (`domain_id`, `source`, `destination`) VALUES ('1', '@domena.cz', 'david@domena.cz');
-- Vše směrované na david@domena.cz se přepošle na david@gmail.com
INSERT INTO `virtual_aliases` (`domain_id`, `source`, `destination`) VALUES ('1', 'david@domena.cz', 'david@gmail.com');
-- Zároveň se vše směrované na david@domena.cz uloží do lokální schránky uživatele (david@domena.cz)
INSERT INTO `virtual_aliases` (`domain_id`, `source`, `destination`) VALUES ('1', 'david@domena.cz', 'david@domena.cz');

8. Povolit porty ve firewallu

-A INPUT -p tcp --dport 25 -j ACCEPT
-A INPUT -p tcp --dport 110 -j ACCEPT
-A INPUT -p tcp --dport 143 -j ACCEPT
-A INPUT -p tcp --dport 465 -j ACCEPT
-A INPUT -p tcp --dport 585 -j ACCEPT
-A INPUT -p tcp --dport 993 -j ACCEPT
-A INPUT -p tcp --dport 995 -j ACCEPT
-A INPUT -p tcp --dport 587 -j ACCEPT

9. Spustit všechny služby

sudo service postfix restart
sudo service dovecot restart
sudo service sqlgrey restart
sudo service opendmarc restart
sudo service spamassassin restart
sudo service clamav-daemon restart
sudo service amavis restart

update-rc.d postfix enable
update-rc.d dovecot enable
update-rc.d sqlgrey enable
update-rc.d opendmarc enable
update-rc.d spamassassin enable
update-rc.d clamav-daemon enable
update-rc.d amavis enable

Závěr

V tuto chvíli máte nastavený mailserver, který kontroluje příchozí e-mail na spam proti veřejným databázím, směruje e-maily podle zadaných pravidel, která jsou uložená v MySQL databázi.