Postfix per ISP: differenze tra le versioni
Riga 74: | Riga 74: | ||
</pre> | </pre> | ||
==Popolamento di Mysql== | ==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: | |||
<pre>mysqladmin -u root -p create mailserver</pre> | |||
Creiamo l'utente per postfix (con permessi limitati): | |||
<pre> | |||
# 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 | |||
</pre> | |||
==Creazione Tabelle== | |||
<pre> | |||
# 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; | |||
</pre> | |||
Sono state impostate alcune ''foreign keys'': servono per collegare i record delle tabelle <code>virtual_aliases</code> e <code>virtual_users</code> con i record nella tabella <code>virtual_domains</code>. 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.<br/> | |||
Il suffisso <code>ON DELETE CASCADE</code> 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. | Creiamo e popoliamo in mysql le tre tabelle di cui sopra. | ||
<pre> | <pre> |
Versione delle 17:46, 6 apr 2014
|
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
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
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');