Postfix per ISP

Da Guide@Debianizzati.Org.
Vai alla navigazione Vai alla ricerca
Internet Service Provider con Debian Wheezy

Prerequisiti

Server email

Sconfiggere lo SPAM

Integrazione con altro software



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