Mantenha seus bancos de dados MySQL seguros criando usuários e permissões separados

Sempre fui amigo das boas práticas, muito mais se nos ajudarem a manter a segurança dos nossos servidores, serviços ou simplesmente das nossas informações.

Um hábito (mau hábito) que muitos administradores ou usuários têm é usar o acesso com raiz para todos os bancos de dados, ou seja ... eles instalam um site usando o CMS WordPress, e como dados de acesso ao banco de dados (para WP usar o servidor MySQL e usar seu banco de dados) colocam o usuário de administração do servidor MySQL: root

Além disso, eles instalam qualquer outra aplicação web (chat, paste, forum, etc) e fazem o mesmo, eles sempre usam o usuário root do MySQL ...

ERRO!!!

Este é simplesmente um hábito fatal.

Suponha que temos os seguintes serviços em um servidor:

  1. Um site ou portal usando WordPress.
  2. Nosso fórum de suporte, palestras, etc ... uma comunidade inteira.
  3. Um FTP que usa um banco de dados MySQL para armazenar usuários e senhas.
  4. Os usuários de email são armazenados (usuários e senhas) em um banco de dados MySQL.
  5. Um pequeno WebChat que instalamos para conversar com alguém que você conhece.

E em todos eles, nos 5 serviços utilizamos o usuário root do MySQL para que cada serviço acesse e salve os dados em seu banco de dados correspondente.

Um belo dia, qualquer um dos muitos trolls por aí, mas este não é apenas um troll, mas também domina alguns exploits, vulnerabilidades, hacking, etc ... decide fazer algo prejudicial a nós.

Encontre um bug no WebChat que estamos usando, aproveitando esse bug, ele consegue acessar os arquivos do WebChat, inclusive o arquivo de configuração do WebChat, e… neste arquivo, obviamente, está o nome de usuário e a senha que o WebChat usa para acessar o Servidor MySQL e adivinha? … Não é nada mais e nada menos o USUÁRIO ROOT!

Ao obter essas informações, de uma forma muito simples, o troll pode:

  1. Exclua-nos e / ou roube tudo relacionado ao site ou portal que possuímos (WordPress).
  2. Você pode excluir e / ou roubar informações nossas E de nossos usuários que usam o Fórum, a comunidade que criamos.
  3. Você também pode roubar o nome de usuário e senha de TODOS os usuários que possuem uma conta de e-mail em nosso servidor, bem como roubar as informações de seus e-mails, falsificar a identidade, etc.
  4. E agora, finalmente, você pode usar uma conta em nosso servidor FTP, e enviar qualquer arquivo que contenha malware, o que permitiria que você assumisse o controle TOTAL e ABSOLUTO de nosso servidor.

Bem... o que você acha? …

Você vê tudo o que pode acontecer simplesmente por não criar usuários independentes para cada banco de dados que temos?

Isso NÃO é um exagero, amigos, isso pode acontecer com uma facilidade incrível ... bem, tudo o que é necessário para desencadear a catástrofe é apenas um bug em alguns dos aplicativos da web que você instalou.

Agora…

Como criar usuários MySQL separados para cada aplicativo da web?

Primeiro devemos entrar no servidor MySQL com o usuário root, pois é ele quem tem os privilégios para criar bancos de dados, estabelecer permissões, criar usuários, etc:

mysql -u root -p

Quando eles escrevem o acima e pressionam [Entrar] Será solicitada a senha do usuário root do MySQL, eles a digitam e pressionam [Entrar] novamente, você verá instantaneamente algo assim:

Agora vamos criar um banco de dados chamado «webchatdb":
CREATE DATABASE webchatdb;

Observe o ponto-e-vírgula «;»No final da linha.

Pronto, você já criou o banco de dados, agora vamos criar o usuário «usuário de chat da web«Com a senha«senhadelputowebchat":

CREATE USER 'webchatuser'@'localhost' IDENTIFIED BY 'passworddelputowebchat';

Agora a mágica ... vamos dar todos os privilégios (ler e escrever) para usuário de chat da web SOMENTE no banco de dados webchatdb:

GRANT ALL PRIVILEGES ON webchatdb.* TO 'webchatuser'@'localhost' WITH GRANT OPTION;

E pronto, o usuário já tem as permissões nesse banco de dados ... agora só falta atualizar as permissões para o MySQL, ou seja, diga ao MySQL para reler os privilégios dos usuários porque acabamos de fazer uma alteração neles:

FLUSH PRIVILEGES ;

Deixo uma captura de tela:

E isso foi tudo. Fazendo isso para cada aplicativo da web que usamos, garantimos que caso eles consigam violar um desses aplicativos da web, os outros estarão seguros (pelo menos do ponto de vista do MySQL)

O que é uma boa prática? 

Espero que tenha sido tão útil para você quanto para mim, pois tentei explicá-lo da forma mais simples que pude.

lembranças