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.
email 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';

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *