As 7 Melhores Práticas de Segurança do MySQL para Proteger Seu Banco de Dados
Sete verificações práticas de segurança do MySQL para controle de acesso, exposição de rede, TLS, atualizações, registro de logs e criptografia.
7 Melhores Práticas de Segurança do MySQL para Proteger seu Banco de Dados
A segurança do MySQL começa com a redução de quem pode se conectar, o que eles podem fazer e o que é exposto se um host for comprometido. As sete verificações abaixo fornecem uma base prática para bancos de dados de produção, sem fingir que uma única configuração pode tornar o MySQL "seguro".
1. Gerenciamento Seguro de Acesso de Usuários
Controlar quem pode acessar seu banco de dados e o que eles podem fazer é a primeira linha de defesa. Isso envolve criar contas de usuário específicas com o princípio do menor privilégio, ou seja, os usuários devem ter apenas as permissões necessárias para realizar suas tarefas.
Crie Contas Fortes
Evite usuários de aplicativos compartilhados e senhas fracas. Use mysql_secure_installation em servidores autogerenciados para remover usuários anônimos, remover o banco de dados de teste quando aplicável e reforçar a configuração inicial da conta root.
Conceda Privilégios Mínimos
Use instruções GRANT para o banco de dados, tabela e ações específicas que sua aplicação precisa. Evite ALL PRIVILEGES para contas de aplicativos.
Exemplo:
CREATE USER 'webapp_user'@'10.0.10.%' IDENTIFIED BY 'use-um-segredo-real-aqui';
GRANT SELECT, INSERT, UPDATE ON mydatabase.* TO 'webapp_user'@'10.0.10.%';
Você não precisa de FLUSH PRIVILEGES após instruções normais CREATE USER ou GRANT. O MySQL atualiza as tabelas de privilégios automaticamente para essas instruções.
Audite as contas regularmente:
SELECT user, host, account_locked FROM mysql.user ORDER BY user, host;
SHOW GRANTS FOR 'webapp_user'@'10.0.10.%';
2. Restrinja o Acesso à Rede
Limite os caminhos de rede para o MySQL. O padrão efetivo depende da sua versão e pacote do MySQL, então inspecione seu servidor em execução em vez de assumir que ele apenas escuta localmente.
Verifique os listeners:
ss -ltnp | grep 3306
Vincule o MySQL ao localhost quando apenas clientes locais precisarem de acesso:
[mysqld]
bind-address = 127.0.0.1
Se servidores de aplicativos se conectarem remotamente, vincule à interface privada e use grupos de segurança, firewalls ou ACLs de rede para permitir apenas essas fontes à porta 3306.
3. Use TLS para Conexões
Criptografar dados em trânsito impede espionagem e ataques man-in-the-middle. O MySQL suporta criptografia SSL/TLS para conexões cliente-servidor.
A configuração do servidor geralmente se parece com isso:
[mysqld]
ssl-ca=/caminho/para/ca.pem
ssl-cert=/caminho/para/server-cert.pem
ssl-key=/caminho/para/server-key.pem
Exemplo de cliente:
mysql -h seu_host -u seu_usuario -p --ssl-mode=REQUIRED
Para verificação mais rigorosa, use --ssl-mode=VERIFY_IDENTITY com um nome de host que corresponda ao certificado. REQUIRED criptografa a conexão, mas não verifica a identidade do servidor com tanta força.
4. Mantenha o MySQL Atualizado
Vulnerabilidades de software são frequentemente descobertas e corrigidas. Executar uma versão desatualizada do MySQL pode expor seu banco de dados a explorações conhecidas.
Acompanhe o fluxo de versão que você executa, aplique atualizações de segurança e teste as atualizações em staging antes da produção. Se você usar um serviço de banco de dados gerenciado, revise a política de manutenção do provedor e defina uma janela de manutenção que sua equipe realmente monitore.
5. Reforce a Configuração do Servidor MySQL
Além da vinculação de rede, várias outras opções de configuração podem melhorar a segurança.
Desabilite local_infile a menos que suas aplicações precisem de LOAD DATA LOCAL INFILE:
[mysqld]
local_infile = 0
Mantenha arquivos de configuração, chaves TLS e credenciais de backup legíveis apenas pelos usuários apropriados do sistema. Também revise os plugins instalados e remova aqueles que você não usa.
6. Audite e Monitore Logs
A criação de logs é crucial para detectar atividades suspeitas e para análise forense após um incidente de segurança.
O MySQL Enterprise inclui um plugin de log de auditoria. Implantações comunitárias geralmente usam logs do sistema operacional, logs de erro, logs de proxy, recursos de auditoria de banco de dados em nuvem ou plugins de auditoria de terceiros, dependendo do seu ambiente.
No mínimo, monitore:
- Logins falhos e erros de autenticação.
- Novos usuários, privilégios alterados e instruções privilegiadas.
- Conexões de hosts inesperados.
- Falhas em trabalhos de backup e falhas em testes de restauração.
Não deixe o log de consultas gerais habilitado em um servidor de produção movimentado, a menos que você tenha uma necessidade específica de solução de problemas de curto prazo. Ele pode criar I/O pesado e pode capturar valores de consulta confidenciais.
7. Proteja Dados em Repouso
Enquanto SSL/TLS protege dados em trânsito, criptografar dados em repouso os protege se o armazenamento subjacente for comprometido.
Use criptografia de armazenamento ou volume para a linha de base ampla. Para campos confidenciais, considere criptografia no nível da aplicação para que o banco de dados não contenha tudo o que é necessário para descriptografar os dados.
O MySQL também possui funções de criptografia como AES_ENCRYPT() e AES_DECRYPT(), mas não codifique chaves em SQL ou as armazene ao lado dos dados.
Exemplo simplificado:
UPDATE users
SET sensitive_data = AES_ENCRYPT('informacao_privada_do_usuario', @chave_criptografia)
WHERE user_id = 1;
SELECT AES_DECRYPT(sensitive_data, @chave_criptografia)
FROM users
WHERE user_id = 1;
Use um processo adequado de gerenciamento de chaves para sistemas reais. Criptografia sem rotação de chaves, controle de acesso e backups do material da chave pode transformar um incidente recuperável em perda permanente de dados.
Conclusão
Comece com os controles que removem mais riscos: usuários com privilégios mínimos, acesso de rede privada, TLS, atualizações e backups testados. Em seguida, adicione logs de auditoria e controles de criptografia que correspondam ao seu modelo de conformidade e ameaça. Revise a configuração após cada grande mudança de esquema, infraestrutura ou acesso.