Segurança Geral
Qualquer um usando o MariaDB 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 MariaDB 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 MariaDB e servidores. Vários dos conceitos discutidos aqui não são específicos do MariaDB; 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 dadosMariaDB
!. Isto é perigoso. A senha criptografada é a senha real no MySQL. Se você conhece a senha listada na tabelauser
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 MariaDB. Os comandos
GRANT
eREVOKE
são usados para controlar o acesso ao MariaDB. 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 corretamente ao servidor sem a solicitação de uma senha, você tem problemas. Qualquer um pode conectar ao seu servidor MariaDB como o usuárioroot
com privilégios plenos! Revise as instruções de instalação do MariaDB, prestando atenção particularmente ao item sobre configuração da senha do usuárioroot
. - 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 comandoREVOKE
.
- Tente
- 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 seriaduag98
que contém a mesma palavra 'fish mas digitada uma letra a esquerda em um teclado QWERTY convencional. Outro método seria usarMhall
que é obtido dos primeiros caracteres de cada palavra na fraseMary 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 MariaDB atrás do firewall ou em uma zona desmilitarizada (DMZ).
Checklist:
- Tente examinar suas portas da Internet utilizando alguma ferramenta como o
nmap
. O MariaDB 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 MariaDB está aberta ou não é tentar o seguinte comando de alguma máquina remota, ondenome_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.
- Tente examinar suas portas da Internet utilizando alguma ferramenta como o
- 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
. 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.; DROP DATABASE mysql;
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 deSELECT * FROM table WHERE ID=234
. O MariaDB 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 MariaDB, 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 MariaDB ou sua aplicação deve gerar um erro. Passar valores não verificados ao MariaDB é extramente perigoso!
- Confira o tamanho dos dados antes de passá-los ao MariaDB.
- 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.
- Tente inserir '
- Usuários do PHP:
- Confira a função
addslashes()
. No PHP 4.0.3, uma funçãomysql_escape_string()
está disponível e é baseada na função com o mesmo nome da API C do MariaDB.
- Confira a função
- Usuários do API C do MariaDB:
- Confira a chamada API
mysql_escape_string()
.
- Confira a chamada API
- Usuários do MariaDB:
- Confira os modificadores
escape
equote
para consultas streams.
- Confira os modificadores
- Usuários do Perl DBI:
- Confira o método
quote()
ou utilize aspas simples ou duplas.
- Confira o método
- Usuários do Java JDBC:
- Utilize um objeto
PreparedStatement
e aspas simples ou duplas.
- Utilize um objeto
- Todas aplicações Web:
- 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 MariaDB 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
estrings
. Para a maioria dos casos você pode conferir se o fluxo de dados do MariaDB 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.