O MySQL é um dos sistemas de gerenciamento de banco de dados relacionais mais populares que é um jackpot para invasores que tentam se infiltrar nos bancos de dados. Um servidor de banco de dados MySQL recém-instalado pode ter muitas vulnerabilidades e brechas. Como a segurança dos dados é de grande importância, é obrigatório entender todos os aspectos da segurança do MySQL.

Este artigo se concentra na auditoria e segurança de seu banco de dados MySQL e fornece nove dicas para fortalecer sua segurança.

1. Evite concessões de privilégios desnecessárias

MySQL permite várias declarações de privilégios que, quando atribuídas desnecessariamente a um usuário desprivilegiado, podem levar à leitura/gravação de arquivos e à subversão de outros privilégios de usuário. Algumas das instruções de privilégio mais potencialmente arriscadas são FILE, GRANT, SUPER, ALTER, DELETE, SHUTDOWN e assim por diante. Você pode ler mais sobre isso na documentação oficial do MySQL. Portanto, não atribua privilégios de superusuário como FILE, GRANT, SUPER e PROCESS a contas não administrativas. Você pode revogar essas permissões desnecessárias globais, de banco de dados e de nível de tabela da seguinte maneira:

REVOKE ALL ON *.* FROM 'user_name'@'host_name'; #Privilégios globais
REVOKE CREATE, DROP ON database_name.* FROM 'user_name'@'host_name'; #Privilégios do banco de dados
REVOKE INSERT, UPDATE, DELETE ON database_name.table_name FROM 'user_name'@'host_name'; #Privilégios de tabela
privilégios de descarga;

2. Restringir logins remotos

O acesso remoto facilita o trabalho dos administradores de banco de dados, mas arrisca o servidor a possíveis vulnerabilidades e explorações. Você pode desabilitar o acesso remoto para todos os tipos de contas de usuário MySQl adicionando uma variável skip-networking ao arquivo de configuração principal e reiniciando o serviço.

[mysqld]
pular rede
sudo serviço mysql reiniciar

Da mesma forma, você deve desabilitar o acesso à conta root, se não todos, para restringir os logins remotos da conta root. Essa precaução impede o uso de força bruta na conta root do MySQL.

mysql> delete de mysql.user onde user='root' e host not in ('localhost', '127.0.0.1', '::1'); mysql> privilégios de descarga; 

3. Desativar funções (load_file, outfile, dumpfile)

Outra precaução para proteger o MySQL contra injeção de arquivo local é desabilitar funções acessíveis apenas através do privilégio de concessão FILE. O FILE é uma opção que permite que usuários de baixo privilégio com opções de comando globais leiam ou gravem arquivos no servidor.

  • load_file

A função load_file carrega o conteúdo do arquivo do servidor como uma string. Por exemplo, o comando a seguir carregará todo o conteúdo do /etc/passwd arquivo da seguinte forma:

selecione load_file('/etc/passwd')
  • arquivo de saída

Da mesma forma, a função outfile grava conteúdo nos arquivos do servidor local. Os invasores podem usar essa função para gravar uma carga útil no arquivo no servidor, da seguinte maneira:

selecione 'Local File SQL Injection' em outfile '/tmp/file.txt';
cat /tmp/arquivo.txt

Saída:

Injeção de SQL de arquivo local
  • despejar arquivo

Esta função usa a causa select para gravar no arquivo sem retornar a saída para a tela.

cat /tmp/arquivo.txt
selecione 'Olá mundo!' no arquivo de despejo '/tmp/world';

Saída:

Consulta OK, 1 linha afetada (0,001 s)

Você pode desabilitar essas funções revogando o privilégio FILE da seguinte forma:

revogue FILE em *.* de 'user_name'@'localhost';

Relacionado: Guia de um iniciante para Metasploit no Kali Linux (com exemplos práticos)

4. Desativar porta padrão

Sabemos que os serviços do MySQL são executados na porta 3306 e os invasores verificam as portas para verificar os serviços em execução na rede. Para adicionar segurança por obscuridade e alterar a porta padrão do MySQL editando a variável do sistema port em seu arquivo de configuração principal, você precisará inserir o seguinte:

vim /etc/mysql/my.cnf
porta=XXXX
sudo serviço mysql reiniciar

5. Evite curingas em nomes de contas

Os nomes de conta no MySQL consistem em duas partes que são um usuário e um nome de host "user_name"@"host_name". Ele permite que o administrador crie contas para os usuários com o mesmo nome que se conectam de diferentes hosts. No entanto, a parte do host de um nome de conta permite convenções de curingas que podem ser um ponto de acesso ao banco de dados de qualquer lugar.

O uso opcional do valor do nome do host ou do endereço IP é equivalente a 'user_name'@'%' onde % corresponde à operação LIKE do padrão MySQL e % significa qualquer nome de host. Enquanto isso, o acesso do '192.168.132.%' significa qualquer tentativa da rede classe C. Além disso, qualquer pessoa pode acessar o banco de dados nomeando a parte do host como '192.18.132.mysql.com'.

Para evitar tais tentativas, o MySQL permite definir uma máscara de rede com o valor do host para identificar os bits de rede de um endereço IP:

