Preparare il database
Adesso è il momento di preparare il database MariaDB che salva le informazioni che controllano il nostro server di posta. Nel processo dovrete inserire query SQL – il linguaggio dei database relazionali. Potete inserirle nella riga di comando ‘mysql’. Ma se avete poca esperienza con MySQL potreste preferire un’interfaccia web chiamata phpMyAdmin per gestire i dati del database.
Configurare phpMyAdmin
Installiamo il pacchetto phpMyAdmin:
apt install phpmyadmin
phpMyAdmin crea il suo piccolo database SQL nel nostro server per salvare i dati di configurazione. Ci verrà chiesto:
L’installer creerà anche un utente per l’accesso al database per permettere a phpMyAdmin di accedere al proprio database. La password non ci importa. Premiamo semplicemente “Enter” per generare un password casuale:
Ci verrà anche chiesto quale server web vogliamo usare. Selezioniamo Apache:
L’installer creerà il file /etc/phpmyadmin/apache.conf che deve essere incluso nel nostro host virtuale HTTPS in modo da potervi accedere dal nostro browser. Modifichiamo il file /etc/apache2/sites-available/webmail.example.org-https.conf e mettiamo questa linea tra i tag e ma prima di qualsiasi linea “include”:
Include /etc/phpmyadmin/apache.conf
Consiglio caldamente di disabilitare phpMyAdmin per ogni altro host virtuale:
a2disconf phpmyadmin
Altrimenti tutti i nostri siti web forniranno un percorso /phpmyadmin. Potrebbe creare confusione e perfino portarvi ad usarlo accidentalmente su una connessione HTTP (= non criptata). Se possibile dovreste limitare ulteriormente l’accesso a phpMyAdmin per ragioni di sicurezza.
Ricarichiamo il processo Apache:
service apache2 reload
Apriamo il browser e puntiamolo a “https://webmail.example.org/phpmyadmin”. Mostrerà il form di accesso di phpMyAdmin:
Non è possibile fare il login al momento. L’unico utente del database disponibile è ‘root’ ma MariaDB ci impedisce di usarlo con una password. Seguite le prossime sezioni per impostare il database e l’utente per il login.
Nota
phpMyAdmin di default si connette a “localhost” – che è lo stesso server. Creeremo un utente “mailadmin” per il database che sarà in grado di connettersi a “localhost”. Tuttavia l’utente “mailuser”, usato dai processi del server, si connette a “127.0.0.1”. Come scusa? Non è lo stesso di “localhost”? Di solito si. Ma per MariaDB e MySQL c’è una differenza. Se iniziate un connessione al database con “localhost” allora comunicate con il file socket che si trova in /var/run/mysqld/mysqld.sock nel vostro server. Ma se vi connettete a “127.0.0.1” allora creerete una connessione di rete che comunica con il socket TCP sulla porta 3306 del vostro server. Quindi il nostro utente del database ‘mailserver’@’127.0.0.1’ non può essere usato in phpMyAdmin (a meno che non si alteri la sua configurazione). Ma l’utente ‘mailadmin’@’localhost’ può. Siete ancora con me? Allora perché usare ‘127.0.0.1’? Il motivo è che Postfix è confinato nella cartella /var/spool/postfix. E poiché il socket “mysqld.sock” risiede al di fuori da questa cartella, dobbiamo usare una comunicazione TCP per evadere da questo confine. Phew… assurdo. 🙂
Configurare lo schema del database
Il nostro database verrà usato da due account utente:
- “mailuser” (@127.0.0.1 via TCP) avrà accesso in lettura al database. Postfix e Dovecot lo useranno per recuperare le informazioni su utenti e domini email.
- “mailadmin” (@localhost via socket) avrà accesso in lettura e scrittura. Lo useremo con phpMyAdmin per gestire il database.
Usiamo il comando “pwgen” per generare due buone password casuali per questi account:
pwgen -s 25 2
Creare il database e lo schema usando phpMyAdmin sarebbe davvero noioso. Forniremo gli opportuni comandi SQL al server MySQL per creare il database e le tabelle. Una tabella nel mondo dei database è sostanzialmente uguale ad un foglio di calcolo. Abbiamo righe e colonne. Le colonne sono chiamate anche campi. Le dichiarazioni SQL possono essere inserite nella shell “mysql” ottenuta lanciando il comando “mysql” come root sul server:
root@mail:~# mysql Welcome to the MariaDB monitor. Commands end with ; or g. Your MariaDB connection id is 230935 Server version: 10.1.26-MariaDB-0+deb9u1 Debian 9.1 Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others. Type 'help;' or 'h' for help. Type 'c' to clear the current input statement. MariaDB [(none)]>
Ora siamo connessi al database e possiamo dare comandi SQL. Prima creiamo il database:
CREATE DATABASE mailserver;
Dobbiamo anche creare l’utente MySQL chiamato ‘mailuser’ per accedere al database. Invece di “ChangeMe” usate la password creata con pwgen precedentemente.
CREATE USER 'mailuser'@'127.0.0.1' IDENTIFIED BY 'ChangeMe1';
…e l’utente che gestisce il database:
CREATE USER 'mailadmin'@'localhost' IDENTIFIED BY 'ChangeMe2';
All’admin serve l’accesso in lettura e scrittura al database:
GRANT ALL ON mailserver.* TO 'mailadmin'@'localhost';
All’altro account bastano i permessi di lettura:
GRANT SELECt ON mailserver.* TO 'mailuser'@'127.0.0.1';
Per i nostri scopi ci servono tre tabelle:
virtual_domains
Questa tabella contiene la lista di domini che useremo in virtual_mailbox_domains in Postfix.
Campo | Scopo |
---|---|
id | Un numero univoco che identifica ogni riga. Viene aggiunto automaticamente dal database. |
name | Il nome del dominio per il quale ricevere la posta. |
La seguente dichiarazione crea una tabella come quella sopra:
USE mailserver; 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;
virtual_users
La prossima tabella contiene le informazioni sui nostri utenti. Ogni account mail occupa una riga.
Campo | Scopo |
---|---|
id | Un numero univoco che identifica ogni riga. Viene aggiunto automaticamente dal database. |
domain_id | Contiene il numero id del dominio nella tabella virtual_domains. L’opzione “delete cascade” assicura che se il dominio è eliminato allora anche tutti gli account utente in quel dominio vengano eliminati per evitare righe orfane. |
L’indirizzo mail dell’account mail. | |
password | La password hash dell’account mail. Il prefisso è l’algoritmo di hash. Di default è {SHA256-CRYPT}. Ma potete aver ereditato utenti dalle precedenti installazioni ISPmail che usano ancora {PLAIN-MD5}. Aggiungendo l’algoritmo di hash ci permette di avere differenti tipi di hash. |
La query SQL appropriata per creare questa tabella:
USE mailserver; CREATE TABLE IF NOT EXISTS `virtual_users` ( `id` int(11) NOT NULL auto_increment, `domain_id` int(11) NOT NULL, `email` varchar(100) NOT NULL, `password` varchar(150) 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;
virtual_aliases
L’ultima tabella contiene gli inoltri da un indirizzo mail ad un altro.
Campo | Scopo |
---|---|
id | Un numero univoco che identifica ogni riga. Viene aggiunto automaticamente dal database. |
domain_id | Contiene il numero id del dominio nella tabella virtual_domains. L’opzione “delete cascade” assicura che se il dominio è eliminato allora anche tutti gli account utente in quel dominio vengano eliminati per evitare righe orfane. |
source | L’indirizzo mail (alias) a cui la mail è stata spedita. Nel caso di indirizzi catch-all (che accettano tutti gli indirizzi in un dominio) “source” è di tipo “@example.org”. |
destination | L’indirizzo mail (reale) a cui la mail deve essere spedito. |
Questa è la query SQL necessaria da lanciare:
USE mailserver; 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;
Come descritto nella sezione dei tipi di dominio, ci possono essere destinazioni multiple per un indirizzo mail mittente. Basta inserire più righe con lo stesso indirizzo “source” e differenti indirizzi “destination” che riceveranno le copie della mail.
Dati di esempio per fare test
Popoliamo il database con il dominio example.org, un account mail john@example.org e uno di inoltro da jack@example.org a john@example.org. Lanciamo queste query SQL:
REPLACE INTO mailserver.virtual_domains (id,name) VALUES ('1','example.org');
REPLACE INTO mailserver.virtual_users (id,domain_id,password,email)
VALUES ('1', '1', '{SHA256-CRYPT}$5$M/GWzmtjsLroRWIf$0qDt7IgXCoCQyvQZO7v.NC46rXzFVBSkZcilijlwgL7', 'john@example.org');
REPLACE INTO mailserver.virtual_aliases (id,domain_id,source,destination)
VALUES ('1', '1', 'jack@example.org', 'john@example.org');
Volete sapere come ho ottenuto quella lunga password criptata? Ho lanciato “dovecot pw -s SHA256-CRYPT” per creare un hash sicuro della password di esempio “summersun”. Potete provare voi stessi ed otterrete risultati differenti. La ragione è che le password sono “salate” per aumentare la loro sicurezza.
Prima di andare online con vostro server di posta alla fine dovete rimuovere questi dati usando questa semplice query SQL:
DELETE FROM mailserver.virtual_domains WHERE name='example.org';