Gerenciamento de bancos de dados e usuários

MySQLBeginner
Pratique Agora

Introdução

Na administração profissional de sistemas, usar o usuário root para conexões rotineiras de aplicações representa um grande risco de segurança. Se um invasor comprometer uma aplicação que usa a conta root, ele terá controle total sobre todos os bancos de dados do servidor.

A prática recomendada determina que cada aplicação tenha seu próprio usuário dedicado, com permissões restritas ao seu próprio banco de dados dedicado.

Esse é o equivalente, no banco de dados, à separação de identidades de aplicações no nível do sistema operacional. O controle de acesso deve refletir a finalidade de cada identidade, e não apenas a conveniência.

Essa é a versão, no banco de dados, do princípio do menor privilégio que você já viu no gerenciamento de usuários do Linux. Se a conta de uma aplicação for comprometida, as permissões restritas reduzem o impacto do incidente.

Neste laboratório, você protegerá seu ambiente seguindo estes procedimentos padrão:

  1. Crie um novo banco de dados para uma aplicação hipotética.
  2. Crie uma conta de usuário específica para essa aplicação.
  3. Conceda ao usuário permissões somente para seu banco de dados específico.
  4. Verifique a configuração fazendo login como o novo usuário.

Criar um novo banco de dados

Primeiro, você precisa fazer login no servidor MySQL com privilégios administrativos para criar o novo banco de dados.

Abra o terminal e execute o comando a seguir para acessar o shell do MySQL:

sudo mysql

Observação: esse comando usa sudo para autenticar como root por meio do socket do sistema. Se for solicitada uma senha que você não conhece, tente mysql -u root -p.

Quando o prompt mysql> aparecer, você estará pronto para executar comandos SQL.

Neste momento, você está conectado como um usuário administrativo do banco de dados, pois criar bancos de dados é uma operação privilegiada. Normalmente, contas de aplicações não têm esse nível de controle.

Crie um novo banco de dados chamado app_db. Ele será o contêiner dos dados da nossa aplicação.

CREATE DATABASE app_db;

Se a operação for bem-sucedida, o MySQL responderá com Query OK. Você pode verificar se o banco de dados existe listando todos os bancos de dados:

SHOW DATABASES;

Você deverá ver app_db na lista.

Criar um usuário dedicado

Agora que temos um banco de dados, precisamos de um usuário para gerenciá-lo. Criaremos um usuário chamado app_user.

No mesmo shell do MySQL, execute o comando a seguir:

CREATE USER 'app_user'@'localhost' IDENTIFIED BY 'password';

Entendendo o comando:

  • 'app_user': o nome de usuário.
  • '@'localhost': restringe o usuário a conexões originadas somente neste servidor (uma medida de segurança).
  • IDENTIFIED BY 'password': define a senha como "password".

Neste momento, o usuário existe, mas não tem permissões. Ele pode fazer login, mas não pode ler nem gravar dados.

Este é um modelo de segurança importante: identidade e privilégio são conceitos separados. Criar uma conta não concede automaticamente a capacidade de usar todos os objetos do banco de dados.

Você pode verificar se o usuário existe consultando a tabela de usuários do sistema:

SELECT User, Host FROM mysql.user WHERE User = 'app_user';

Conceder permissões

Agora precisamos conceder explicitamente ao app_user permissão para usar o app_db.

Queremos conceder ao usuário todos os direitos (ler, gravar e modificar tabelas) no app_db.

Execute este comando no shell do MySQL:

GRANT ALL PRIVILEGES ON app_db.* TO 'app_user'@'localhost';

Entendendo a sintaxe:

  • GRANT ALL PRIVILEGES: concede direitos de acesso completos.
  • ON app_db.*: aplica esses direitos ao banco de dados app_db e a * (todas as tabelas dentro dele).
  • TO 'app_user'@'localhost': especifica quem receberá esses direitos.

O padrão database.* é importante porque as permissões podem ser definidas para diferentes escopos. No MySQL/MariaDB, os direitos podem ser concedidos globalmente, por banco de dados, por tabela e, em alguns casos, com escopo ainda mais restrito.

Isso garante que o app_user tenha poder dentro do app_db, mas não tenha poder em nenhum outro lugar.

Para confirmar se as permissões foram atribuídas corretamente:

SHOW GRANTS FOR 'app_user'@'localhost';

Verificar o acesso do usuário

Para garantir que tudo funciona conforme o esperado, sairemos da conta root e tentaremos fazer login como o novo usuário.

Primeiro, encerre a sessão root:

EXIT;

Agora, de volta ao terminal do Linux, faça login como app_user:

mysql -u app_user -p

Quando solicitado, informe a senha password.

Depois de fazer login, verifique quais bancos de dados você consegue visualizar:

SHOW DATABASES;

O que verificar:

  • Você deverá ver app_db e information_schema.
  • Você não deverá ver mysql nem sys.

Isso confirma que as configurações de permissão estão funcionando corretamente: o usuário vê somente aquilo que tem autorização para acessar.

Essa etapa de verificação é fundamental no controle de acesso. Não basta executar uma instrução GRANT; você deve confirmar que a visão resultante do sistema corresponde ao modelo de menor privilégio planejado.

Mude para o seu banco de dados para concluir o laboratório:

USE app_db;
EXIT;

Resumo

Neste laboratório, você implementou com sucesso um modelo seguro de acesso a bancos de dados. Você aprendeu a:

  • Criar um novo banco de dados (app_db).
  • Criar um usuário dedicado (app_user).
  • Conceder privilégios específicos usando o comando GRANT.
  • Verificar se os controles de acesso estão funcionando conforme planejado.

O modelo de menor privilégio é um dos fundamentos da segurança de bancos de dados e deve ser usado em todas as aplicações que você implantar.