Blindando o MySQL: Configurações de segurança

postado em: Tutoriais | Comments

O banco de dados é parte importante e fundamental de um ou vários sistemas de uma empresa, provendo informações necessárias para tomadas de decisões, lançamentos de produtos e regras de negócios, ou seja, é no banco de dados onde estão a informações mais valiosas de uma empresa.

É fato que tanta informação valiosa em um mesmo local não é algo seguro por natureza e é ai que você, DBA, deve agir com inteligência e elaborar estratégias de segurança como: Políticas de senhas, firewall, SO, SGBD e até a própria cultura do local onde você trabalha, pois, não adianta de nada você cuidar da segurança e a sua equipe ficar trafegando o usuário e senha em plain text pela rede.

Criando uma boa estratégia de segurança você evita dores de cabeça como: Acessos indevidos, roubo ou exclusão de dados e indisponibilidade no serviço. Então hoje estarei ensinando alguns truques e passando algumas dicas de como deixar o seu SGBD mais seguro para que você consiga dormir a noite.

 

Instalação e configurações do Sistema Operacional

Minha primeira dica é: Instale o MySQL apenas em sistemas Linux. Pode ser Debian, Suse, Redhat, CentOS, Ubuntu, etc… Além do SGBD ter uma performance maior nestes sistemas, teremos uma maior maleabilidade e facilidade de trabalhar com o MySQL e implementar rotinas que possam nos ajudar.

Não deixe os backups do seu MySQL onde está instalado o seu SGBD. Além de não ser uma prática nem um pouco inteligente e muito menos eficaz, você facilita a vida do invasor. Sempre coloque o seu backup em um servidor separado, específico para este serviço e sempre tente trafegar os dados com TLS.

Caso você tenha instalado o MySQL via repositório oficial via yum ou apt-get, por exemplo, você já terá esta configuração pronta, caso tenha compilado o source code, você deve criar um usuário para o MySQL. Este usuário será o responsável por controlar o serviço. Vamos aos comandos para criar o usuário e setar as permissões:
[[email protected] ~]# useradd mysql -d /localdeinstalacao -b /sbin/nologin

[[email protected] ~]# chown mysql:mysql /localdeinstalacao -R

Não esqueça de configurar o seu my.cnf na sessão [ mysqld ] o usuário: “user=mysql” e de configurar as permissões deste arquivo:
[[email protected] ~]# chmod 400 /etc/my.cnf

[[email protected] ~]# chown mysql:mysql /etc/my.cnf

 

Nunca, jamais, em hipótese alguma faça isso [[email protected] ~]# mysql -uroot -p'minhasenha'. Assim, você está gravando o seu login de administração no history do Linux! Outra falha clássica é colocar o usuário e senha em um arquivo para não precisar digitar a senha para se logar via mysqlclient. Fazendo isso você está deixando a chave na porta para o invasor.

 

A próxima dica é: após efetuar a instalação do seu SGBD, execute o programa de configuração de segurança do MySQL. Ele fará diversas checagens e perguntará se as quer corrigir ou não. A primeira é a mais importante de todas: “Você quer trocar a senha de root?”.

[[email protected] ~]# mysql_secure_installation

 

Outra falha de segurança grotesca e que muitos esquecem de fazer é remover o .mysql_history que fica na home do seu usuário. Neste arquivo ficam armazenados todos os comandos que você executa no via mysqcliente e dependendo da versão até os comandos que contêm senhas ficam lá. Um solução é colocar na cron para remover este arquivo a cada 10 minutos, mas não é efetiva. Eu indico criar um link simbólico para o /dev/null pois esta solução sim resolve o seu problema.

[[email protected] ~]# ln -s /dev/null /SUAHOME/.mysql_history

 

E a dica mais óbvia mas que é sempre bom lembrar: Não deixe o seu sistema desatualizado! Crie rotinas de update no SO da máquina e no seu SGBD, a falha de updates pode ser tão ou até mais grave do que uma senha fraca. Aliás, não use senhas fracas e óbvias.

 

Firewall e Rede

É aqui que mora o perigo! Não adianta de nada você ter um SO e um SGBD bem configurados e deixar todo tráfego que vem da rua simplesmente chegar no seu servidor e fazer flood, brute force, etc…

