Configuração de criptografia do MySQL
Visão geral
Esta seção fornece vários exemplos de configuração de criptografia para CentOS 8.2 e MySQL 8.4.0 e pode ser usada como um guia de início rápido para criptografar a conexão com o banco de dados.
Se o host do MySQL estiver definido como localhost, as opções de criptografia não estarão disponíveis. Nesse caso, uma conexão entre o frontend do Zabbix e o banco de dados usa um arquivo de socket (no Unix) ou memória compartilhada (no Windows) e não pode ser criptografada.
A lista de combinações de criptografia não se limita às listadas nesta página. Há muitas outras combinações disponíveis.
Pré-requisitos
Instale o banco de dados MySQL a partir do repositório oficial.
Consulte a documentação do MySQL para obter detalhes sobre como usar o repositório do MySQL.
O server MySQL está pronto para aceitar conexões seguras usando um certificado autoassinado.
Para ver quais usuários estão usando uma conexão criptografada, execute a seguinte consulta (o Performance Schema deve estar ativado):
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;
Criptografia apenas de transporte
Configuração do MySQL
As versões modernas do banco de dados já estão prontas para o modo de criptografia required encryption mode por padrão.
Um certificado do lado do server será criado após a configuração e a inicialização iniciais.
Crie usuários e roles para os principais componentes:
mysql> CREATE USER
'zbx_srv'@'%' IDENTIFIED WITH caching_sha2_password BY '<strong_password>',
'zbx_web'@'%' IDENTIFIED WITH caching_sha2_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'@'%';
Observe que o protocolo X.509 não é usado para verificar a identidade, mas o usuário é configurado para usar apenas conexões criptografadas. Consulte a documentação do MySQL para mais detalhes sobre a configuração de usuários.
Execute para verificar a conexão (a conexão por socket não pode ser usada para testar conexões seguras):
mysql -u zbx_srv -p -h 10.211.55.9 --ssl-mode=REQUIRED
Verifique o status atual e os conjuntos de cifras disponíveis:
mysql> status
--------------
mysql Ver 8.4.0 for Linux on x86_64 (MySQL Community Server - GPL)
Connection id: 62
Current database:
Current user: [email protected]
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
frontend
Para habilitar a criptografia apenas de transporte para conexões entre o frontend do Zabbix e o banco de dados:
- Marque Database TLS encryption
- Deixe Verify database certificate desmarcado

Server
Para habilitar a criptografia somente de transporte para conexões entre o server e o banco de dados, edite o arquivo de configuração do server:
...
DBHost=10.211.55.9
DBName=zabbix
DBUser=zbx_srv
DBPassword=<strong_password>
DBTLSConnect=required
...
Criptografia com verificação da autoridade certificadora
Copie a CA do MySQL necessária para o server frontend do Zabbix e atribua as permissões adequadas para permitir que o servidor web leia este arquivo.
Este modo não funciona no RHEL 7 devido a bibliotecas MySQL mais antigas.
frontend
Para habilitar a criptografia com verificação de certificado nas conexões entre o frontend do Zabbix e o banco de dados:
- Marque Criptografia TLS do banco de dados e Verificar certificado do banco de dados
- Especifique o caminho para o arquivo de CA do TLS do banco de dados

Como alternativa, isso pode ser definido no arquivo de configuração do frontend (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'] = '';
...
Solucione problemas usando a ferramenta de linha de comando para verificar se a conexão é possível para o usuário necessário:
mysql -u zbx_web -p -h 10.211.55.9 --ssl-mode=REQUIRED --ssl-ca=/var/lib/mysql/ca.pem
Server
Para habilitar a criptografia com verificação de certificado nas conexões entre o Zabbix server e o banco de dados, edite o arquivo de configuração do server:
...
DBHost=10.211.55.9
DBName=zabbix
DBUser=zbx_srv
DBPassword=<strong_password>
DBTLSConnect=verify_ca
DBTLSCAFile=/etc/ssl/mysql/ca.pem
...
Criptografia com verificação completa
Configuração do MySQL
Defina a opção de configuração do servidor MySQL CE (/etc/my.cnf.d/server-tls.cnf) como:
[mysqld]
...
# neste exemplo, as chaves estão localizadas no diretório datadir do MySQL CE
ssl_ca=ca.pem
ssl_cert=server-cert.pem
ssl_key=server-key.pem
require_secure_transport=ON
tls_version=TLSv1.3
...
As chaves para o servidor MySQL CE e para o cliente (frontend do Zabbix) devem ser criadas manualmente de acordo com a documentação do MySQL CE: Creating SSL and RSA certificates and keys using MySQL ou Creating SSL certificates and keys using openssl
O certificado do servidor MySQL deve conter o campo Common Name definido como o nome FQDN, pois o frontend do Zabbix usará o nome DNS para se comunicar com o banco de dados ou o endereço IP do host do banco de dados.
Crie o usuário MySQL:
mysql> CREATE USER
'zbx_srv'@'%' IDENTIFIED WITH caching_sha2_password BY '<strong_password>',
'zbx_web'@'%' IDENTIFIED WITH caching_sha2_password BY '<strong_password>'
REQUIRE X509
PASSWORD HISTORY 5;
Verifique se é possível fazer login com esse usuário:
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
Frontend
Para habilitar a criptografia com verificação completa nas conexões entre o frontend do Zabbix e o banco de dados:
- Marque Criptografia TLS do banco de dados e Verificar certificado do banco de dados
- Especifique o caminho para o arquivo de chave TLS do banco de dados
- Especifique o caminho para o arquivo de CA TLS do banco de dados
- Especifique o caminho para o arquivo de certificado TLS do banco de dados
Observe que Verificação do host do banco de dados está marcada e desabilitada - essa etapa não pode ser ignorada para o MySQL.
Se o campo Lista de cifras TLS do banco de dados estiver vazio, serão habilitadas as cifras comuns permitidas tanto pelo frontend (cliente) quanto pelo server. Como alternativa, as cifras podem ser definidas explicitamente, de acordo com os requisitos de configuração de cifras.

Como alternativa, isso pode ser definido no arquivo de configuração do frontend (zabbix.conf.php):
...
// Usado para conexão TLS com uma lista de cifras estritamente definida.
$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';
...
// ou
...
// Usado para conexão TLS sem uma lista de cifras definida - selecionada pelo 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'] = '';
...
Server
Para habilitar a criptografia com verificação completa das conexões entre o Zabbix server e o banco de dados, edite o arquivo de configuração do server:
...
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
...