Guide Open Source

GUIDE E MANUALI DEL MONDO LINUX E CMS

Guide Open Source

GUIDE E MANUALI DEL MONDO LINUX E CMS

Guide Open Source

GUIDE E MANUALI DEL MONDO LINUX E CMS

Come impostare la replica di Database MySQL con crittografia SSL su CentOS 5.4

Questo tutorial descrive come impostare la replica del database in MySQL utilizzando una connessione SSL per la crittografia (per rendere impossibile per gli hacker di fiutare le password e i dati trasferiti tra master e slave). Replica di MySQL permette di avere una copia esatta di un database da un server master su un altro server (slave), e tutti gli aggiornamenti al database sul server master vengono replicati immediatamente al database sul server slave affinché entrambi i database sono sincronizzati. Questo non è un criterio di backup perché un comando elimina accidentalmente rilasciato anche essere eseguito sullo slave; ma la replica può contribuire a proteggere da errori hardware però.

Io non rilasciano alcuna garanzia che questo funziona per voi!

 

1 Nota preliminare

In questo tutorial vi mostrerò come replicare il database exampledb dal server Server1 (master) con l’ indirizzo IP 192.168.0.100 per il server Server2 (slave) con l’indirizzo IP 192.168.0.101. entrambi i sistemi sono in esecuzione CentOS 5.4; Tuttavia, la configurazione dovrebbe applicarsi a quasi tutte le distribuzioni con poca o nessuna modifica. Il database exampledb con tabelle e dati è già esistente sul master, ma non sullo slave.

Questo tutorial copre anche la crittografia SSL per le connessioni dal master allo slave per una maggiore sicurezza.

Io corro tutti i passaggi in questo tutorial con i privilegi di root, quindi assicuratevi che sei loggato come utente root.

 

2 installazione di MySQL 5 e attivando il supporto per SSL

Se non è già installato MySQL 5 su server1 e server2, installarlo ora:

server1/server2:

yum install mysql mysql-devel mysql-server

Poi creiamo i collegamenti di avvio del sistema per MySQL (in modo che MySQL si avvia automaticamente ogni volta che il sistema si avvia) e avviare il server MySQL:

chkconfig – livelli 235 mysqld su
/etc/init.d/mysqld inizio

Correre

Server1:

mysqladmin -u root password yourrootsqlpassword
mysqladmin -h Server1 -u root password yourrootsqlpassword

Server2:

mysqladmin -u root password yourrootsqlpassword
mysqladmin -h Server2 -u root password yourrootsqlpassword

per impostare una password per l’utente root (altrimenti chiunque può accedere al database MySQL!).

Ora dobbiamo controllare se sia MySQL server supportano SSL connessioni. Accedere a MySQL…

server1/server2:

mysql -u root -p

… ed eseguire il seguente comando sulla shell di MySQL:

show variables like '%ssl%';

Se l’output è il seguente (sia have_openssl che have_ssl Visualizza disabili)…

MySQL > show variabili come ‘ssl %’;
+—————+———-+
Nome_variabile | Valore |
+—————+———-+
have_openssl | DISABILI |
have_ssl | DISABILI |
ssl_ca | |
ssl_capath | |
ssl_cert | |
SSL_CIPHER | |
ssl_key | |
+—————+———-+
7 righe nel set (0,01 sec)

MySQL >

… significa che MySQL è stato compilato con il supporto SSL, ma è attualmente non abilitato. Per attivarlo, lasciare la shell di MySQL prima…

quit;

… e aprire /etc/my.cnf:

vi /etc/my.cnf

