Postfix per ISP
|
Introduzione
In questo caso abbiamo deciso di configurare Postfix:
- con un backend Mysql per la gestione dei domini, alias e account email
- dovecot per lo smistamento delle email
Prerequisiti
Per procedere è necessario avere installato mysql e apache.
Installazione
Incominciamo con l'installare il server Postfix con la sua estensione per il supporto a MySQL:
# aptitude install postfix postfix-mysql
Configurazione Mysql
L'obiettivo è avere in mysql la gestione di:
- virtual_domains
- virtual_users
- virtual_alias
Pertanto creeremo tali tre tabelle in modo tale da avere in un sistema in funzione le seguenti tabelle e contenuti:
----------------- virtual_domains ----------------- id | name 1 | example.com 2 | foobar.org --------------------------------- virtual_users --------------------------------- id | domain_id | email | password 1 | 1 | john@example.com | 14cbfb845af1f030e372b1cb9275e6dd 2 | 1 | steve@example.com | a57d8c77e922bf756ed80141fc77a658 3 | 2 | kerstin@foobar.org | 5d6423c4ccddcbbdf0fcfaf9234a72d0 ----------------------------------- virtual_aliases ----------------------------------- id | domain_id | source | destination 1 | 1 | steve@example.com | devnull@workaround.org 2 | 2 | kerstin@foobar.org | kerstin42@yahoo.com 3 | 2 | kerstin@foobar.org | kerstin@mycompany.com
Database e utenti
L'obiettivo è ottenere la seguente configurazione:
- Database: mailserver
- Utente: mailuser (con permessi limitati)
- Utente: mailadmin (con permessi in scrittura e lettura). Non è obbligatorio ma IMO consigliato per la gestione via interfaccia web degli account.
Creiamo il database:
mysqladmin -u root -p create mailserver
Creiamo l'utente per postfix (con permessi limitati):
# mysql -u root -p mysql> GRANT SELECT ON mailserver.* TO 'mailuser'@'127.0.0.1' IDENTIFIED BY 'mailuser2009'; Query OK, 0 rows affected (0.00 sec) mysql> flush privileges; Query OK, 0 rows affected (0.00 sec) mysql> exit Bye
Creazione Tabelle
# mysql -p mailserver mysql> CREATE TABLE `virtual_domains` ( `id` int(11) NOT NULL auto_increment, `name` varchar(50) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; mysql> CREATE TABLE `virtual_users` ( `id` int(11) NOT NULL auto_increment, `domain_id` int(11) NOT NULL, `password` varchar(32) 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; mysql> 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`), FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Sono state impostate alcune foreign keys: servono per collegare i record delle tabelle virtual_aliases
e virtual_users
con i record nella tabella virtual_domains
. Questo ci permetterà di mantenere consistenti i dati nel database, perchè non potremo creare utenti virtuali o alias virtuali non collegati ad alcun dominio virtuale.
Il suffisso ON DELETE CASCADE
significa che rimuovendo un dominio virtuale saranno cancellate anche tutti gli utenti virtuali e gli alias collegati al dominio, evitando di lasciare nel database dei record orfani.
Popolamento di Mysql
Creiamo e popoliamo in mysql le tre tabelle di cui sopra.
# mysql -p mailserver mysql> INSERT INTO virtual_domains (id, name) VALUES (1, 'example.com'); mysql> INSERT INTO virtual_users (id, domain_id, email, password) VALUES (1, 1, 'john@example.com', MD5('summersun')); mysql> INSERT INTO virtual_aliases (id, domain_id, source, destination) VALUES (1, 1, 'john@example.com', 'john@example.com'), (2, 1, 'devnull@example.com', 'john@workaround.org');
Configurazione POSTFIX
Domini locali e virtuali
Normalmente Postfix lavora con i cosiddetti Domini Locali, configurati nella direttiva mydestination
del suo file di configurazione, e con gli utenti di sistema, elencati nel file /etc/passwd
.
Questo comporta che ogni utente possa ricevere la posta di tutti i domini. Supponiamo di avere la direttiva:
mydestination = example1.com, example2.com, example3.com
Questo semplice setup fa sì che l'utente di sistema johndoe
riceva le email indirizzate a:
johndoe@example1.com johndoe@example2.com johndoe@example3.com
Non è possibile impedire la ricezione della posta indirizzata a un singolo dominio e questo, unitamente al fatto che gestire molti utenti in questa maniera è inefficiente, rende il sistema poco pratico.
Questi problemi possono essere evitati facendo uso dei cosiddetti Domini Virtuali, che a loro volta gestiranno utenti virtuali e alias virtuali di posta. Nel corso della guida vedremo come questa tecnica sarà implementata attraverso alcune direttive Postfix e con il supporto di un database MySQL.
Preparazione del sistema
Controlliamo che il nostro /etc/hosts
sia impostato correttamente:
- Sbagliato:
20.30.40.50 mailserver42 mailserver42.example.com
- Corretto:
20.30.40.50 mailserver42.example.com mailserver42