Aguarde...

15 de março de 2022

9 dicas avançadas de segurança do MySQL

9 dicas avançadas de segurança do MySQL

Proteja seu servidor de banco de dados MySQL seguindo estas dicas fáceis.

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 do seu banco de dados MySQL e fornece nove dicas para fortalecer sua segurança.

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

O 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'; #Global privileges
REVOKE CREATE,DROP ON database_name.* FROM 'user_name'@'host_name'; #Database privileges
REVOKE INSERT, UPDATE,DELETE ON database_name.table_name FROM 'user_name'@'host_name'; #Table privileges
flush privileges;

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]
skip-networking
sudo service mysql restart

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 from mysql.user where user='root' and host not in ('localhost', '127.0.0.1', '::1'); mysql> flush privileges; 

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 global 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 arquivo /etc/passwd da seguinte forma:

select 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:

select 'Local File SQL Injection' into outfile '/tmp/file.txt';
cat /tmp/file.txt

Saída:

Local File SQL Injection
  • despejar arquivo

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

cat /tmp/file.txt
select 'Hello world!' into dumpfile '/tmp/world';

Saída:

Query OK, 1 row affected (0.001 sec)

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

revoke FILE on *.* from 'user_name'@'localhost';

4. Desative a porta padrão

Sabemos que os serviços 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
port=XXXX
sudo service mysql restart

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 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:

CREATE USER 'jhon'@'192.168.132.0/255.255.255.0'; 

O valor de host acima permite que o usuário john acesse 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. Desative o 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, o MySQL versões 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.

select user, host, password from mysql.user where user like '';
9 dicas avançadas de segurança do MySQL

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:

drop user " "@"localhost"
flush privileges;

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 erro -user=root .

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 as permissões de leitura/gravação do servidor MySQL para 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
user=mysql
sudo service mysql restart

8. Defina a senha para a 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 a opção -user=root . Você pode evitar isso definindo a senha da seguinte forma:

sudo mysqladmin password
vim /etc/mysql/my.cnf
password=<your_password>
sudo service mysql restart

9. Garantir 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.

Postado em Blog
Escreva um comentário