Postfix e MySQL · 7 min read · Jan 10, 2026

Utenti e Domini Virtuali Con Postfix, Courier, MySQL E SquirrelMail (CentOS 6.0 x86_64) - Pagina 2

6 Imposta le Password MySQL e Configura phpMyAdmin

Avvia MySQL:

chkconfig --levels 235 mysqld on  
/etc/init.d/mysqld start

Quindi imposta le password per l’account root di MySQL:

mysql_secure_installation

[root@server1 ~]# mysql_secure_installation

NOTE: E’ RACCOMANDATO ESEGUIRE TUTTE LE PARTI DI QUESTO SCRIPT PER TUTTI I SERVER MySQL IN USO IN PRODUZIONE! PER FAVORE LEGGI ATTENTAMENTE OGNI PASSO!

Per accedere a MySQL e metterlo in sicurezza, avremo bisogno della password attuale per l’utente root. Se hai appena installato MySQL e non hai ancora impostato la password root, la password sarà vuota, quindi dovresti semplicemente premere invio qui.

Inserisci la password attuale per root (premi invio per nessuna): <– INVIO
OK, password utilizzata con successo, procedendo…

Impostare la password root? [Y/n] <– INVIO
Nuova password: <– yourrootsqlpassword
Reinserisci la nuova password: <– yourrootsqlpassword
Password aggiornata con successo!
Ricaricamento delle tabelle dei privilegi..
… Successo!

Per impostazione predefinita, un’installazione di MySQL ha un utente anonimo, che consente a chiunque di accedere a MySQL senza dover avere un account utente creato per loro. Questo è inteso solo per testare e per rendere l’installazione un po’ più fluida. Dovresti rimuoverli prima di passare a un ambiente di produzione.

Rimuovere gli utenti anonimi? [Y/n] <– INVIO
… Successo!

Normalmente, root dovrebbe essere autorizzato a connettersi solo da ‘localhost’. Questo assicura che qualcuno non possa indovinare la password root dalla rete.

Negare l’accesso remoto a root? [Y/n] <– INVIO
… Successo!

Per impostazione predefinita, MySQL viene fornito con un database chiamato ‘test’ a cui chiunque può accedere. Questo è anche inteso solo per testare e dovrebbe essere rimosso prima di passare a un ambiente di produzione.

Rimuovere il database di test e l’accesso ad esso? [Y/n] <– INVIO

  • Eliminazione del database di test…
    … Successo!
  • Rimozione dei privilegi sul database di test…
    … Successo!

Ricaricare le tabelle dei privilegi garantirà che tutte le modifiche effettuate finora abbiano effetto immediato.

Ricaricare le tabelle dei privilegi ora? [Y/n] <– INVIO
… Successo!

Pulizia…

Tutto fatto! Se hai completato tutti i passaggi sopra, la tua installazione di MySQL dovrebbe ora essere sicura.

Grazie per aver utilizzato MySQL!

[root@server1 ~]#

Ora configuriamo phpMyAdmin. Cambiamo la configurazione di Apache in modo che phpMyAdmin consenta connessioni non solo da localhost (commentando la sezione ):

vi /etc/httpd/conf.d/phpMyAdmin.conf

| [...] # # Order Deny,Allow # Deny from All # Allow from 127.0.0.1 # Allow from ::1 # [...] |

Quindi creiamo i collegamenti di avvio del sistema per Apache e lo avviamo:

chkconfig --levels 235 httpd on  
/etc/init.d/httpd start

Ora puoi indirizzare il tuo browser a http://server1.example.com/phpMyAdmin/ o http://192.168.0.110/phpMyAdmin/ e accedere con il nome utente root e la tua nuova password root di MySQL.

7 Crea il Database MySQL per Postfix/Courier

Creiamo un database chiamato mail:

mysqladmin -u root -p create mail

Successivamente, andiamo nella shell di MySQL:

mysql -u root -p

Nella shell di MySQL, creiamo l’utente mail_admin con la password mail_admin_password (sostituiscila con la tua password) che ha privilegi SELECT, INSERT, UPDATE, DELETE sul database mail. Questo utente sarà utilizzato da Postfix e Courier per connettersi al database mail:

GRANT SELECT, INSERT, UPDATE, DELETE ON mail.* TO 'mail_admin'@'localhost' IDENTIFIED BY 'mail_admin_password';  
GRANT SELECT, INSERT, UPDATE, DELETE ON mail.* TO 'mail_admin'@'localhost.localdomain' IDENTIFIED BY 'mail_admin_password';  
FLUSH PRIVILEGES;

