[comment]: # ({f745f323-f745f323})
# 1 Configurazione della crittografia MySQL

[comment]: # ({/f745f323-f745f323})

[comment]: # ({ef7f6a8e-f87c5964})
### Panoramica

Questa sezione fornisce diversi esempi di configurazione della crittografia per
CentOS 8.2 e MySQL 8.0.30 e può essere usata come guida rapida per
crittografare la connessione al database.

::: noteimportant
 Se
host MySQL è impostato su localhost, le opzioni di crittografia non saranno
disponibili. In questo caso, una connessione tra frontend Zabbix e il
database utilizza un file socket (su Unix) o la memoria condivisa (su Windows) e
non può essere crittografata.
::: 

::: noteclassic
 L'elenco delle combinazioni di crittografia
non è limitato a quelle elencate in questa pagina. Sono disponibili molte
altre combinazioni.
:::

[comment]: # ({/ef7f6a8e-f87c5964})

[comment]: # ({30b5ee7b-30b5ee7b})
### Prerequisiti

Installa il database MySQL dal [repository ufficiale](https://dev.mysql.com/downloads/repo/yum/).

Consulta la [documentazione MySQL](https://dev.mysql.com/doc/mysql-yum-repo-quick-guide/en/) per i dettagli su come utilizzare il repository MySQL.

Il server MySQL è pronto ad accettare connessioni sicure utilizzando un certificato autofirmato.

Per vedere quali utenti stanno utilizzando una connessione crittografata, esegui la seguente query (Performance Schema deve essere attivato):

    mysql> SELECT sbt.variable_value AS tls_version, t2.variable_value AS cipher, processlist_user AS user, processlist_host AS host 
            FROM performance_schema.status_by_thread  AS sbt
            JOIN performance_schema.threads AS t ON t.thread_id = sbt.thread_id
            JOIN performance_schema.status_by_thread AS t2 ON t2.thread_id = t.thread_id
            WHERE sbt.variable_name = 'Ssl_version' and t2.variable_name = 'Ssl_cipher'
            ORDER BY tls_version;

[comment]: # ({/30b5ee7b-30b5ee7b})

[comment]: # ({7b44fd81-fda36821})
### Crittografia solo del trasporto

[comment]: # ({/7b44fd81-fda36821})

[comment]: # ({e7c676d6-9ebeae19})
#### Configurazione MySQL

Le versioni moderne del database sono pronte all'uso per la modalità di [crittografia](/manual/appendix/install/db_encrypt#terminology) `required`. Un certificato lato server verrà creato dopo la configurazione iniziale e l'avvio.

Creare utenti e ruoli per i componenti principali:

::: noteimportant
Per le versioni di MySQL 8.4+, `caching_sha2_password` deve essere utilizzato al posto di `mysql_native_password`.
:::

```mysql
mysql> CREATE USER
 'zbx_srv'@'%' IDENTIFIED WITH mysql_native_password BY '<strong_password>',
 'zbx_web'@'%' IDENTIFIED WITH mysql_native_password BY '<strong_password>'
 REQUIRE SSL
 PASSWORD HISTORY 5; 

mysql> CREATE ROLE 'zbx_srv_role', 'zbx_web_role'; 

mysql> GRANT SELECT, UPDATE, DELETE, INSERT, CREATE, DROP, ALTER, INDEX, REFERENCES ON zabbix.* TO 'zbx_srv_role'; 
mysql> GRANT SELECT, UPDATE, DELETE, INSERT ON zabbix.* TO 'zbx_web_role'; 

mysql> GRANT 'zbx_srv_role' TO 'zbx_srv'@'%'; 
mysql> GRANT 'zbx_web_role' TO 'zbx_web'@'%'; 

mysql> SET DEFAULT ROLE 'zbx_srv_role' TO 'zbx_srv'@'%'; 
mysql> SET DEFAULT ROLE 'zbx_web_role' TO 'zbx_web'@'%';
```

Si noti che il protocollo X.509 non viene utilizzato per verificare l'identità, ma l'utente è configurato per usare solo connessioni crittografate. Consultare la [documentazione MySQL](https://dev.mysql.com/doc/refman/8.0/en/create-user.html#create-user-tls) per ulteriori dettagli sulla configurazione degli utenti.

Eseguire il comando seguente per verificare la connessione (non è possibile usare una connessione socket per testare connessioni sicure):

    mysql -u zbx_srv -p -h 10.211.55.9 --ssl-mode=REQUIRED 

Verificare lo stato corrente e le suite di cifratura disponibili:

    mysql> status
    --------------
    mysql Ver 8.0.21 for Linux on x86_64 (MySQL Community Server - GPL)

    Connection id: 62
    Current database:
    Current user: zbx_srv@bfdb.local
    SSL: Cipher in use is TLS_AES_256_GCM_SHA384


    mysql> SHOW SESSION STATUS LIKE 'Ssl_cipher_list'\G;
    *************************** 1. row ***************************
    Variable_name: Ssl_cipher_list
    Value: TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256:TLS_AES_128_CCM_SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:DHE-RSA-AES128-SHA256:DHE-DSS-AES128-SHA256:DHE-DSS-AES256-GCM-SHA384:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-DSS-AES128-SHA:DHE-RSA-AES128-SHA:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES256-SHA:CAMELLIA256-SHA:CAMELLIA128-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA
    1 row in set (0.00 sec)

    ERROR:
    No query specified

[comment]: # ({/e7c676d6-9ebeae19})

[comment]: # ({68afdcc8-68afdcc8})
#### Frontend

Per abilitare la crittografia solo del trasporto per le connessioni tra il frontend di Zabbix e il database:

-   Seleziona *Database TLS encryption*
-   Lascia deselezionato *Verify database certificate*

![](../../../../../assets/en/manual/appendix/install/encrypt_db_transport.png){width="600"}

[comment]: # ({/68afdcc8-68afdcc8})

[comment]: # ({99c0e65b-99c0e65b})
#### Server

Per abilitare la crittografia solo per il trasporto nelle connessioni tra server e
il database, configura */etc/zabbix/zabbix\_server.conf*:

    ...
    DBHost=10.211.55.9
    DBName=zabbix
    DBUser=zbx_srv
    DBPassword=<strong_password>
    DBTLSConnect=required
    ...

[comment]: # ({/99c0e65b-99c0e65b})

[comment]: # ({baccf022-82e1ed59})
### Crittografia con verifica dell'autorità di certificazione

Copia il CA MySQL richiesto sul server frontend di Zabbix e assegna i
permessi appropriati per consentire al webserver di leggere questo file.

::: noteclassic
 Questa modalità non funziona su SLES 12 e RHEL 7 a causa di
librerie MySQL più datate.
:::

[comment]: # ({/baccf022-82e1ed59})

[comment]: # ({f7df2e5a-9776435f})
#### Frontend

Per abilitare la crittografia con verifica del certificato per le connessioni
tra il frontend di Zabbix e il database:

-   Seleziona *Database TLS encryption* e *Verify database certificate*
-   Specifica il percorso del file Database TLS CA

![](../../../../../assets/en/manual/appendix/install/encrypt_db_verify_ca.png){width="600"}

In alternativa, questa impostazione può essere definita in */etc/zabbix/web/zabbix.conf.php*:

    ...
    $DB['ENCRYPTION'] = true;
    $DB['KEY_FILE'] = '';
    $DB['CERT_FILE'] = '';
    $DB['CA_FILE'] = '/etc/ssl/mysql/ca.pem';
    $DB['VERIFY_HOST'] = false;
    $DB['CIPHER_LIST'] = '';
    ...

Per risolvere i problemi dell'utente, usa uno strumento da riga di comando per verificare se la connessione è
possibile per l'utente richiesto:

    mysql -u zbx_web -p -h 10.211.55.9 --ssl-mode=REQUIRED --ssl-ca=/var/lib/mysql/ca.pem

[comment]: # ({/f7df2e5a-9776435f})

[comment]: # ({a7a54f92-a7a54f92})
#### Server

Per abilitare la crittografia con verifica del certificato per le connessioni
tra Zabbix server e il database, configurare
*/etc/zabbix/zabbix\_server.conf*:

    ...
    DBHost=10.211.55.9
    DBName=zabbix
    DBUser=zbx_srv
    DBPassword=<strong_password>
    DBTLSConnect=verify_ca
    DBTLSCAFile=/etc/ssl/mysql/ca.pem
    ...

[comment]: # ({/a7a54f92-a7a54f92})

[comment]: # ({edf12bed-fa5d4760})
### Crittografia con verifica completa

[comment]: # ({/edf12bed-fa5d4760})

[comment]: # ({7d0dc4f4-22fb0ddd})
#### Configurazione MySQL

Impostare l'opzione di configurazione del server MySQL CE
(`*/etc/my.cnf.d/server-tls.cnf*`) su:

    [mysqld]
    ...
    # in questi esempi le chiavi si trovano nella directory datadir di MySQL CE
    ssl_ca=ca.pem
    ssl_cert=server-cert.pem
    ssl_key=server-key.pem

    require_secure_transport=ON
    tls_version=TLSv1.3
    ...

Le chiavi per il server e il client MySQL CE (frontend di Zabbix) devono essere
create manualmente in base alla documentazione di MySQL CE: [Creating SSL
and RSA certificates and keys using
MySQL](https://dev.mysql.com/doc/refman/8.0/en/creating-ssl-rsa-files-using-mysql.html) oppure
[Creating SSL certificates and keys using
openssl](https://dev.mysql.com/doc/refman/5.7/en/creating-ssl-files-using-openssl.html)

::: noteimportant
 Il certificato del server MySQL deve contenere il campo
Common Name impostato sul nome FQDN, poiché il frontend di Zabbix utilizzerà il
nome DNS per comunicare con il database oppure l'indirizzo IP dell'host
del database.
:::

Creare l'utente MySQL:

::: noteimportant
Per le versioni di MySQL 8.4+, `caching_sha2_password` deve essere usato al posto di `mysql_native_password`.
:::

```mysql
mysql> CREATE USER
  'zbx_srv'@'%' IDENTIFIED WITH mysql_native_password BY '<strong_password>',
  'zbx_web'@'%' IDENTIFIED WITH mysql_native_password BY '<strong_password>'
  REQUIRE X509
  PASSWORD HISTORY 5;
```

Verificare se è possibile accedere con quell'utente:

    mysql -u zbx_web -p -h 10.211.55.9 --ssl-mode=VERIFY_IDENTITY --ssl-ca=/var/lib/mysql/ca.pem --ssl-cert=/var/lib/mysql/client-cert.pem --ssl-key=/var/lib/mysql/client-key.pem

[comment]: # ({/7d0dc4f4-22fb0ddd})

[comment]: # ({86a97b70-2f3a5c57})
#### Frontend

Per abilitare la crittografia con verifica completa per le connessioni tra
il frontend di Zabbix e il database:

-   Seleziona *Database TLS encryption* e *Verify database certificate*
-   Specifica il percorso del file *Database TLS key file*
-   Specifica il percorso del file *Database TLS CA file*
-   Specifica il percorso del file *Database TLS certificate file*

Nota che *Database host verification* è selezionato e disattivato in grigio - questo
passaggio non può essere saltato per MySQL. 

::: notewarning
 Se il campo *Database TLS cipher list* viene lasciato vuoto, verranno abilitati i cifrari comuni consentiti sia dal frontend (client) sia dal server.
 In alternativa, i cifrari possono essere impostati esplicitamente, in conformità con i
 [requisiti di configurazione dei cifrari](https://dev.mysql.com/doc/refman/8.0/en/encrypted-connection-protocols-ciphers.html#encrypted-connection-cipher-configuration).
:::

![](../../../../../assets/en/manual/appendix/install/encrypt_db_verify_full1.png){width=600}

In alternativa, questo può essere impostato in */etc/zabbix/web/zabbix.conf.php*:

    ...
    // Usato per la connessione TLS con elenco di Cipher strettamente definito.
    $DB['ENCRYPTION'] = true;
    $DB['KEY_FILE'] = '/etc/ssl/mysql/client-key.pem';
    $DB['CERT_FILE'] = '/etc/ssl/mysql/client-cert.pem';
    $DB['CA_FILE'] = '/etc/ssl/mysql/ca.pem';
    $DB['VERIFY_HOST'] = true;
    $DB['CIPHER_LIST'] = 'TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256:TLS_AES_128_CCM_SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-GC';
    ...
    // oppure
    ...
    // Usato per la connessione TLS senza elenco di Cipher definito - selezionato dal server MySQL
    $DB['ENCRYPTION'] = true;
    $DB['KEY_FILE'] = '/etc/ssl/mysql/client-key.pem';
    $DB['CERT_FILE'] = '/etc/ssl/mysql/client-cert.pem';
    $DB['CA_FILE'] = '/etc/ssl/mysql/ca.pem';
    $DB['VERIFY_HOST'] = true;
    $DB['CIPHER_LIST'] = '';
    ...

[comment]: # ({/86a97b70-2f3a5c57})

[comment]: # ({c0090000-c0090000})
#### Server

Per abilitare la crittografia con verifica completa per le connessioni tra
Zabbix server e il database, configura
*/etc/zabbix/zabbix\_server.conf*:

    ...
    DBHost=10.211.55.9
    DBName=zabbix
    DBUser=zbx_srv
    DBPassword=<strong_password>
    DBTLSConnect=verify_full
    DBTLSCAFile=/etc/ssl/mysql/ca.pem
    DBTLSCertFile=/etc/ssl/mysql/client-cert.pem
    DBTLSKeyFile=/etc/ssl/mysql/client-key.pem
    ...

[comment]: # ({/c0090000-c0090000})
