Criptare la comunicazione tra i nodi di un Cluster Galera con MySQL
Per rendere sicura la comunicazione tra client e server e tra gli stessi server che compongono un Cluster Galera si può (e si deve) agire a diversi livelli.
- Firewall
- SELinux
- Encryption
Per quanto riguarda le configurazioni Firewall e SELinux per abilitare l’accesso alle porte TCP e UDP specifiche, usate per la comunicazione con MySQL ed in generale per le operazioni di replica del Cluster Galera vi rimando al post Galera Cluster per MySQL, dove c’è un apposito paragrafo con tutti i dettagli di configurazione.
Qui ci concentreremo invece sulle configurazioni necessarie a rendere criptata la comunicazione tra client e server MySQL e tra i nodi del Cluster stesso.
Configurazioni SSL
Sia MySQL che Galera Cluster supportano SSL per l’encryption della comunicazione, che deve essere attivata su tutti i nodi che compongono il cluster. Per attivare SSL è necessario ovviamente disporre dei certificati per i quali vi rimando a Galera Cluster SSL Certificates pagina specifica per lo scenario Galera Cluster, ma in generale trovate tutte le informazioni necessarie in giro per il web.
L’uso di SSL deve essere abilitato a tre livelli: traffico tra client e database server, traffico di replica tra i nodi e traffico SST (copia completa verso un nuovo nodo).
MySQL database
Nel file /etc/my.cnf aggiungiamo i parametri specifici:
[mysqld]
ssl_ca=/path/to/ca-cert.pem
ssl_key=/path/to/server-key.pem
ssl_cert=/path/to/server-cert.pem
require_secure_transport=ON
- ssl_ca è il file con la Certificate Authority (CA)
- ssl_key è la private key
- ssl_cert è il file con il certificato
- require_secure_transport opzione necessaria per impostare SSL come required
Una volta configurati certificati e private key, la comunicazione non sicura non viene disabilitata di defautl. Per forzare il solo utilizzo di SSL è necessario aggiungere l’opzione require_secure_transport=ON.
Galera Cluster replica
Per abilitare SSL nello scambio dati tra i nodi del cluster aggiungiamo le opzioni SSL al parametro wsrep_provider_options:
wsrep_provider_options="socket.ssl_key=/path/to/server-key.pem; socket.ssl_cert=/path/to/server-cert.pem; socket.ssl_ca=/path/to/cacert.pem"
- socket.ssl_key è la private key
- socket.ssl_cert è il file con il certificato
- socket.ssl_ca è il file con la Certificate Authority (CA)
In aggiunta è possibile aggiungere anche l’opzione socket.ssl_cipher per modificare l’SSL chiper usato di default, è possibile configuare tutti i chiper disponibili sulla versione della libreria SSL installata sul server.
Galera Cluster SST - State Snapshot Transfers
SST o State Snapshot Transfers è l’operazione con cui un nuovo nodo aggiunto al cluster riceve la copia completa dei dati da uno dei membri del cluster. Il modo in cui ciò avviene dipende dal metodo configurato per tale operazione. Nel mio caso ho scelto di utilizzare rsync, configurato nel parametro wsrep_sst_method. Galera Cluster supporta SSL per il metodo rsync a aprtire dalla versione 8.0.25.
...
wsrep_sst_method=rsync
...
In questo caso, se i parametri SSL (private key, certificato e CA) sono già presenti nella sezione [mysqld] del file di configurazione /etc/my.cnf non è necessario aggiungere altro, altrimenti possono essere aggiunti gli stessi parametri in usa sezione [sst].