Escolar Documentos
Profissional Documentos
Cultura Documentos
pontos fortes?
O banco de dados é parte fundamental de um sistema, sendo o provedor dos dados, ou seja, o
sistema realiza uma série de validações e aplica as regras de negócio e os demais controles de
acesso a informação para por fim armazenar e buscar os dados segundo tais políticas no database.
Fica claro que um dos pontos fracos e de maior importância em tal sistema é o banco de dados, e
por isso o administrador deve providenciar e implementar estratégias de segurança que impeçam
acessos indevidos e indisponibilidades do banco de dados.
O MySQL tem determinadas peculiaridades que podem se tornar vulnerabilidades ou pontos fortes
na segurança do sistema, isso dependerá do uso de tais recursos pelo administrador. Meu objetivo
aqui é explanar esses recursos exibindo as vulnerabilidades e erros mais comuns cometidos, bem
como as implementações necessárias para ter um ambiente seguro.
Esse programa fará algumas verificações no catalogo de usuários,senhas, e nos bancos de dados
padrão, siga o setup respondendo as perguntas!
Outra falha clássica! Ao utilizar o client do mysql o mesmo salva os comandos executados pelo
usuário em um arquivo “.mysql_history” similar ao “.history” do linux! A cagada está feita!
Dependendo da versão do MySQL o mesmo grava até os comandos de criação de usuário nesse
arquivo, de forma que obtendo acesso ao home do usuário em questão você conseguirá descobrir
credencias de acesso ao banco de dados, e os demais comandos executados por aquele usuário.
Como resolver? Aponte esse arquivo para o “/dev/null”, por exemplo:
rm /home/usuario/.mysql_history
ln -s /dev/null /home/usuario/.mysql_history
O restante fica por conta da boa administração do sistema operacional, evitando a criação de
acessos e permissões indevidas.
Usuários e privilégios
Já foi apresentada uma breve introdução sobre a parametrização de usuários no tópico anterior. Você
pode iniciar a correção de problemas de segurança em usuários utilizando o script
“mysql_secure_installation“, fora isso você deverá remover os usuários padrão, não deixar nenhum
acesso sem senha como medidas básicas de segurança! Vamos lá:
Qual é o usuário que existe em todaaaaa nova instalação MySQL?
O “root”, se alguém tentar utilizar algum método de força bruta em seu banco de dados,
provavelmente utilizará o usuário “root”, pois ele existe em toda instalação e raramente é removido!
A boa prática indica que se crie um novo usuário como as mesmas permissões do “root” mas com
outro login, além disso remova os demais usuários que não serão utilizados e crie senhas para todos
os usuários do banco de dados, veja abaixo um exemplo:
Isso lhe garantirá boas práticas de acesso e uma segurança adicional evitando ataques de brutal
force, já que você não terá acessos padrão, quanto as credencias de acesso e privilégios dos demais
usuários você pode adotar outras práticas, segue:
• Crie uma conta para cada aplicativo no banco de dados, evitando que um aplicativo
tenhas as mesmas permissões de acesso do outro
• Limite ao extremo os acessos, converse com os desenvolvedores e veja quais são os
privilégios necessário, e lembre-se de atribuir tais privilégios ao database correto
• Nunca utilize “grant all privileges on *.* to “, somente utilize essa cláusula para
criar novos administradores, usuários de aplicação não devem ter acesso extras. Pois
caso o aplicativo seja invadido o atacante terá o mínimo de acesso possível.
• Evite atribuir privilégios de DROP pois se aplicativo for invadido o atacante terá
mais dificuldade para apagar tabelas ou causar outros danos
• Nunca mantenha usuários sem senha em seu banco de dados
• Evite criar usuários com permissão de acesso partindo de qualquer HOST, utilize nas
cláusulas sempre a relação “usuario@host”, como em:
CREATE USER 'APPMOB'@'10.0.0.3' IDENTIFIED BY 'SenHASd$@#%23';
Rede e infraestrutura
A maior brecha de segurança poderá ser encontrada aqui! O tráfego de informações entre o servidor
e o client MySQL não são criptografados, portanto com um programa de captura de pacotes você
pode analisar todo o tráfego e coletar as transações do banco de dados, o que é uma vulnerabilidade
muito grave em um sistema! Os métodos mais comuns utilizados para sanar essa falha são:
• Manter o banco de dados em uma rede diferente do sistema e restringir o acesso entre o
sistema e o banco de dados através de uma VLAN
• Utilizar SSL no MySQL, isso é possível e fará com que os dados trafeguem criptografados,
veja como em: http://dev.mysql.com/doc/refman/5.6/en/ssl-connections.html
• Não! Nunca, pelo amor de Deus! Evite isso, não deixe o seu banco de dados aberto para a
internet, deixar a porta 3306 ou seja lá a porta que o seu banco de dados esteja operando
disponível na internet é uma brecha bem grave! Se você tiver de deixar o seu banco de dados
disponível para acessos externos, utilize uma VPN, regras de firewall não serão suficientes,
você precisa encapsular os pacotes através de um protocolo seguro como uma VPN.
• Altere a porta padrão do banco de dados, por padrão os programas de varredura e força bruta
irão operar na porta 3306, isso pode ser feito através da edição do arquivo de configuração
do MySQL:
[mysqld]
port = 13306
Replicação
• Ao criar usuários para manipulação e operação da replicação, siga as instruções do site
oficial do MySQL, não atribua privilégios a mais do que o necessário.
• Utilize o MySQL com SSL para encapsular os pacotes que trafegam na rede
• Não trate seu ambiente de contingência como uma salinha de bagunça! Aplique as mesmas
políticas de segurança utilizadas no seu ambiente de produção, pois ele poderá ser alvo de
ataque.
Aplicação e codificação
• Utilize frameworks durante o desenvolvimento de seu aplicativo, preferencialmente
frameworks bem consolidados, eles irão evitar erros clássicos de SQL INJECTION.
• Veja exemplos de tratamento de SQL INJECTION em
http://www.php.net/manual/pt_BR/security.database.sql-injection.php
• Evite atribuir muitos privilégios ao usuário de aplicação, restrinja o acesso do usuário de
aplicação ao database do aplicativo em questão e não libere privilégios de DROP
• Grave todas as senhas no banco de dados com algum tipo de HASH, assim se o atacante
conseguir extrair informações via SQL INJECTION o mesmo não conseguirá identificar as
senhas de acesso do sistema, e não analisará ou obterá informações estratégicas geradas pelo
sistema em tempo de execução.
• Crie rotinas em PROCEDURES que façam as operações no banco de dados, tanto de
SELECT, INSERT,DELETE e deixe o usuário de aplicação só com privilégio de execução
nas PROCEDURES, assim o atacante estará limitado a executar as PROCEDURES e nada
mais.
Log e monitoramento
Após implementar uma política de segurança em seu database e ambiente operacional, crie plugins
de monitoramento que possibilitem a verificação dessas políticas, de modo que você tenha a
garantia de que seu ambiente continua operando conforme planejado. Verifique os catálogos de
usuário do banco de dados, verifique as permissões de acesso dos usuários, valide as permissões e
os owners dos arquivos no sistema operacional, crie PROCEDURESe TRIGGERS para monitorar
as atividades de seus usuários. Veja um exemplo: