Database
 sql >> Base de Dados >  >> RDS >> Database

Seu banco de dados está protegido? Pense de novo


1. Proteja seu servidor

Muitos ataques conhecidos são possíveis apenas uma vez acessando fisicamente uma máquina. Por esse motivo, é melhor ter o servidor de aplicativos e o servidor de banco de dados em máquinas diferentes. Caso isso não seja possível, maiores cuidados devem ser tomados, caso contrário, executando comandos remotos por meio de um servidor de aplicação, um invasor pode prejudicar seu banco de dados mesmo sem permissões. Por esse motivo, qualquer serviço executado na mesma máquina que o banco de dados deve receber a permissão mais baixa possível que ainda permita que o serviço funcione.


Não se esqueça de instalar o pacote de segurança completo:Antivírus e Antispam, Firewall e todos os pacotes de segurança recomendados pelo fornecedor do seu sistema operacional. Além disso, não se esqueça de passar 10 minutos pensando na localização física do seu servidor - no local errado, seu servidor pode ser roubado, inundado, prejudicado por animais selvagens ou vagabundos.

2. Segurança do host local ou Desabilite ou restrinja o acesso remoto

Considere se o MySQL será recuperado do sistema ou acessado diretamente de seu próprio servidor. Se o acesso remoto for usado, certifique-se de que os hosts recém-definidos possam acessar o servidor. Isso geralmente é feito por meio de wrappers TCP, tabelas de IP ou outras ferramentas de programação de firewall ou acessibilidade de hardware.
Para impedir o MySQL de abrir um socket de rede, o parâmetro que o acompanha deve ser incluído na área [mysqld] de my.cnf ou my.ini:

pular rede

O documento está localizado em "C:\Program Files\MySQL\MySQL Server 5.1" catálogo no sistema operacional Windows ou "/etc/my.cnf" ou "/etc/mysql/my.cnf" no Linux.
Esta linha prejudica o início da administração de sistemas no meio da inicialização do MySQL. Seria ideal se você tivesse em mente que uma conexão local pode ser usada para configurar uma conexão com o servidor MySQL.

Outra solução possível é forçar o MySQL a escutar apenas o host local adicionando a seguinte linha no [mysqld] seção de my.cnf endereço de ligação=127.0.0.1
Você pode não estar disposto a incapacitar o acesso do sistema ao seu servidor de banco de dados se os clientes em sua organização fizerem interface com o servidor a partir de suas máquinas ou do servidor web introduzido em uma máquina alternativa. Nesse caso, a seguinte sintaxe de concessão restritiva deve ser considerada:
mysql> GRANT SELECT, INSERT ON mydb.\* TO 'someuser'@'somehost';  

3. Desative o uso de LOCAL INFILE

A próxima mudança é desabilitar o uso do "LOAD DATA LOCAL INFILE" comando, que ajudará a manter leituras não aprovadas dos registros do bairro. Isso é particularmente vital quando novas vulnerabilidades de injeção de SQL em aplicativos PHP são encontradas.
Além disso, em certos casos, o "LOCAL INFILE" comando pode ser usado para obter acesso a outros arquivos no sistema operacional, por exemplo "/etc/passwd" , usando o seguinte comando:
mysql> LOAD DATA LOCAL INFILE '/etc/passwd' INTO TABLE table1

Ou mesmo significativamente menos difícil:
mysql> SELECT load\_file("/etc/passwd")

Para desabilitar o uso do "LOCAL INFILE" comando, o seguinte parâmetro deve ser adicionado no [mysqld] seção do arquivo de configuração do MySQL.
set-variable=local-infile=0

4. Altere o nome de usuário e a senha do root, mantenha-os fortes.

O nome de usuário padrão do administrador no servidor MySQL é "root" . Os hackers geralmente tentam obter acesso às suas permissões. Para dificultar essa tarefa, renomeie "root" para outra coisa e forneça uma senha alfanumérica longa e complexa.

Para renomear o nome de usuário do administrador, use o comando rename no console do MySQL:
mysql> RENAME USER root TO new\_user;

O "RENOMEAR USUÁRIO" do MySQL O comando apareceu pela primeira vez no MySQL versão 5.0.2. Se você usa uma versão mais antiga do MySQL, pode usar outros comandos para renomear um usuário:
mysql> use mysql;

mysql> update user set user="new\_user" where user="root";

mysql> flush privileges;

Para alterar a senha de um usuário, use o seguinte comando de linha de comando:
mysql> SET PASSWORD FOR 'username'@'%hostname' = PASSWORD('newpass');

Também é possível alterar a senha usando o "mysqladmin" Utilitário:
shell> mysqladmin -u username -p password newpass

5. Remova o banco de dados "Teste"

O MySQL vem com um banco de dados de "teste" destinado a ser um espaço de teste. Ele pode ser acessado pelo usuário anônimo e, portanto, é usado por inúmeros ataques.
Para remover esse banco de dados, use o comando drop da seguinte forma:
mysql> drop database test;  

Ou use o "mysqladmin" comando:
shell> mysqladmin -u username -p drop test  

6. Remova contas anônimas e desatualizadas

O banco de dados MySQL vem com alguns usuários anônimos com senhas em branco. Como resultado, qualquer pessoa pode se conectar ao banco de dados para verificar se esse é o caso, faça o seguinte:
mysql> select \* from mysql.user where user="";  

Em um sistema seguro, nenhuma linha deve ser repetida. Outra forma de fazer o mesmo:
mysql> SHOW GRANTS FOR ''@'localhost';

mysql> SHOW GRANTS FOR ''@'myhost';

Se as concessões existirem, qualquer pessoa pode acessar o banco de dados e pelo menos usar o banco de dados padrão"teste" . Verifique isso com:
shell> mysql -u blablabla

Para remover a conta, execute o seguinte comando:
mysql> DROP USER "";

O "DROP USER" do MySQL O comando é suportado a partir do MySQL versão 5.0. Se você usa uma versão mais antiga do MySQL, pode remover a conta da seguinte forma:
mysql> use mysql;

mysql> DELETE FROM user WHERE user="";

mysql> flush privileges;  

7. Aumente a segurança com o controle de acesso baseado em função

Uma recomendação de segurança de banco de dados muito comum é diminuir as permissões concedidas a várias partes. O MySQL não é diferente. Normalmente, quando os desenvolvedores trabalham, eles usam a permissão máxima do sistema e dão menos consideração aos princípios de permissão do que poderíamos esperar. Essa prática pode expor o banco de dados a riscos significativos.
* Qualquer nova instalação do MySQL 5.x já instalada usando as medidas de segurança corretas.
Para proteger seu banco de dados, certifique-se de que o diretório de arquivos no qual o banco de dados MySQL está realmente armazenado seja de propriedade do usuário "mysql" e do grupo "mysql".
shell>ls -l /var/lib/mysql

Além disso, certifique-se de que apenas o usuário "mysql" e "root" tenham acesso ao diretório /var/lib/mysql .
Os binários mysql, que residem no diretório /usr/bin/, devem ser de propriedade do usuário "root" ou do usuário "mysql" do sistema específico. Outros usuários não devem ter acesso de gravação a esses arquivos.
shell>ls -l /usr/bin/my\*  

8. Verifique os privilégios do banco de dados

As permissões do sistema operacional foram corrigidas na seção anterior. Agora vamos falar sobre permissões de banco de dados. Na maioria dos casos, há um usuário administrador (o "raiz" renomeado) e um ou mais usuários reais que coexistem no banco de dados. Normalmente, a "raiz" não tem nada a ver com os dados do banco de dados; em vez disso, é usado para manter o servidor e suas tabelas, para conceder e revogar permissões, etc.
Por outro lado, alguns ids de usuário são usados ​​para acessar os dados, como o id de usuário atribuído ao servidor web para executar consultas "select\update\insert\delete" e para executar procedimentos armazenados. Na maioria dos casos, nenhum outro usuário é necessário; no entanto, somente você, como administrador do sistema, pode realmente conhecer as necessidades do seu aplicativo.

Somente contas de administrador precisam ter privilégios SUPER / PROCESS /FILE e acesso ao banco de dados mysql. Normalmente, é uma boa ideia diminuir as permissões do administrador para acessar os dados.

Revise os privilégios dos demais usuários e assegure-se de que estejam configurados adequadamente. Isso pode ser feito usando as etapas a seguir.
mysql> use mysql;  

[Identificar usuários]
mysql> select \* from users;  

[Listar concessões de todos os usuários]
mysql> show grants for ‘root’@’localhost’;

A instrução acima deve ser executada para cada usuário! Observe que apenas os usuários que realmente precisam de privilégios de root devem recebê-los.

Outro privilégio interessante é "SHOW DATABASES". Por padrão, o comando pode ser usado por qualquer pessoa que tenha acesso ao prompt do MySQL. Eles podem usá-lo para coletar informações (por exemplo, obter nomes de banco de dados) antes de atacar o banco de dados, por exemplo, roubando os dados. Para evitar isso, é recomendável seguir os procedimentos descritos abaixo.
  • Adicione " --skip-show-database" ao script de inicialização do MySQL ou adicione-o ao arquivo de configuração do MySQL
  • Conceda o privilégio SHOW DATABASES apenas aos usuários que você deseja que usem este comando

Para desabilitar o uso do comando "SHOW DATABASES", o seguinte parâmetro deve ser adicionado na seção [mysqld] do /etc/my.cnf :

[mysqld]
skip-show-database  

9. Ativar registro

Se seu servidor de banco de dados não executa muitas consultas, é recomendado que você habilite o log de transações, adicionando a seguinte linha à seção [mysqld] do /etc/my.cnf Arquivo:

[mysqld]
log =/var/log/mylogfile  

Isso não é recomendado para servidores MySQL de produção pesada porque causa alta sobrecarga no servidor.
Além disso, verifique se apenas os ids "root" e "mysql" têm acesso a esses arquivos de log (pelo menos acesso de gravação).

Registro de erros Certifique-se de que apenas "root" e "mysql" tenham acesso ao arquivo de log "hostname.err". O arquivo é armazenado no diretório de dados do mysql. Esse arquivo contém informações muito confidenciais, como senhas, endereços, nomes de tabelas, nomes de procedimentos armazenados e partes de código. Ele pode ser usado para coleta de informações e, em alguns casos, pode fornecer ao invasor as informações necessárias para explorar o banco de dados, a máquina na qual o banco de dados está instalado ou os dados dentro dele.

Registro do MySQL Certifique-se de que apenas "root" e "mysql" tenham acesso ao arquivo de log "logfile XY". O arquivo é armazenado no diretório de dados do mysql.

10. Altere o diretório raiz

Um chroot em sistemas operacionais UNIX {sistema operacional} é uma operação que altera o diretório raiz do disco aparente para o método atual em execução e seus filhos. Um programa que é re-enraizado em um diretório diferente não pode acessar ou nomear arquivos fora desse diretório e, portanto, o diretório é chamado de "chroot jail" ou (menos comumente) "chroot jail".

Ao usar o ambiente chroot, o acesso de gravação dos processos mySQL (e processos filhos) pode ser limitado, aumentando a segurança do servidor.

Certifique-se de que exista um diretório dedicado para o ambiente em chroot. Isso deve ser algo como:/chroot/mysql Além disso, para facilitar o uso das ferramentas administrativas do banco de dados, o seguinte parâmetro deve ser alterado na seção [client] do arquivo de configuração do MySQL:

[cliente]
socket = /chroot/mysql/tmp/mysql.sock

Graças a essa linha de código, não haverá necessidade de fornecer os comandos mysql, mysqladmin, mysqldump etc. com o --socket=/chroot/mysql/tmp/mysql.sock parâmetro toda vez que essas ferramentas são executadas.

11. Exclua registros antigos regularmente

Durante os procedimentos de instalação, há muitos dados confidenciais que ajudarão usuários indesejados a atacar um banco de dados. Esses dados são mantidos no histórico do servidor e podem ser muito úteis se algo der errado durante a instalação. Ao analisar os arquivos de histórico, os administradores podem descobrir o que deu errado e provavelmente consertar as coisas. No entanto, esses arquivos não são necessários após a conclusão da instalação.
Devemos remover o conteúdo do arquivo de histórico do MySQL (~/.mysql_history), onde quer que todos os comandos SQL mortos sejam mantidos (especialmente senhas, que são mantidas como texto simples):
cat /dev/null > ~/.mysql\_history

Em conclusão, devemos enfatizar a segurança do banco de dados. No entanto, deve ser a primeira coisa para qualquer indivíduo ou empresa.