Aggiungere una riga con la parola ssl alla sezione [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

Riavviare MySQL…

/etc/init.d/mysqld restart

… e controllare di nuovo se SSL è attivato:

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

Output dovrebbe essere come segue il che significa che è ora abilitato SSL:

MySQL > show variabili come ‘ssl %’;
+—————+——-+
Nome_variabile | Valore |
+—————+——-+
have_openssl | SÌ |
have_ssl | SÌ |
ssl_ca | |
ssl_capath | |
ssl_cert | |
SSL_CIPHER | |
ssl_key | |
+—————+——-+
7 righe nel set (0.00 sec)

MySQL >

Tipo…

quit;

… lasciare la shell di MySQL.

 

3 configurazione del Master

Prima creiamo una directory di log per i bin-log di MySQL:

Server1:

mkdir /var/log/mysql
chown mysql /var/log/mysql

Ora creiamo il CA, server e i certificati client che abbiamo bisogno per le connessioni SSL. Creare questi certificati nella directory /etc/mysql/newcerts che devo creare prima:

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

Creare il certificato della CA:

openssl genrsa 2048 > ca-Key. pem
openssl req-new – x 509 – nodi-giorni 1000 – chiave ca-Key. pem > ca-cert. pem

Creare il certificato del server:

openssl req newkey – rsa:2048-giorni 1000 – nodi – keyout server-Key. pem > server-req
Openssl x509 – req-in server-req-giorni 1000 -CA ca-cert. pem-CAkey ca-Key. pem-set_serial 01 > server-cert. pem

Creare il certificato client:

openssl req newkey – rsa:2048-giorni 1000 – nodi – keyout client-Key. pem > client-req
Openssl x509 – req-in client-req-giorni 1000 -CA ca-cert. pem-CAkey ca-Key. pem-set_serial 01 > client-cert. pem

L’output di…

ls -l

… dovrebbe apparire come segue:

[root@server1 newcerts] # ls -l
totale 32
-rw-r – r-1 root root 1375 8 Feb 17:37 ca-cert. pem
-rw-r – r-1 root root 1679 8 Feb 17:37 ca-Key. pem
-rw-r – r-1 root root 1119 8 Feb 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 8 Feb 17:37 client-req
-rw-r – r-1 root root 1119 8 Feb 17:37 server-cert. pem
-rw-r – r-1 root root 1679 8 Feb 17:37 server-Key. pem
-rw-r – r-1 root root 968 8 Feb 17:37 server-req
[root@server1 newcerts] #

Ora dobbiamo trasferire ca-cert. pemclient-cert. pemclient-Key. pem per lo slave (server2); prima di fare questo, creiamo la directory /etc/mysql/newcerts sul server2:

Server2:

mkdir -p /etc/mysql/newcerts

Torna su server1, noi possiamo trasferire i tre file al server2 come segue:

Server1:

scp /etc/mysql/newcerts/ca-cert.pem root@192.168.0.101:/etc/mysql/newcerts
  scp /etc/mysql/newcerts/client-cert.pem root@192.168.0.101:/etc/mysql/newcerts
  scp /etc/mysql/newcerts/client-key.pem root@192.168.0.101:/etc/mysql/newcerts

Quindi, aprire /etc/my.cnf

vi /etc/my.cnf

… e aggiungere le seguenti righe di ssl-cassl-certchiave ssl :

[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

Riavviare MySQL:

/etc/init.d/mysqld restart

Ora abbiamo istituito una replica utente slave_user che può essere utilizzato da server2 per accedere al database MySQL su server1:

mysql -u root -p

La shell di MySQL, eseguire i seguenti comandi:

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

La stringa di Richiedi SSL è facoltativa; Se si lascia fuori, slave_user potranno connettersi tramite connessioni crittografate eanche in chiaro. Se si utilizza SSL richiedono, sono ammessi solo connessioni crittografate.

(Se hai già configurato un utente di replica e ora si desidera modificare in modo che può collegare solo tramite SSL, è possibile modificare l’utente come segue:

GRANT USAGE ON *.* TO 'slave_user'@'%' REQUIRE SSL;

)

PRIVILEGI A FILO;
Esci;

Inoltre dobbiamo dire MySQL per database che dovrebbe scrivere i log (questi registri vengono utilizzati dallo slave per vedere cosa è cambiato sul master), file di log che dovrebbe usare, e dobbiamo specificare che il server MySQL è il maestro. Che vogliamo replicare il database exampledb, così aggiungiamo le linee id serverlog_binexpire_logs_daysmax_binlog_sizebinlog_do_db in /etc/my.cnf (nella [ mysqld] sezione):

vi /etc/my.cnf
[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
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

Quindi riavviare MySQL:

/etc/init.d/mysqld restart

Successiva di bloccare il database exampledb su server1, scoprire lo stato maestro del server1, creare un dump SQL di exampledb (che abbiamo verrà importata in exampledb su server2 , così che sia i database contengono gli stessi dati) e sbloccare il database in modo che può essere utilizzato nuovamente:

mysql -u root -p 

La shell di MySQL, eseguire i seguenti comandi:

USO exampledb;
SVUOTARE LE TABELLE CON BLOCCO DI LETTURA;
MOSTRARE LO STATO DI MASTER;

L’ultimo comando dovrebbe mostrare qualcosa come questo (si prega di scrivere giù, abbiamo bisogno più tardi):

MySQL > mostrare lo stato del MASTER;
+——————+———-+————–+——————+
File | Posizione | Binlog_Do_DB | Binlog_Ignore_DB |
+——————+———-+————–+——————+
MySQL-bin.000001 | 3096416 | exampledb | |
+——————+———-+————–+——————+
1 riga in set (0.00 sec)

MySQL >

Ora non lasciare la shell di MySQL, perché se si lascia, verrà rimosso il blocco del database, e questo è non quello che vogliamo in questo momento perché dobbiamo creare un dump di database in questo momento. Mentre la shell di MySQL è ancora aperta, abbiamo aperto una seconda finestra di riga di comando dove creare il dump SQL snapshot.sql e trasferirlo su server2(utilizzando scp; ancora una volta, assicurarsi che l’account di root è abilitato su server2):

Server1:

CD/tmp
mysqldump -u root – pyourrootsqlpassword – opt exampledb > snapshot.sql
SCP snapshot.sql root@192.168.0.101: / tmp

In seguito, è possibile chiudere la seconda finestra della riga di comando. Nella prima finestra della riga di comando, possiamo ora sbloccare il database e lasciare la shell di MySQL:

Server1:

SBLOCCARE LE TABELLE; 
Esci;

4 configurazione Slave

Ora dobbiamo configurare lo slave. Aprire /etc/my.cnf e assicurarsi di che avere le seguenti impostazioni (id servermaster-Collegare-Riprovareplicare–db) nella sezione [mysqld] :

Server2:

vi /etc/my.cnf
[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
server-id=2
master-connect-retry=60
replicate-do-db=exampledb

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

Il valore di id del server dovrà essere univoci e così diverso da quello sul master!

Riavviare MySQL in seguito:

/etc/init.d/mysqld restart

Prima di iniziare a impostare la replica, creiamo un database vuoto exampledb su server2:

mysql -u root -p

CREATE DATABASE exampledb;
Esci;

Sul server2, ora possiamo importare il dump SQL snapshot.sql come questo:

/usr/bin/mysqladmin – user = root – password = yourrootsqlpassword fermata-slave
CD/tmp
mysql -u root – pyourrootsqlpassword exampledb < snapshot.sql

Ora connettersi a MySQL di nuovo…

mysql -u root -p

… ed eseguire il seguente comando per rendere server2 uno schiavo del server1 (è importante sostituire i valori nel seguente comando con i valori che avete ottenuto dallo STATUS di MASTER SHOW; comando che abbiamo eseguito sul server1!):

CHANGE MASTER TO MASTER_HOST='192.168.0.100', 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';
  • MASTER_HOST è l’indirizzo IP o l’hostname del master (in questo esempio è 192.168.0.100).
  • MASTER_USER è l’utente che abbiamo concesso privilegi di replica sul master.
  • MASTER_PASSWORD è la password di MASTER_USER sul master.
  • MASTER_LOG_FILE è il file che MySQL dato indietro quando è stato eseguito Lo stato MASTER SHOW; sul master.
  • MASTER_LOG_POS è la posizione che MySQL ha dato indietro quando è stato eseguito Lo stato MASTER SHOW; sul master.
  • MASTER_SSL rende lo schiavo di utilizzare una connessione SSL al master.
  • MASTER_SSL_CA è il percorso del file ca-cert. pem sullo slave.
  • MASTER_SSL_CERT è il percorso del file client-cert. pem sullo slave.
  • MASTER_SSL_KEY è il percorso del file client-Key. pem sullo slave.

Infine avviare lo schiavo:

START SLAVE;

Quindi verificare lo stato di schiavo:

SHOW SLAVE STATUS \G

È importante che sia Slave_IO_Running e Slave_SQL_Running hanno il valore  nell’output (altrimenti qualcosa è andato storto, e si dovrebbe controllare la configurazione di nuovo e dare un’occhiata a /var/log/syslog per scoprire su eventuali errori); come si sta utilizzando una connessione SSL ora, si dovrebbero anche trovare i valori nei campi Master_SSL_AllowedMaster_SSL_CA_FileMaster_SSL_CertMaster_SSL_Key:

MySQL > SHOW SLAVE STATUS \G
1. riga * * *
Slave_IO_State: Aspettano il padrone inviare eventi
Master_Host: 192.168.0.100
Master_User: slave_user
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 3096416
Relay_Log_File: mysqld-relay-bin.000002
Relay_Log_Pos: 235
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: Sì
Slave_SQL_Running: Sì
Replicate_Do_DB: exampledb
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 3096416
Relay_Log_Space: 235
Until_Condition: nessuno
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: Sì
Master_SSL_CA_File: /etc/mysql/newcerts/ca-cert.pem
Master_SSL_CA_Path:
Master_SSL_Cert: /etc/mysql/newcerts/client-cert.pem
Master_SSL_Cipher:
Master_SSL_Key: /etc/mysql/newcerts/client-key.pem
Seconds_Behind_Master: 0
1 riga in set (0.00 sec)

MySQL >

In seguito, è possibile lasciare la shell di MySQL su server2:

quit;

Questo è tutto! Ora ogni volta che exampledb viene aggiornato sul master, tutte le modifiche verranno replicate per exampledbsullo slave. Test!

 

Piaciuto l'articolo? Condividilo sui social!

Share on facebook
Facebook
Share on twitter
Twitter
Share on linkedin
LinkedIn
Share on whatsapp
WhatsApp