Qualquer um usando o MySQL em um computador conectado à internet deve ler esta seção para evitar os erros de segurança mais comuns.
Discutindo segurança, nós enfatizamos a a necessidade de proteger completamente o servidor (não simplesmente o servidor MySQL) contra todos os tipos de ataques aplicáveis: eavesdropping, altering, playback e denial of service. Não cobriremos todos os aspectos de disponibilidade e tolerância a falhas aqui.
O MySQL utiliza a segurança baseado em Listas de Controle de Acesso (ACL) para todas conexões, consultas e outras operações que um usuário pode tentar realizar. Existe também algum suporte para conexões criptografadasSSL entre clientes MySQL e servidores. Vários dos conceitos discutidos aqui não são específicos do MySQL; as mesmas idéias podem ser aplicadas para a maioria das aplicações.
Quando executando o MySQL, siga estes procedimentos sempre que possível:
nunca conceda a alguém (exceto ao
usuário root do mysql) acesso à tabela
user
no banco de dados
mysql
!. Isto é perigoso.
A senha criptografada é a senha real
no MySQL. Se você conhece a senha listada na
tabela user
para um determinado usuário,
você pode facilmente logar como este
usuário se tiver acesso à máquina relacionada para aquela
conta.
Aprenda o sistema de controle de acessos do MySQL. Os
comandos GRANT
e
REVOKE
são usados para controlar o
acesso ao MySQL. Não conceda mais privilégios do que o
necessário. Nunca conceda privilégios para todas as
máquinas.
Checklist:
Tente mysql -u root
. Se você
conseguir conectar com sucesso ao servidor sem a
solicitação de uma senha, você tem problemas.
Qualquer um pode conectar ao seu servidor MySQL como o
usuário root
com privilégios
plenos! Revise as instruções de instalação do MySQL,
prestando atenção particularmente ao item sobre
configuração da senha do usuário
root
.
Utilize o comando SHOW GRANTS
e
confira para ver quem tem acesso a o que. Remova aqueles
privilégios que não são necessários utilizando o
comando REVOKE
.
Não mantenha nenhuma senha de texto puro no seu banco de
dados. Quando seu computador fica comprometido, o intruso
pode obter a lista completa de senhas e utilizá-las.
Utilize a função MD5()
,
SHA1()
ou qualquer função de
embaralhamento de via única.
Não escolha senhas de dicionários. Existem programas especiais para quebrá-las. Mesmo senhas como ``xfish98'' não sao boas. Muito melhor seria ``duag98'' que contém a mesma palavra 'fish mas digitada uma letra a esquerda em um teclado QWERTY convencional. Outro método seria usar ``Mhall'' que é obtido dos primeiros caracteres de cada palavra na frase ``Mary has a litle lamb''. Isto é fácil de lembrar e digitar, mas dificulta que alguém que não a conheça a advinhe.
Invista em um firewall. Ele protege você de pelo menos 50% de todos os tipos de exploits em qualquer software. Coloque o MySQL atrás do firewall ou em uma zona desmilitarizada (DMZ).
Checklist:
Tente examinar suas portas da Internet utilizando alguma
ferramenta como o nmap
. O MySQL
utiliza a porta 3306 por padrão. Esta porta não deve
ser acessível para máquinas não confiáveis. Outra
maneira simples para conferir se sua porta do MySQL
está aberta ou não é tentar o seguinte comando de
alguma máquina remota, onde
nome_máquina
é o nome da máquina
ou o endereço IP de seu servidor MySQL:
shell> telnet nome_máquina 3306
Se você obter uma conexão e alguns caracteres, a porta
está aberta e deve ser fechada no seu firewall ou
roteador, a menos que você realmente tenha uma boa
razão para mantê-la aberta. Se o
telnet
apenas parar ou a conexão for
recusada, tudo está bem; a porta está bloqueada.
Não confie em nenhum dado incluídos pelos seus usuários.
Eles podem tentar enganar seu código entrando com
caracteres especiais ou sequencias de escape nos
formulários Web, URLS ou qualquer aplicação que você
construa. Tenha certeza que sua aplicação continua segura
se um usuário entrar com algo do tipo ``; DROP
DATABASE mysql;
''. Este é um exemplo extremo, mas
grandes falhas de segurança ou perda de dados podem ocorrer
como o resultado de hackers utilizando técnicas similares,
se você não estiver preparado para eles.
Também lembre de conferir dados numéricos. Um erro comum
é proteger somente as strings. Em alguns casos as pessoas
pensam que se um banco de dados contém somente dados
disponíveis publicamente, ele não precisa ser protegido.
Isto não é verdade. No mínimo ataques do tipo
denial-of-service podem ser feitos nestes bancos de dados. A
maneira mais simples para proteger deste tipo de ataque é
usar apóstrofos em torno das contantes numéricas:
SELECT * FROM tabela WHERE ID='234'
em
vez de SELECT * FROM table WHERE ID=234
.
O MySQL automaticamente converte esta string para um número
e corta todos os símbolos não-numéricos dela.
Checklist:
Todas aplicações Web:
Tente inserir ‘'
’ e
‘"
’ em todos seus
formulários Web. Se você obter qualquer tipo de
erro do MySQL, investigue o problema imediatamente.
Tente modificar qualquer URL dinâmica adicionando
%22
(‘"
’),
%23
(‘#
’) e
%27
(‘'
’) na URL.
Tente modificar os tipos de dados nas URLs dinâmicas de numérico para caractere contendo caracteres dos exemplos anteriores. Sua aplicação deve ser segura contra estes ataques e similares.
Tente inserir caracteres, espaços e símbolos especiais no lugar de número nos campos numéricos. Sua aplicação deve removê-los antes de passá-los para o MySQL ou sua aplicação deve gerar um erro. Passar valores não verificados ao MySQL é extramente perigoso!
Confira o tamanho dos dados antes de passá-los ao MySQL.
Considere ter sua aplicação conectando ao banco de dados utilizando um usuário diferente doq ue o que é utilizado com propósitos administrativos. Não forneça às suas aplicações mais privilégios de acesso do que elas necessitam.
Usuários do PHP:
Confira a função addslashes()
.
No PHP 4.0.3, uma função
mysql_escape_string()
está
disponível e é baseada na função com o mesmo
nome da API C do MySQL.
Usuários do API C do MySQL:
Confira a chamada API
mysql_escape_string()
.
Usuários do MySQL:
Confira os modificadores escape
e
quote
para consultas streams.
Usuários do Perl DBI:
Confira o método quote()
ou
utilize aspas simples ou duplas.
Usuários do Java JDBC:
Utilize um objeto
PreparedStatement
e aspas simples
ou duplas.
Não transmita dados sem criptografia na Internet. Estes dados são acessíveis para todos que tenham o tempo e habilidade para interceptá-lo e usá-lo para seu propósito próprio. No lugar, utilize um protocolo de criptografia como o SSL ou SSH. O MySQL suporta conexões SSL interno desde a versão 3.23.9. O repasse de portas do SSH pode ser usado para criar um tunel criptografado (e com compressão) para a comunicação.
Aprenda a usar os utilitários tcpdump
e
strings
. Para a maioria dos casos você
pode conferir se o fluxo de dados do MySQL está ou não
criptografado utilizando um comando parecido com este:
shell> tcpdump -l -i eth0 -w - src or dst port 3306 | strings
(Isto funciona sobre Linux e deve funcionar com pequenas modificações sob outros sistemas.) Alerta: Se você não ver dados não significa sempre que esteja criptografado. Se você necessita de alta segurança, você deve consultar um especialista em segurança.
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.