client-ip_add & netmask = host_name

A sintaxe para criar um nome de host é host_ip/netmask:

CRIAR USUÁRIO 'jhon'@'192.168.132.0/255.255.255.0'; 

O valor de host acima permite que o usuário João para acessar o banco de dados de qualquer IP dentro do intervalo de 192.168.132.0-192.168.132.255. Da mesma forma, os valores de host de 192.168.132.0/255.0.0.0, 192.168.132.0/255.255.0.0 permitirão hosts das redes de classe A e B. Enquanto 192.168.132.5 só permitirá o acesso do IP específico.

6. Desativar acesso explícito

O nome de usuário no MySQL é um nome com o qual os bancos de dados aceitam conexões de entrada ou um nome de usuário em branco "@"host_name" que cria um usuário anônimo. No entanto, a presença de um usuário anônimo pode alavancar invasores para acessar o servidor de banco de dados. Além disso, as versões do MySQL anteriores ao MySQL 5.7 criam um conjunto anônimo de usuários e a instalação após a atualização da versão ainda adiciona esses usuários.

selecione usuário, host, senha de mysql.user onde usuário gosta de '';

Você pode observar que as colunas de usuário e senha estão vazias e o acesso é limitado ao localhost. No entanto, você não quer que ninguém acesse o banco de dados. Use o seguinte comando para excluir usuários anônimos:

solte o usuário " "@"localhost"
privilégios de descarga;

7. Definir conta não raiz como proprietário ou grupo

A configuração de uma conta de usuário não root não está relacionada ao usuário root do MySQL. A instalação do MySQL em sistemas Linux/Unix a partir dos pacotes tar e tar.gz permite que o servidor seja executado por qualquer usuário desprivilegiado. Esta é uma desvantagem de segurança porque qualquer usuário com a opção de concessão FILE pode editar ou criar arquivos no servidor. No entanto, ele retorna um erro quando um usuário tenta acessá-lo sem o -usuário=raiz erro.

Você pode evitar isso praticando a regra básica de acessar o servidor de banco de dados como um usuário Linux separado. Para executar o mysqld como um usuário Linux regular, pare o servidor e altere permissões de leitura/gravação do servidor MySQL para o mysql, da seguinte forma:

chown -R mysql /path/to/mysql/datadir

Abra o arquivo de configuração principal do MySQL, adicione um novo usuário mysql e reinicie o serviço para evitar acesso não necessário ao servidor:

vim /etc/mysql/my.cnf
usuário=mysql
sudo serviço mysql reiniciar

8. Definir senha para conta raiz

A instalação do MySQL através de um shell interativo em distribuições Linux baseadas em Debian cria a conta de usuário root e solicita que você defina uma senha. No entanto, isso não acontece na instalação do shell não interativo e nas distribuições baseadas em Red-Hat. Como dito acima, um usuário não root de uma máquina Linux pode acessar a conta de usuário root do mysql usando o -usuário=raiz opção. Você pode evitar isso definindo a senha da seguinte forma:

sudo mysqladmin senha
vim /etc/mysql/my.cnf
senha=
sudo serviço mysql reiniciar

9. Garanta a criptografia de dados em trânsito e em repouso

A comunicação não criptografada padrão entre o cliente e o servidor representa um risco de interceptação de dados por qualquer intermediário. Da mesma forma, dados de usuário não criptografados no banco de dados colocam em risco a confidencialidade e a integridade do usuário. MySQL suporta criptografia de dados entre o cliente e o servidor sobre o protocolo TLS/SSL, enquanto a comunicação não criptografada só é aceitável quando ambas as partes comunicantes estão dentro da mesma rede.

O MySQL agora suporta criptografia em repouso para proteger os dados armazenados no servidor, mesmo quando o sistema é violado.

Segurança avançada do MySQL: proteja-se

Garantir que você tenha os mais altos níveis de segurança online é fundamental, e este artigo fornecerá algumas dicas úteis na direção certa. As etapas acima são úteis para proteger seu servidor de banco de dados, mas aprender como atribuir permissões mínimas a usuários não administrativos também é essencial.

Guia do iniciante para escrever esquemas de banco de dados mySQL

Crie seu próprio banco de dados MySQL com apenas um editor de texto e este esquema básico de estrutura, ou "esquema".

Leia a seguir

ParticipaçãoTweetE-mail
Tópicos relacionados
  • Programação
  • Segurança
  • Programação
  • Dicas de segurança
  • Segurança
Sobre o autor
Rumaisa Niazi (15 Artigos Publicados)

Rumaisa é redatora freelancer na MUO. Ela já desempenhou muitos cargos, de matemática a entusiasta de segurança da informação, e agora está trabalhando como analista de SOC. Seus interesses incluem ler e escrever sobre novas tecnologias, distribuições Linux e qualquer coisa relacionada à Segurança da Informação.

Mais de Rumaisa Niazi

Assine a nossa newsletter

Junte-se à nossa newsletter para dicas de tecnologia, análises, e-books gratuitos e ofertas exclusivas!

Clique aqui para assinar