Melhores Práticas para o Endurecimento das Configurações de Segurança do Servidor MySQL
O MySQL é a pedra angular de inúmeras aplicações, desde pequenos blogs a sistemas empresariais massivos. A sua popularidade, embora seja um testemunho da sua robustez e flexibilidade, também o torna um alvo frequente para atores maliciosos. Um servidor MySQL mal configurado ou não endurecido pode ser uma vulnerabilidade significativa, expondo dados sensíveis e fornecendo uma porta de entrada para acesso não autorizado a toda a sua infraestrutura. Proteger a sua implementação MySQL não é uma tarefa única, mas um compromisso contínuo que exige vigilância e adesão às melhores práticas de segurança.
Este artigo fornece um guia abrangente para dicas essenciais de configuração e medidas de endurecimento de segurança. Abordaremos várias camadas de segurança, desde a gestão de utilizadores e proteção de rede até ajustes de ficheiros de configuração e considerações do sistema operativo. Ao implementar estas recomendações, pode reduzir significativamente a superfície de ataque do seu servidor MySQL e construir um ambiente de base de dados mais resiliente contra vulnerabilidades comuns e tentativas de acesso não autorizado.
1. Gestão de Utilizadores e Acesso: O Princípio do Mínimo Privilégio
A gestão eficaz de utilizadores é fundamental para a segurança do MySQL. Conceder aos utilizadores apenas as permissões de que necessitam é primordial.
Criar Utilizadores Específicos para Aplicações Específicas
Evite usar o utilizador root para ligações de aplicações. Em vez disso, crie utilizadores dedicados com permissões granulares.
CREATE USER 'my_app_user'@'localhost' IDENTIFIED BY 'StrongPassword123!';
GRANT SELECT, INSERT, UPDATE, DELETE ON `your_database`.* TO 'my_app_user'@'localhost';
FLUSH PRIVILEGES;
Impor Palavras-Passe Fortes
Palavras-passe fortes e únicas são a sua primeira linha de defesa. Utilize o plugin de validação de palavras-passe incorporado do MySQL, se disponível.
- Complexidade: Misture maiúsculas, minúsculas, números e símbolos.
- Comprimento: Procure ter pelo menos 12-16 caracteres.
- Exclusividade: Nunca reutilize palavras-passe.
- Rotação: Implemente uma política para mudanças regulares de palavras-passe.
Pode ativar o componente validate_password (MySQL 8.0+) ou plugin (MySQL 5.7+):
INSTALL COMPONENT 'file://component_validate_password';
-- OU para versões mais antigas
INSTALL PLUGIN validate_password SONAME 'validate_password.so';
-- Configurar política de força (ex: MEDIUM para 8+ carateres, misturar maiúsculas/minúsculas, números, especiais)
SET GLOBAL validate_password.policy = MEDIUM;
SET GLOBAL validate_password.length = 12;
Remover Utilizadores Padrão e Não Utilizados
O MySQL vem com utilizadores padrão (ex: root@localhost). Embora root@localhost seja necessário, certifique-se de que tem uma palavra-passe forte. Criticamente, remova ou proteja outros utilizadores padrão como mysql.session, mysql.sys e o utilizador anónimo, se não forem explicitamente necessários e devidamente configurados.
-- Para identificar utilizadores anónimos:
SELECT user, host FROM mysql.user WHERE user = '';
-- Para remover um utilizador anónimo (se encontrado):
DROP USER ''@'localhost';
-- Para remover bases de dados de teste (se existirem):
DROP DATABASE IF EXISTS test;
DELETE FROM mysql.db WHERE Db='test' OR Db='test\_%';
FLUSH PRIVILEGES;
Restringir Acesso por Host
Limite as contas de utilizador para se conectarem apenas a partir de endereços IP ou nomes de host específicos. Evite usar % como um curinga para host, a menos que seja absolutamente necessário e acoplado a outros controlos de segurança fortes.
-- O utilizador só pode conectar-se a partir de localhost
CREATE USER 'admin'@'localhost' IDENTIFIED BY 'AnotherStrongPass!';
-- O utilizador só pode conectar-se a partir de um endereço IP específico
CREATE USER 'backup_user'@'192.168.1.100' IDENTIFIED BY 'BackupPass!';
Tenha Cuidado com GRANT OPTION
A cláusula WITH GRANT OPTION permite que um utilizador conceda os seus próprios privilégios a outros utilizadores. Isso pode ser um risco de segurança significativo se concedido a utilizadores não confiáveis. Use-o com moderação e apenas para contas administrativas que realmente exijam essa capacidade.
-- Um utilizador com capacidade para conceder privilégios (usar com extrema cautela)
GRANT ALL PRIVILEGES ON *.* TO 'superadmin'@'localhost' IDENTIFIED BY 'SuperAdminPass!' WITH GRANT OPTION;
2. Segurança de Rede: Isolando a Sua Base de Dados
Controlos ao nível da rede são críticos para prevenir o acesso externo não autorizado ao seu servidor MySQL.
Configurar Firewalls
Permita ligações à porta padrão do MySQL (3306) apenas a partir de endereços IP ou redes confiáveis. Bloqueie todas as outras ligações de entrada para esta porta.
Exemplo (UFW no Linux):
sudo ufw enable
sudo ufw allow from 192.168.1.0/24 to any port 3306
sudo ufw deny 3306
sudo ufw status
Exemplo (CentOS/RHEL com firewalld):
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port port="3306" protocol="tcp" accept'
sudo firewall-cmd --permanent --remove-port=3306/tcp --zone=public # Garanta que não está aberto globalmente
sudo firewall-cmd --reload
Proteger Ligações com SSL/TLS
Criptografe todo o tráfego entre clientes e o servidor MySQL usando SSL/TLS para prevenir a interceção de dados e ataques Man-in-the-Middle (MitM). Isso é especialmente crucial para ligações em redes não confiáveis.
Para ativar SSL/TLS, você geralmente precisa gerar certificados e chaves SSL e, em seguida, configurar seu my.cnf:
# my.cnf
[mysqld]
ssl_ca=/etc/mysql/certs/ca.pem
ssl_cert=/etc/mysql/certs/server-cert.pem
ssl_key=/etc/mysql/certs/server-key.pem
Os clientes devem então ser configurados para conectar usando SSL/TLS, muitas vezes com REQUIRE SSL na instrução GRANT do utilizador:
CREATE USER 'ssl_user'@'%' IDENTIFIED BY 'SSLUserPass!';
GRANT SELECT ON `your_database`.* TO 'ssl_user'@'%' REQUIRE SSL;
FLUSH PRIVILEGES;
Vincular a Endereços IP Específicos
Por padrão, o MySQL pode ouvir em todas as interfaces de rede disponíveis (0.0.0.0). Restrinja-o a ouvir apenas nas interfaces que precisam aceitar ligações (ex: localhost para aplicações locais, ou um IP de rede privada para ligações internas).
# my.cnf
[mysqld]
bind-address = 127.0.0.1 # Apenas para ligações locais
# OU
bind-address = 192.168.1.10 # Para um IP interno específico
Dica: Se a sua aplicação e o servidor MySQL estiverem na mesma máquina,
bind-address = 127.0.0.1(localhost) é a opção mais segura, pois impede completamente quaisquer ligações externas.
3. Endurecimento do Ficheiro de Configuração (my.cnf / my.ini)
O ficheiro de configuração do MySQL (my.cnf no Linux, my.ini no Windows) oferece inúmeros parâmetros para melhorar a segurança.
Desativar Recursos Não Utilizados
Minimize a superfície de ataque desativando recursos não necessários para a sua implementação.
local_infile = 0: Impede que os clientes solicitem ao servidor para carregar dados de ficheiros arbitrários no host do servidor. Este é um vetor comum para exfiltração de dados.
ini [mysqld] local_infile = 0skip-networking: Se a sua base de dados for acedida apenas por aplicações no mesmo servidor, desative completamente a rede. Isso força todas as ligações a usar o socket Unix ou pipes nomeados.
ini [mysqld] skip-networkingsymbolic-links = 0: Impede o uso de links simbólicos para tablespaces da base de dados, que podem ser explorados para aceder a ficheiros fora do diretório de dados do MySQL.
ini [mysqld] symbolic-links = 0secure_file_priv: Restringe os diretórios dos quais os ficheiros podem ser lidos e escritos por funções comoLOAD DATA INFILEeSELECT ... INTO OUTFILE.
```ini
[mysqld]
secure_file_priv = "/var/lib/mysql-files" # Definir para um diretório específico e restrito
# OU
# secure_file_priv = ""