Ancora nella shell di MySQL, creiamo le tabelle di cui Postfix e Courier hanno bisogno:

USE mail;
CREATE TABLE domains (  
domain varchar(50) NOT NULL,  
PRIMARY KEY (domain) )  
ENGINE=MyISAM;
CREATE TABLE forwardings (  
source varchar(80) NOT NULL,  
destination TEXT NOT NULL,  
PRIMARY KEY (source) )  
ENGINE=MyISAM;
CREATE TABLE users (  
email varchar(80) NOT NULL,  
password varchar(20) NOT NULL,  
quota bigint(20) DEFAULT '10485760',  
PRIMARY KEY (email)  
) ENGINE=MyISAM;
CREATE TABLE transport (  
domain varchar(128) NOT NULL default '',  
transport varchar(128) NOT NULL default '',  
UNIQUE KEY domain (domain)  
) ENGINE=MyISAM;
quit;

Come avrai notato, con il comando quit; siamo usciti dalla shell di MySQL e siamo tornati nella shell di Linux.

La tabella domains memorizzerà ogni dominio virtuale per il quale Postfix dovrebbe ricevere email (ad esempio example.com).

domain
example.com

La tabella forwardings è per l’alias di un indirizzo email a un altro, ad esempio inoltrare email per [email protected] a [email protected].

sourcedestination
[email protected][email protected]

La tabella users memorizza tutti gli utenti virtuali (cioè indirizzi email, perché l’indirizzo email e il nome utente sono gli stessi) e le password (in forma crittografata!) e un valore di quota per ciascuna casella di posta (in questo esempio il valore predefinito è 10485760 byte, che significa 10MB).

emailpasswordquota
[email protected]No9.E4skNvGa. (“segreto” in forma crittografata)10485760

La tabella transport è facoltativa, è per utenti avanzati. Consente di inoltrare email per singoli utenti, interi domini o tutte le email a un altro server. Ad esempio,

domaintransport
example.comsmtp:[1.2.3.4]

inoltrerebbe tutte le email per example.com tramite il protocollo smtp al server con l’indirizzo IP 1.2.3.4 (le parentesi quadre [] significano “non effettuare una ricerca del record MX DNS” (cosa sensata per indirizzi IP…). Se utilizzi un nome di dominio completamente qualificato (FQDN) al suo posto, non utilizzeresti le parentesi quadre.).

8 Configura Postfix

Ora dobbiamo dire a Postfix dove può trovare tutte le informazioni nel database. Pertanto dobbiamo creare sei file di testo. Noterai che dico a Postfix di connettersi a MySQL all’indirizzo IP 127.0.0.1 invece di localhost. Questo perché Postfix è in esecuzione in una chroot jail e non ha accesso al socket di MySQL a cui tenterebbe di connettersi se dicessi a Postfix di utilizzare localhost. Se utilizzo 127.0.0.1, Postfix utilizza il networking TCP per connettersi a MySQL, il che non è un problema nemmeno in una chroot jail (l’alternativa sarebbe spostare il socket di MySQL nella chroot jail, il che causa alcuni altri problemi).

Ora creiamo i nostri sei file di testo.

vi /etc/postfix/mysql-virtual_domains.cf

| user = mail_admin password = mail_admin_password dbname = mail query = SELECT domain AS virtual FROM domains WHERE domain='%s' hosts = 127.0.0.1 |

vi /etc/postfix/mysql-virtual_forwardings.cf

| user = mail_admin password = mail_admin_password dbname = mail query = SELECT destination FROM forwardings WHERE source='%s' hosts = 127.0.0.1 |

vi /etc/postfix/mysql-virtual_mailboxes.cf

| user = mail_admin password = mail_admin_password dbname = mail query = SELECT CONCAT(SUBSTRING_INDEX(email,'@',-1),'/',SUBSTRING_INDEX(email,'@',1),'/') FROM users WHERE email='%s' hosts = 127.0.0.1 |

vi /etc/postfix/mysql-virtual_email2email.cf

| user = mail_admin password = mail_admin_password dbname = mail query = SELECT email FROM users WHERE email='%s' hosts = 127.0.0.1 |

vi /etc/postfix/mysql-virtual_transports.cf

| user = mail_admin password = mail_admin_password dbname = mail query = SELECT transport FROM transport WHERE domain='%s' hosts = 127.0.0.1 |

vi /etc/postfix/mysql-virtual_mailbox_limit_maps.cf

| user = mail_admin password = mail_admin_password dbname = mail query = SELECT quota FROM users WHERE email='%s' hosts = 127.0.0.1 |

chmod o= /etc/postfix/mysql-virtual_*.cf  
chgrp postfix /etc/postfix/mysql-virtual_*.cf

Ora creiamo un utente e un gruppo chiamati vmail con la home directory /home/vmail. Qui verranno memorizzate tutte le caselle di posta.

groupadd -g 5000 vmail  
useradd -g vmail -u 5000 vmail -d /home/vmail -m

Successivamente facciamo alcune configurazioni di Postfix. Assicurati di sostituire server1.example.com con un FQDN valido, altrimenti il tuo Postfix potrebbe non funzionare correttamente!

postconf -e 'myhostname = server1.example.com'  
postconf -e 'mydestination = server1.example.com, localhost, localhost.localdomain'  
postconf -e 'mynetworks = 127.0.0.0/8'  
postconf -e 'virtual_alias_domains ='  
postconf -e ' virtual_alias_maps = proxy:mysql:/etc/postfix/mysql-virtual_forwardings.cf, mysql:/etc/postfix/mysql-virtual_email2email.cf'  
postconf -e 'virtual_mailbox_domains = proxy:mysql:/etc/postfix/mysql-virtual_domains.cf'  
postconf -e 'virtual_mailbox_maps = proxy:mysql:/etc/postfix/mysql-virtual_mailboxes.cf'  
postconf -e 'virtual_mailbox_base = /home/vmail'  
postconf -e 'virtual_uid_maps = static:5000'  
postconf -e 'virtual_gid_maps = static:5000'  
postconf -e 'smtpd_sasl_auth_enable = yes'  
postconf -e 'broken_sasl_auth_clients = yes'  
postconf -e 'smtpd_sasl_authenticated_header = yes'  
postconf -e 'smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination'  
postconf -e 'smtpd_use_tls = yes'  
postconf -e 'smtpd_tls_cert_file = /etc/postfix/smtpd.cert'  
postconf -e 'smtpd_tls_key_file = /etc/postfix/smtpd.key'  
postconf -e 'transport_maps = proxy:mysql:/etc/postfix/mysql-virtual_transports.cf'  
postconf -e 'virtual_create_maildirsize = yes'  
postconf -e 'virtual_maildir_extended = yes'  
postconf -e 'virtual_mailbox_limit_maps = proxy:mysql:/etc/postfix/mysql-virtual_mailbox_limit_maps.cf'  
postconf -e 'virtual_mailbox_limit_override = yes'  
postconf -e 'virtual_maildir_limit_message = "L'utente che stai cercando di contattare ha superato la quota."'  
postconf -e 'virtual_overquota_bounce = yes'  
postconf -e 'proxy_read_maps = $local_recipient_maps $mydestination $virtual_alias_maps $virtual_alias_domains $virtual_mailbox_maps $virtual_mailbox_domains $relay_recipient_maps $relay_domains $canonical_maps $sender_canonical_maps $recipient_canonical_maps $relocated_maps $transport_maps $mynetworks $virtual_mailbox_limit_maps'  
postconf -e 'inet_interfaces = all'

Successivamente creiamo il certificato SSL necessario per TLS:

cd /etc/postfix  
openssl req -new -outform PEM -out smtpd.cert -newkey rsa:2048 -nodes -keyout smtpd.key -keyform PEM -days 365 -x509

Nome del Paese (codice di 2 lettere) [XX]: <– Inserisci il nome del tuo paese (ad esempio, “IT”).
Nome dello Stato o della Provincia (nome completo) []: <– Inserisci il nome del tuo Stato o Provincia.
Nome della Località (ad es., città) [Città Predefinita]: <– Inserisci la tua città.
Nome dell’Organizzazione (ad es., azienda) [Azienda Predefinita Ltd]: <– Inserisci il nome della tua organizzazione (ad es., il nome della tua azienda).
Nome dell’Unità Organizzativa (ad es., sezione) []: <– Inserisci il nome della tua unità organizzativa (ad es. “Reparto IT”).
Nome Comune (ad es., il tuo nome o il nome host del tuo server) []: <– Inserisci il Nome di Dominio Completo del sistema (ad es., “server1.example.com”).
Indirizzo Email []: <– Inserisci il tuo indirizzo email.

Quindi cambia i permessi di smtpd.key:

chmod o= /etc/postfix/smtpd.key
Share: X/Twitter LinkedIn

Ricevi i nuovi post nella tua casella di posta.

Nessuno spam. Disiscriviti in qualsiasi momento.