Aqui vão algumas dicas:

  1. Por favor, eu imploro, de verdade, não façam isso! Não deixe o seu MySQL rodar na porta 3306, vá no my.cnf e encontre na sessão [ mysqld ] o parâmetro “port=3306” e coloque uma porta alta e totalmente aleatória. Caso você precise muito, muito, muito mesmo da 3306, tente fazer isso em uma rede confiável com uma VPN. O motivo disso é simples: Os atacantes mandam escanear os range de IPs publicados procurando por portas default como 21, 22, 990 e 3306;
  2. Ainda com o iptables, restrinja o acesso ao seu servidor e aceite apenas as conexões de IPs confiáveis. Você pode criar um servidor para apenas se logar via SSH a dele se conectar no mysqlclient do seu servidor de produção.
  3. Sempre trafegue utilizando TLS para criptografar todos os seus dados. Veja como neste link oficial: Using SSL for Secure Connections
  4. Configure o fail2ban para monitorar e fazer a segurança contra brute force no seu servidor, mesmo que a porta não seja 3306 e principalmente se for.

 

MySQL e seus usuários

Tendo um MySQL bem instalado, um SO bem configurado junto com Friewall e Rede confiável, já teremos uma boa “blindagem”, mas ainda falta um passo muito importante que é a configuração dos usuários que você cria no seu SGBD. Um usuário com acesso externo e senha fraca pode ser um prato cheio para um final de semana inteiro de trabalho e restaurações de backups.

Após a instalação e a troca de senha do root, eu sempre indico que criem um novo usuário de administração e excluam o seu usuário root. Isso vai dificultar bastante a vida do invasor. Acesse o seu SGBD com o mysqlclient e crie o novo usuário:
mysql> GRANT ALL PRIVILEGES ON *.* TO [email protected] IDENTIFIED BY 'SUASENHA' WITH GRANT OPTIONS;

Algumas observações:

  1. Nunca abra o acesso do seu usuário de administração para fora do servidor, sempre o crie para “localhost”;
  2. Não coloque nada como administrator, admin ou algo do gênero;
  3. Utilize uma senha forte e a troque a cada 15 ou 30 dias;
  4. Tenha apenas um administrador do SGBD.

Após criar o seu novo administrador, tente logar com o novo usuário e criar e excluir um banco de teste, usuário, etc… Se todos os testes ocorrem bem, podemos excluir o usuário root. Primeiro vamos ver quais usuários root existem:
mysql> SELECT user,host FROM mysql.user WHERE user = 'root';

O retorno será algo parecido com isso:

rootmysql

Agora que sabemos os usuários com nome de root que temos, podemos excluí-los.
mysql> DROP USER [email protected];
mysql> DROP USER root@'::1';
mysql> DROP USER root@'127.0.0.1';
Com o usuário de administração configurado, aqui vão algumas dicas de segurança para os usuários:

 

  1. Evite criar usuários que o host seja ‘%’. Isto quer dizer que o usuário possui acesso de qualquer IP, tente sempre habilitar o acesso apenas para um IP fixo;
  2. Ao criar um usuário comum, cuidado com as permissões. Nada de ALL PRIVILEGES ou WITH GRANT OPTIONS. Seja específico dando as permissões necessários como: SELECT, CREATE, DROP, UPDATE, DELETE;
  3. Evite dar permissões para o banco todo. Nunca faça isso “ON *.* TO“, assim você está permitindo que este usuário tenha acesso a todos os bancos de dados do seu SGBD. De preferência para “ON banco.* TO“, assim este usuário só terá permissão no seu banco;
  4. Criei senhas fortes (Sempre é bom lembrar);
  5. Ao remover um banco de dados remova o usuário, não o deixe sem um banco;

 

Então é isso pessoal. Espero que tenham gostado e se tiverem alguma dúvida ou sugestão é só entrar em contato e enviar a sua opinião.

Allan Moraes

Allan Moraes é gaúcho e entusiasta open source. Trabalha em uma Startup com foco em Plataforma como Serviço (PaaS), é especialista em MySQL, High Availability e High Scalability Architecture.