Guida alle tecnologie

Come configurare la replica MySQL con crittografia SSL su CentOS 5.4

8 min read Database Aggiornato 17 Oct 2025
Replica MySQL con SSL su CentOS 5.4
Replica MySQL con SSL su CentOS 5.4

Questo tutorial mostra come impostare la replica di MySQL (master→slave) su CentOS 5.4 usando connessioni SSL per cifrare il traffico tra i server. Fornisce comandi step-by-step per creare certificati, abilitare SSL, configurare master e slave, trasferire dati e risolvere problemi comuni.

Important: la replica non è un backup. Un comando DELETE sul master viene replicato sullo slave.

Intento primario e varianti correlate

Intento primario: configurare replica MySQL con SSL su CentOS 5.4 Varianti correlate: replica MySQL SSL, replica MySQL CentOS, replica master-slave MySQL, cifratura connessioni MySQL, configurare ssl mysql, mysqld replication ssl

Panoramica e termini chiave

Definizione rapida: la replica MySQL copia le modifiche dal server master a uno o più server slave, mantenendo i dati sincronizzati. Breve glossario (1 riga ciascuno):

  • Master: server principale che scrive i cambiamenti.
  • Slave: server che riceve e applica i cambiamenti dal master.
  • Binlog: file di log binario sul master che registra le modifiche.
  • SSL: Secure Sockets Layer, qui usato per cifrare la connessione MySQL.

1 Premessa

In questo esempio replichiamo il database exampledb dal server server1.example.com (master, IP 192.168.0.100) al server server2.example.com (slave, IP 192.168.0.101). Entrambi usano CentOS 5.4. Il database exampledb esiste già sul master e non sullo slave. Tutti i comandi qui indicati vengono eseguiti con privilegi root.

Note importanti sulle versioni: i comandi funzionano con le build standard di MySQL 5 su CentOS 5.x. Alcune distribuzioni o versioni più recenti possono richiedere adattamenti (per esempio gestione systemd, percorsi dei file di configurazione o parametri di sicurezza aggiuntivi).

2 Installare MySQL 5 e abilitare SSL

Se MySQL non è installato su server1 e server2, installalo:

server1/server2:

yum install mysql mysql-devel mysql-server

Crea i collegamenti di avvio del servizio e avvia MySQL:

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

Imposta la password di root di MySQL (esegui sul server1 e server2):

server1:

mysqladmin -u root password yourrootsqlpassword
mysqladmin -h server1.example.com -u root password yourrootsqlpassword

server2:

mysqladmin -u root password yourrootsqlpassword
mysqladmin -h server2.example.com -u root password yourrootsqlpassword

Verifica che MySQL supporti SSL:

mysql -u root -p

Poi nel prompt MySQL:

show variables like '%ssl%';

Se trovi have_openssl e have_ssl impostati a DISABLED significa che il server è compilato con supporto SSL ma non è attivo. Esci dal prompt:

quit;

Apri /etc/my.cnf e aggiungi la direttiva ssl nella sezione [mysqld]:

vi /etc/my.cnf

E aggiungi (o modifica) in [mysqld]:

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Default to using old password format for compatibility with mysql 3.x
# clients (those using the mysqlclient10 compatibility package).
old_passwords=1
ssl

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

Riavvia MySQL:

/etc/init.d/mysqld restart

Rientra in MySQL e verifica nuovamente:

mysql -u root -p
show variables like '%ssl%';

Dovresti vedere have_openssl e have_ssl impostati a YES.

3 Configurare il master (server1)

  1. Creare la directory per i binlog:

server1:

mkdir /var/log/mysql
chown mysql:mysql /var/log/mysql
  1. Creare CA, certificati del server e del client

Creiamo i certificati in /etc/mysql/newcerts:

mkdir -p /etc/mysql/newcerts && cd /etc/mysql/newcerts

Crea la CA:

openssl genrsa 2048 > ca-key.pem
openssl req -new -x509 -nodes -days 1000 -key ca-key.pem > ca-cert.pem

Crea il certificato del server:

openssl req -newkey rsa:2048 -days 1000 -nodes -keyout server-key.pem > server-req.pem
openssl x509 -req -in server-req.pem -days 1000 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > server-cert.pem

Crea il certificato del client (usato dallo slave per l’autenticazione SSL al master):

openssl req -newkey rsa:2048 -days 1000 -nodes -keyout client-key.pem > client-req.pem
openssl x509 -req -in client-req.pem -days 1000 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > client-cert.pem

Esempio di output atteso (ls -l):

