17 min de leitura · Guia técnico
Checklist de segurança para MySQL 8.0 é um conjunto de verificações e configurações obrigatórias que devem ser aplicadas antes de expor qualquer banco de dados a um ambiente de produção. Ignorar essas etapas deixa o servidor vulnerável a ataques de força bruta, escalada de privilégios e vazamento de dados. Para aplicar o checklist completo, siga estes passos:
- Execute
mysql_secure_installationimediatamente após a instalação - Restrinja o bind-address para
127.0.0.1no arquivo de configuração - Remova usuários anônimos e o banco de dados
test - Crie usuários com privilégios mínimos por aplicação
- Habilite logs de auditoria e slow query
- Configure firewall e criptografia em trânsito com TLS
Pré-requisitos para aplicar o checklist de segurança do MySQL 8.0
- MySQL 8.0 instalado em AlmaLinux 9, Rocky Linux 9, Debian 12 ou Ubuntu 24.04 LTS
- Acesso root ao sistema operacional via SSH
- Acesso ao usuário
rootdo MySQL (senha definida durante a instalação) - Editor de texto disponível:
nanoouvim - Firewall ativo:
firewalld(AlmaLinux/Rocky) ouufw(Debian/Ubuntu) - Permissão para reiniciar o serviço
mysqldoumysql
Checklist de segurança MySQL 8.0: hardening inicial obrigatório
O primeiro passo do hardening do MySQL 8.0 é executar o script de segurança interativo fornecido pelo próprio pacote. Esse script elimina as configurações padrão mais exploradas por atacantes em servidores recém-instalados.
Conecte ao servidor via SSH e execute:
sudo mysql_secure_installation
O script fará as seguintes perguntas interativas — responda conforme indicado:
Securing the MySQL server deployment.
Enter password for user root: [senha atual]
VALIDATE PASSWORD COMPONENT can be used to test passwords...
Press y|Y for Yes, any other key for No: Y
Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG: 2
Change the password for root? (Press y|Y for Yes): Y
New password: [senha forte]
Re-enter new password: [repita]
Remove anonymous users? (Press y|Y for Yes): Y
... Success!
Disallow root login remotely? (Press y|Y for Yes): Y
... Success!
Remove test database and access to it? (Press y|Y for Yes): Y
... Success!
Reload privilege tables now? (Press y|Y for Yes): Y
... Success!
Após concluir, verifique se o login root local ainda funciona:
sudo mysql -u root -p
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.x MySQL Community Server - GPL
Se você gerencia o MySQL via cPanel, consulte o artigo Conectando remotamente ao MySQL - cPanel para entender como as permissões de acesso remoto funcionam nesse ambiente.
Restringir bind-address e desabilitar conexões externas desnecessárias
Limitar a interface de escuta do daemon é uma das medidas de isolamento de rede mais eficazes no MySQL 8.0. Por padrão, dependendo da distribuição, o MySQL pode escutar em todas as interfaces (0.0.0.0), expondo a porta 3306 para a internet.
Localize o arquivo de configuração correto para sua distribuição:
- Debian 12 / Ubuntu 24.04:
/etc/mysql/mysql.conf.d/mysqld.cnf - AlmaLinux 9 / Rocky Linux 9:
/etc/my.cnfou/etc/my.cnf.d/mysql-server.cnf
Abra o arquivo e localize ou adicione a diretiva bind-address:
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld]
bind-address = 127.0.0.1
mysqlx-bind-address = 127.0.0.1
Atenção: a diretiva mysqlx-bind-address controla o protocolo X (porta 33060), usado por conectores modernos. Restrinja-a também se não utilizar esse protocolo.
Reinicie o serviço para aplicar:
sudo systemctl restart mysql
Confirme que a porta 3306 não está mais acessível externamente:
ss -tlnp | grep 3306
LISTEN 0 151 127.0.0.1:3306 0.0.0.0:* users:(("mysqld",pid=1234,fd=23))
O endereço 127.0.0.1 na coluna Local Address confirma que o MySQL escuta apenas no loopback.
Gerenciamento de privilégios e criação de usuários com acesso mínimo
O princípio do menor privilégio é fundamental na proteção de bancos de dados MySQL 8.0 em produção. Cada aplicação deve ter seu próprio usuário com acesso restrito apenas ao banco de dados que utiliza.
Conecte ao MySQL como root e liste os usuários existentes com privilégios elevados:
SELECT user, host, Super_priv, Grant_priv FROM mysql.user WHERE Super_priv = 'Y' OR Grant_priv = 'Y';
+------------------+-----------+------------+------------+
| user | host | Super_priv | Grant_priv |
+------------------+-----------+------------+------------+
| root | localhost | Y | Y |
+------------------+-----------+------------+------------+
Apenas o usuário root local deve aparecer com Super_priv = Y. Se outros usuários aparecerem, revogue os privilégios desnecessários:
Atenção: o comando REVOKE é irreversível para a sessão atual. Confirme os privilégios antes de executar.
REVOKE ALL PRIVILEGES ON *.* FROM 'usuario_suspeito'@'%';
FLUSH PRIVILEGES;
Crie um usuário dedicado para cada aplicação com privilégios mínimos:
CREATE USER 'app_producao'@'localhost' IDENTIFIED BY 'SenhaForte@2024!';
GRANT SELECT, INSERT, UPDATE, DELETE ON meu_banco.* TO 'app_producao'@'localhost';
FLUSH PRIVILEGES;
Verifique os privilégios concedidos:
SHOW GRANTS FOR 'app_producao'@'localhost';
+------------------------------------------------------------------------------------+
| Grants for app_producao@localhost |
+------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO `app_producao`@`localhost` |
| GRANT SELECT, INSERT, UPDATE, DELETE ON `meu_banco`.* TO `app_producao`@`localhost`|
+------------------------------------------------------------------------------------+
Nunca conceda ALL PRIVILEGES ON *.* para usuários de aplicação. Esse padrão é uma das causas mais comuns de comprometimento total de banco de dados em servidores de produção.
Autenticação segura e plugin caching_sha2_password no MySQL 8.0
O MySQL 8.0 introduziu o plugin caching_sha2_password como método de autenticação padrão, substituindo o mysql_native_password das versões 5.x e 5.7. Essa mudança impacta diretamente a compatibilidade com clientes e drivers mais antigos.
Verifique qual plugin de autenticação cada usuário utiliza:
SELECT user, host, plugin FROM mysql.user;
+------------------+-----------+-----------------------+
| user | host | plugin |
+------------------+-----------+-----------------------+
| root | localhost | caching_sha2_password |
| app_producao | localhost | caching_sha2_password |
+------------------+-----------+-----------------------+
Se um cliente legado não suportar caching_sha2_password, você pode alterar o plugin de um usuário específico sem degradar a segurança global:
ALTER USER 'app_legada'@'localhost' IDENTIFIED WITH mysql_native_password BY 'SenhaForte@2024!';
FLUSH PRIVILEGES;
Para reforçar a política de senhas, verifique o componente validate_password:
SHOW VARIABLES LIKE 'validate_password%';
+--------------------------------------+--------+
| Variable_name | Value |
+--------------------------------------+--------+
| validate_password.length | 12 |
| validate_password.mixed_case_count | 1 |
| validate_password.number_count | 1 |
| validate_password.policy | STRONG |
| validate_password.special_char_count | 1 |
+--------------------------------------+--------+
Se o componente não estiver ativo, instale-o:
INSTALL COMPONENT 'file://component_validate_password';
Defina a política como STRONG no arquivo de configuração para persistir após reinicializações:
[mysqld]
validate_password.policy = STRONG
validate_password.length = 12
Habilitando logs de auditoria e slow query no MySQL 8.0 Community
O monitoramento de queries é essencial para detectar acessos suspeitos e consultas que degradam a performance antes de ir ao ar. Na versão Community do MySQL 8.0, o log de auditoria completo requer configuração manual.
Edite o arquivo de configuração e adicione as diretivas de log:
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld]
general_log = 1
general_log_file = /var/log/mysql/general.log
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 2
log_queries_not_using_indexes = 1
Atenção: o general_log registra todas as queries e pode gerar arquivos de log muito grandes em produção com alto volume de requisições. Considere habilitá-lo temporariamente para auditoria e desabilitar após a verificação.
Crie o diretório de log com as permissões corretas:
sudo mkdir -p /var/log/mysql
sudo chown mysql:mysql /var/log/mysql
sudo chmod 750 /var/log/mysql
Reinicie o MySQL e confirme que os logs estão sendo gerados:
sudo systemctl restart mysql
sudo tail -f /var/log/mysql/general.log
/usr/sbin/mysqld, Version: 8.0.x MySQL Community Server - GPL. started with:
Tcp port: 3306 Unix socket: /var/run/mysqld/mysqld.sock
Time Id Command Argument
2024-01-15T10:23:45.123456Z 8 Connect root@localhost on using Socket
Para auditoria mais avançada sem a versão Enterprise, instale o Percona Audit Log Plugin, compatível com MySQL 8.0, que oferece logs estruturados em formato JSON ou XML com filtros por usuário e operação.
Veja também as Dicas de Otimização de Servidores Linux para configurar rotação de logs com logrotate e evitar que os arquivos de log consumam todo o espaço em disco.
Configuração de firewall e TLS para conexões MySQL em produção
Mesmo com o bind-address restrito ao loopback, configurar o firewall como camada adicional de defesa é uma prática recomendada para ambientes de produção com MySQL 8.0.
No AlmaLinux 9 / Rocky Linux 9 com firewalld:
sudo firewall-cmd --list-ports
Se a porta 3306 aparecer aberta, remova-a:
sudo firewall-cmd --permanent --remove-port=3306/tcp
sudo firewall-cmd --reload
No Debian 12 / Ubuntu 24.04 com ufw:
sudo ufw status | grep 3306
sudo ufw delete allow 3306/tcp
Se precisar de acesso remoto legítimo (por exemplo, de um servidor de aplicação separado), libere apenas o IP específico:
sudo ufw allow from 192.168.1.50 to any port 3306
Para habilitar TLS nas conexões MySQL 8.0, verifique se os certificados SSL já foram gerados automaticamente:
sudo mysql -u root -p -e "SHOW VARIABLES LIKE '%ssl%';"
+---------------+--------------------------------+
| Variable_name | Value |
+---------------+--------------------------------+
| have_ssl | YES |
| ssl_ca | /var/lib/mysql/ca.pem |
| ssl_cert | /var/lib/mysql/server-cert.pem |
| ssl_key | /var/lib/mysql/server-key.pem |
+---------------+--------------------------------+
Para exigir TLS em um usuário específico:
ALTER USER 'app_producao'@'%' REQUIRE SSL;
FLUSH PRIVILEGES;
Isso garante que qualquer conexão remota desse usuário seja criptografada, mesmo que o cliente tente conectar sem TLS.
Problemas comuns e como resolver
Sintoma: erro "Access denied for user 'root'@'localhost'" após mysql_secure_installation
Causa: No MySQL 8.0, o usuário root em sistemas Debian/Ubuntu usa o plugin auth_socket por padrão, exigindo que o login seja feito com sudo em vez de senha.
Solução: Execute sudo mysql sem especificar senha. Se precisar de autenticação por senha, altere o plugin: conecte com sudo mysql e execute ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'SuaSenha'; seguido de FLUSH PRIVILEGES;.
Sintoma: aplicação não conecta após alterar bind-address para 127.0.0.1
Causa: A aplicação estava configurada para conectar via endereço IP do servidor (192.168.x.x ou IP público) em vez de localhost ou 127.0.0.1.
Solução: Atualize a string de conexão da aplicação para usar host=127.0.0.1 ou host=localhost. Verifique também se o usuário do banco de dados tem @'localhost' como host permitido: SELECT user, host FROM mysql.user WHERE user = 'app_producao';.
Sintoma: MySQL não inicia após editar o arquivo de configuração
Causa: Erro de sintaxe no arquivo mysqld.cnf ou my.cnf, como espaços indevidos, seção [mysqld] duplicada ou diretiva inválida para a versão 8.0.
Solução: Verifique o log de erros do MySQL: sudo journalctl -u mysql -n 50 --no-pager. Valide a sintaxe do arquivo com sudo mysqld --validate-config. Corrija o erro apontado e tente reiniciar novamente.
Sintoma: slow_query_log não registra queries lentas mesmo com long_query_time = 2
Causa: A variável pode ter sido definida apenas na sessão atual ou o arquivo de log não tem permissão de escrita para o usuário mysql.
Solução: Confirme o valor ativo com SHOW VARIABLES LIKE 'slow_query_log%'; dentro do MySQL. Verifique as permissões do diretório: ls -la /var/log/mysql/. O proprietário deve ser mysql:mysql. Corrija com sudo chown -R mysql:mysql /var/log/mysql/.
Perguntas frequentes sobre checklist de segurança MySQL 8.0
Qual é o primeiro passo de segurança após instalar o MySQL 8.0?
Execute o script mysql_secure_installation imediatamente após a instalação. Ele remove o usuário anônimo, desabilita o login remoto do root, elimina o banco de dados de teste e recarrega as tabelas de privilégios, eliminando as configurações padrão mais exploradas por atacantes. Esse script deve ser executado antes de qualquer outra configuração ou criação de banco de dados.
Como impedir que o MySQL 8.0 aceite conexões externas desnecessárias?
Adicione a diretiva bind-address = 127.0.0.1 no arquivo /etc/mysql/mysql.conf.d/mysqld.cnf (Debian/Ubuntu) ou /etc/my.cnf (AlmaLinux/Rocky Linux). Isso faz o daemon escutar apenas na interface de loopback, bloqueando conexões de IPs externos sem precisar de regra de firewall adicional. Reinicie o serviço após a alteração para que a configuração entre em vigor.
Como verificar quais usuários têm privilégio SUPER ou ALL PRIVILEGES no MySQL 8.0?
Conecte ao MySQL como root e execute: SELECT user, host, Super_priv FROM mysql.user WHERE Super_priv = 'Y';. Para ver todos os privilégios de um usuário específico, use SHOW GRANTS FOR 'usuario'@'host';. Revogue privilégios desnecessários com REVOKE ALL PRIVILEGES ON *.* FROM 'usuario'@'host'; seguido de FLUSH PRIVILEGES;.
O MySQL 8.0 já usa criptografia de senhas por padrão?
Sim. O MySQL 8.0 adota o plugin caching_sha2_password como método de autenticação padrão, substituindo o mysql_native_password das versões anteriores. Esse plugin usa SHA-256 com cache de autenticação, oferecendo segurança superior. Clientes mais antigos podem precisar de atualização para suportar esse método, ou você pode alterar o plugin individualmente por usuário sem comprometer a segurança global do servidor.
Como habilitar o log de auditoria de queries no MySQL 8.0 sem a versão Enterprise?
Na versão Community, ative o general_log e o slow_query_log no arquivo de configuração, definindo general_log = 1, general_log_file = /var/log/mysql/general.log e slow_query_log = 1. Para auditoria mais avançada, instale o plugin open-source McAfee MySQL Audit Plugin ou use o Percona Audit Log Plugin, ambos compatíveis com MySQL 8.0 e que oferecem logs estruturados com filtros granulares por usuário e tipo de operação.
Conclusão
Aplicar o checklist de segurança do MySQL 8.0 antes de ir ao ar reduz significativamente a superfície de ataque do seu banco de dados. As etapas cobrem desde o hardening inicial até o monitoramento contínuo:
- Execute
mysql_secure_installatione restrinja obind-addresscomo primeiras ações após qualquer instalação nova do MySQL 8.0 em produção - Crie usuários dedicados por aplicação com privilégios mínimos e revise periodicamente os grants com
SHOW GRANTSpara detectar permissões excessivas acumuladas ao longo do tempo - Habilite slow_query_log e configure TLS para garantir visibilidade sobre o comportamento do banco e criptografia das conexões, especialmente em arquiteturas com múltiplos servidores
Leia também
- Checklist de Segurança: Fail2ban vs CSF para proteger servidores Linux
- Como Instalar e Configurar o Firewall CSF no VPS Linux para Segurança Avançada
- Checklist Completo para Configurar e Testar o Firewall UFW em VPS Linux e Servidores Dedicados
Precisa de ajuda com segurança de banco de dados MySQL?
Configurar e manter um ambiente MySQL 8.0 seguro em produção exige atenção contínua a atualizações, permissões e monitoramento. Um VPS com suporte técnico especializado pode fazer a diferença entre um ambiente protegido e uma brecha crítica.
Conheça os planos de VPS da AviraHost com suporte técnico disponível