Melhores Práticas para o Reforço das Configurações de Segurança do Servidor MySQL

Proteja suas implantações críticas do MySQL com este guia abrangente sobre melhores práticas essenciais de reforço de segurança. Aprenda a implementar um gerenciamento robusto de usuários e acesso, proteger conexões de rede com firewalls e SSL/TLS, ajustar o `my.cnf` para segurança ideal e aplicar proteções em nível de sistema operacional. Descubra dicas práticas de configuração e passos acionáveis para mitigar vulnerabilidades comuns, prevenir acesso não autorizado e garantir a integridade e confidencialidade do seu banco de dados. Uma leitura obrigatória para qualquer pessoa responsável pela segurança do MySQL.

35 visualizações

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 = 0
  • skip-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-networking
  • symbolic-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 = 0
  • secure_file_priv: Restringe os diretórios dos quais os ficheiros podem ser lidos e escritos por funções como LOAD DATA INFILE e SELECT ... INTO OUTFILE.
    ```ini
    [mysqld]
    secure_file_priv = "/var/lib/mysql-files" # Definir para um diretório específico e restrito
    # OU
    # secure_file_priv = ""