[root@server1 newcerts]# ls -l
total 32
-rw-r--r-- 1 root root 1375 Feb  8 17:37 ca-cert.pem
-rw-r--r-- 1 root root 1679 Feb  8 17:37 ca-key.pem
-rw-r--r-- 1 root root 1119 Feb  8 17:37 client-cert.pem
-rw-r--r-- 1 root root 1675 Feb  8 17:37 client-key.pem
-rw-r--r-- 1 root root  968 Feb  8 17:37 client-req.pem
-rw-r--r-- 1 root root 1119 Feb  8 17:37 server-cert.pem
-rw-r--r-- 1 root root 1679 Feb  8 17:37 server-key.pem
-rw-r--r-- 1 root root  968 Feb  8 17:37 server-req.pem
[root@server1 newcerts]#
  1. Trasferire i certificati necessari allo slave

Sul server2 crea la directory:

server2:

mkdir -p /etc/mysql/newcerts

Sul server1 trasferisci ca-cert.pem, client-cert.pem e client-key.pem verso server2 (usando scp):

server1:

scp /etc/mysql/newcerts/ca-cert.pem [email protected]:/etc/mysql/newcerts
scp /etc/mysql/newcerts/client-cert.pem [email protected]:/etc/mysql/newcerts
scp /etc/mysql/newcerts/client-key.pem [email protected]:/etc/mysql/newcerts

Nota: non trasferire la server-key.pem o la ca-key.pem allo slave. La private key della CA (ca-key.pem) deve restare sicura sul master o in un luogo di gestione certificati dedicato.

  1. Configurare mysqld sul master per usare i certificati

Apri /etc/my.cnf e aggiungi i riferimenti a ssl-ca, ssl-cert e ssl-key nella sezione [mysqld]:

vi /etc/my.cnf

Aggiungi/modifica come segue:

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Default to using old password format for compatibility with mysql 3.x
# clients (those using the mysqlclient10 compatibility package).
old_passwords=1
ssl
ssl-ca=/etc/mysql/newcerts/ca-cert.pem
ssl-cert=/etc/mysql/newcerts/server-cert.pem
ssl-key=/etc/mysql/newcerts/server-key.pem

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

Riavvia MySQL:

/etc/init.d/mysqld restart
  1. Creare l’utente di replica che richiede SSL

Accedi a MySQL sul master:

mysql -u root -p

Esegui:

GRANT REPLICATION SLAVE ON *.* TO 'slave_user'@'%' IDENTIFIED BY 'slave_password' REQUIRE SSL;
FLUSH PRIVILEGES;
quit;

Nota: la clausola REQUIRE SSL impone che lo slave usi connessioni SSL. Se la rimuovi, lo slave potrà connettersi anche senza SSL.

  1. Configurare binlog e server-id sul master

Apri /etc/my.cnf e aggiungi/aggiorna i parametri per la replica nella sezione [mysqld]:

vi /etc/my.cnf

Aggiungi i parametri per replicare exampledb:

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
old_passwords=1
ssl
ssl-ca=/etc/mysql/newcerts/ca-cert.pem
ssl-cert=/etc/mysql/newcerts/server-cert.pem
ssl-key=/etc/mysql/newcerts/server-key.pem
server-id               = 1
log_bin                 = /var/log/mysql/mysql-bin.log
expire_logs_days        = 10
max_binlog_size         = 100M
binlog_do_db            = exampledb

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

Riavvia MySQL:

/etc/init.d/mysqld restart
  1. Creare snapshot coerente del database exampledb e annotare lo stato del master

Sul master:

mysql -u root -p

Nel prompt MySQL esegui:

USE exampledb;
FLUSH TABLES WITH READ LOCK;
SHOW MASTER STATUS;

Annota i valori File e Position mostrati da SHOW MASTER STATUS; servono per far partire lo slave dallo stesso punto del binlog.

Non uscire dal prompt MySQL (mantenere il lock). In una seconda shell sul master crea il dump e trasferiscilo allo slave:

server1 (seconda shell):

cd /tmp
mysqldump -u root -pyourrootsqlpassword --opt exampledb > snapshot.sql
scp snapshot.sql [email protected]:/tmp

Dopo il trasferimento puoi sbloccare le tabelle e uscire dal prompt della prima shell:

server1 (prima shell):

UNLOCK TABLES;
quit;

4 Configurare lo slave (server2)

  1. Depositare i certificati: assicurati che su server2 siano presenti i file trasferiti in /etc/mysql/newcerts: ca-cert.pem, client-cert.pem, client-key.pem.

  2. Aggiornare /etc/my.cnf sullo slave per abilitare SSL e identificare lo slave

Esempio di configurazione minimale nella sezione [mysqld]:

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
old_passwords=1
ssl
ssl-ca=/etc/mysql/newcerts/ca-cert.pem
ssl-cert=/etc/mysql/newcerts/client-cert.pem
ssl-key=/etc/mysql/newcerts/client-key.pem
server-id=2

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

Riavvia MySQL:

/ect/init.d/mysqld restart

(Nota: il percorso esatto del comando di riavvio è /etc/init.d/mysqld restart; inseriscilo correttamente.)

  1. Importare lo snapshot su server2
cd /tmp
mysql -u root -p exampledb < /tmp/snapshot.sql
  1. Configurare e avviare la replica sullo slave

Accedi a MySQL su server2:

mysql -u root -p

Esegui i comandi di CHANGE MASTER TO usando i valori File e Position presi da SHOW MASTER STATUS sul master. Esempio (sostituisci file e posizione reali):

CHANGE MASTER TO
  MASTER_HOST='server1.example.com',
  MASTER_USER='slave_user',
  MASTER_PASSWORD='slave_password',
  MASTER_LOG_FILE='mysql-bin.000001',
  MASTER_LOG_POS=3096416,
  MASTER_PORT=3306,
  MASTER_SSL=1,
  MASTER_SSL_CA='/etc/mysql/newcerts/ca-cert.pem',
  MASTER_SSL_CERT='/etc/mysql/newcerts/client-cert.pem',
  MASTER_SSL_KEY='/etc/mysql/newcerts/client-key.pem';

START SLAVE;

SHOW SLAVE STATUS\G

Controlla i campi ‘Slave_IO_Running’ e ‘Slave_SQL_Running’. Entrambi devono essere Yes per indicare che la replica è attiva.

Se hai usato REQUIRE SSL quando hai creato lo user di replica, MASTER_SSL=1 e i riferimenti ai certificati sono obbligatori.

5 Verifiche e troubleshooting comuni

Controlli rapidi:

  • Sul master: STATUS del binlog con SHOW MASTER STATUS.
  • Sullo slave: SHOW SLAVE STATUS\G e verifica Slave_IO_Running/Slave_SQL_Running.
  • Controlla i log dei mysqld su /var/log/mysqld.log e /var/log/mysql per messaggi di errore.

Problemi comuni e soluzioni:

  • Errore di connessione SSL: verifica permessi dei file .pem e percorsi su disco; MySQL deve poter leggere le chiavi e i certificati.
  • Permessi errati: imposta owner root:root e permessi 600 su file privati (client-key.pem, server-key.pem). Non esporre la private key.
  • Errore ‘Could not find CA certificate’: verifica MASTER_SSL_CA path e che il file sia leggibile dall’utente mysql.
  • Differenze di versione MySQL: alcuni parametri di CHANGE MASTER TO o opzioni SSL possono cambiare tra versioni; consulta la documentazione della versione esatta.

Comandi utili per debug:

show variables like '%ssl%';
SHOW MASTER STATUS;
SHOW SLAVE STATUS\G
tail -n 200 /var/log/mysqld.log

6 Sicurezza e buone pratiche

  • Conserva ca-key.pem e server-key.pem in un luogo sicuro. Non trasferire mai la ca-key.pem allo slave.
  • Usa password robuste per l’account di replica e limita l’accesso host-based (evita ‘%’ se possibile).
  • Imposta permessi stretti sui file delle chiavi (600) e proprietà root:mysql o root:root come richiesto.
  • Valuta l’uso di un sistema di gestione certificati (PKI) se hai molti server.
  • Mantieni aggiornati MySQL e sistema operativo per patch di sicurezza.
  • Monitoring: monitora lag di replica e alert per Slave_IO_Running/Slave_SQL_Running.

7 Alternative e confronti

Se SSL integrato non è fattibile o vuoi un’ulteriore protezione di rete, considera:

  • VPN tra i data center (IPsec/OpenVPN) — cifratura a livello di rete.
  • SSH tunnel per la porta MySQL — semplice ma meno scalabile.
  • Replica tramite canali privati in cloud (VPC peering, interconnessioni private).

Pro e contro SSL integrato:

  • Pro: cifratura end-to-end a livello applicazione, integrato in MySQL.
  • Contro: gestione certificati, rotazione e permessi; su sistemi legacy potrebbe richiedere ricompilazione o opzioni addizionali.

8 Esempi di checklist per ruoli

Sysadmin (pre-deploy)

  • Backup completo del master.
  • Installare MySQL su master e slave.
  • Creare directory /etc/mysql/newcerts su entrambi.
  • Generare certificati su master.
  • Trasferire solo i file necessari allo slave.
  • Configurare my.cnf con server-id e binlog.
  • Aprire porte firewall se necessario (3306) solo tra host autorizzati.

DBA (deploy e validazione)

  • Creare utente di replica con REQUIRE SSL.
  • Generare dump coerente e importarli nello slave.
  • Avviare replica e verificare SHOW SLAVE STATUS.
  • Testare failover plan (procedura di promozione dello slave se previsto).

9 Cheatsheed comandi rapidi

Installazione e avvio:

yum install mysql mysql-devel mysql-server
chkconfig --levels 235 mysqld on
/etc/init.d/mysqld start

Controllo SSL:

mysql -u root -p -e "show variables like '%ssl%';"

Generazione certificati (esempio):

cd /etc/mysql/newcerts
openssl genrsa 2048 > ca-key.pem
openssl req -new -x509 -nodes -days 1000 -key ca-key.pem > ca-cert.pem

Dump e trasferimento:

mysqldump -u root -pyourrootsqlpassword --opt exampledb > snapshot.sql
scp snapshot.sql [email protected]:/tmp

Configurazione replica (esempio CHANGE MASTER TO):

CHANGE MASTER TO
  MASTER_HOST='server1.example.com',
  MASTER_USER='slave_user',
  MASTER_PASSWORD='slave_password',
  MASTER_LOG_FILE='mysql-bin.000001',
  MASTER_LOG_POS=3096416,
  MASTER_SSL=1,
  MASTER_SSL_CA='/etc/mysql/newcerts/ca-cert.pem',
  MASTER_SSL_CERT='/etc/mysql/newcerts/client-cert.pem',
  MASTER_SSL_KEY='/etc/mysql/newcerts/client-key.pem';

START SLAVE;

10 Rotazione e manutenzione dei certificati

  • Pianifica la rotazione dei certificati prima della scadenza (nell’esempio sono usati -days 1000). Scegli una scadenza coerente con la tua policy di sicurezza.
  • Aggiorna prima ca-cert.pem su master e poi distribuisci i certificati client aggiornati agli slave.
  • Testa la validità dei nuovi certificati in ambiente di staging prima di distribuirli in produzione.

11 Gestione SELinux e firewall su CentOS

  • SELinux può bloccare l’accesso ai file dei certificati. Se SELinux è abilitato, assegna il contesto corretto o usa semanage/restorecon per i file in /etc/mysql/newcerts.
  • Assicurati che il firewall iptables o firewalld permetta il traffico sulla porta 3306 solo tra master e slave (regola basata su IP).

12 Casi in cui la replica non è una soluzione adatta

  • Non sostituisce il backup: se cancelli accidentalmente dati sul master, la cancellazione si propaga.
  • Non garantisce consistenza trasversale fra più database non replicati insieme.
  • Non è una soluzione a prova di corruzione logica se l’errore applicativo si propaga dal master.

13 Esempi di test di accettazione (acceptance)

  • Dopo aver avviato lo slave, creare una tabella di test su master e verificare che compaia sullo slave.
  • Inserire 100 righe di prova e verificare che il conteggio delle righe sullo slave corrisponda.
  • Arrestare temporaneamente lo slave e poi riavviarlo: verificare che la replica riprenda e non perda eventi.

14 Riepilogo

  • Abbiamo creato e distribuito certificati, abilitato SSL su master e slave, creato l’utente di replica che richiede SSL, generato uno snapshot coerente del database e avviato la replica SSL.
  • Verifica sempre SHOW SLAVE STATUS per controllare lo stato della replica e monitora i log.

Notes

  • Conserva con cura le private key.
  • Testa la procedura in un ambiente di staging prima della produzione.

Fine.

Autore
Redazione

Materiali simili

2FA per OpenVPN AS con WiKID
Sicurezza VPN

2FA per OpenVPN AS con WiKID

Creare checklist in Note (iOS 9, OS X, iCloud)
Guide.

Creare checklist in Note (iOS 9, OS X, iCloud)

Stadium Warzone: sbloccare i 3 Easter Egg
Giochi

Stadium Warzone: sbloccare i 3 Easter Egg

WiKID + OpenVPN AS: guida di integrazione
Sicurezza

WiKID + OpenVPN AS: guida di integrazione

Matrice di Tracciabilità dei Requisiti
QA

Matrice di Tracciabilità dei Requisiti

Configura più monitor: guida pratica
Hardware

Configura più monitor: guida pratica