Sempre que a segurança do aplicativo é mencionada, as pessoas pensam em proteger os aplicativos contra alguns dos ataques mais frequentes, como injeção, autenticação quebrada, exposição de dados confidenciais e similares. No entanto, embora esses ataques sejam predominantes, saber como proteger seu aplicativo apenas deles não será suficiente - especialmente quando você estiver executando o MySQL. Hoje vamos olhar para um lado diferente da segurança - vamos ver como proteger adequadamente o MySQL.
Como a segurança do MySQL é uma coisa muito importante, trate este post como o início de uma série de posts sobre as medidas de segurança do MySQL. Não abordaremos tudo, mas este post deve fornecer a base de algumas das medidas de segurança do MySQL.
Por que você precisa proteger o MySQL?
Primeiro de tudo, devemos responder a pergunta por que queremos proteger o MySQL. Afinal, se protegermos nosso aplicativo contra as ameaças mais prevalentes, devemos estar seguros, certo? Bem, sim e não.
Você vê, quando você protege seu aplicativo contra certos ataques, você garante que os invasores tenham mais dificuldade em penetrar nas defesas de seu aplicativo - para proteger seu banco de dados, proteger contra tais ataques irá não ser suficiente. Proteger seu banco de dados pode ser a gota d'água que pode salvar seu aplicativo (e seu banco de dados!) da destruição.
Como faço para proteger o MySQL?
Agora, para a questão principal. Como você realmente protege o MySQL?
Ao pensar na segurança de sua(s) instância(s) MySQL, você deve considerar uma ampla gama de opções possíveis. Felizmente, algumas dessas opções não estão limitadas ao MySQL, o que significa que elas também serão aplicáveis em outros cenários! Vamos começar com as coisas gerais.
Segurança MySQL - Geral
Ao proteger o MySQL, lembre-se de que ele usa listas de controle de acesso (ACLs) baseadas em segurança para operações realizadas por usuários (listas de controle de acesso são uma lista de permissões associadas a um objeto). Veja como cuidar de alguns dos problemas de segurança mais básicos:
- Proteja a conta inicial do MySQL - isso é muito óbvio, mas você deve garantir que a conta root tenha uma senha. A conta root pode ou não ter uma senha quando o MySQL é instalado pela primeira vez - você pode descobrir qual é a senha verificando o log de erros e, em seguida, altere-a para uma mais forte, se desejar. Todas as outras contas também devem ter senhas.
- Nunca armazene senhas em qualquer banco de dados MySQL em texto simples - use uma função de hash unidirecional como BCrypt.
- Não conceda a nenhum usuário acesso à tabela de usuários no banco de dados mysql (o usuário root é uma exceção).
Além disso, familiarize-se com o controle de acesso e gerenciamento de contas no MySQL. Este assunto merece um livro inteiro por si só, mas as coisas básicas que você deve saber incluem:
- Controlando o acesso no MySQL;
- Criando, alterando e removendo usuários;
- Conceder e revogar privilégios para e de usuários;
- Saber como verificar quais privilégios são atribuídos;
- Quais são as categorias de conta;
- O que são contas reservadas;
- Quais são as funções;
- Como funciona o gerenciamento de senhas;
- Como funciona o bloqueio de conta;
- Dê uma olhada nos plugins de segurança oferecidos pelo MySQL;
- Saber como proteger backups do MySQL.
No que diz respeito à segurança do MySQL, os backups também devem ser cobertos.
Agora, examinaremos cada uma dessas opções mais detalhadamente.
Controlando o acesso no MySQL
- Como já mencionado acima, nunca dê a nenhuma conta, exceto a conta root, acesso à tabela de usuários no banco de dados mysql;
- Certifique-se de que todas as contas MySQL existentes usem apenas os privilégios de que absolutamente precisam para realizar suas ações.
Criando, alterando e removendo usuários no MySQL
No MySQL, os usuários podem ser criados executando a consulta CREATE USER:
CREATE USER ‘demouser’@’localhost’ IDENTIFIED BY ‘password’;
Os usuários podem ser alterados executando a consulta ALTER USER - a consulta permite que você faça muitas coisas diferentes, incluindo bloquear e desbloquear contas, exigir que a conta se conecte usando SSL, estabelecer a quantidade máxima de conexões por hora, descartar senhas antigas etc. Aqui está um exemplo de consulta que pode alterar sua própria senha:
ALTER USER USER() IDENTIFIED BY ‘password’;
Os usuários podem ser removidos executando a consulta DROP USER:
DROP USER ‘demouser’@’localhost’;
Conceder e revogar privilégios para e de usuários no MySQL
A instrução GRANT deve conceder privilégios ou funções. A instrução ON é capaz de informar se privilégios ou funções serão concedidos. A consulta a seguir concede privilégios:
GRANT ALL ON demo_db.* TO ‘demouser’@’localhost’;
A consulta a seguir concede papéis:
GRANT ‘demo_role’ TO ‘demouser’@’localhost’;
GRANT deve responder com Query OK, 0 linhas afetadas.
Para revogar certos privilégios dos usuários, use a instrução REVOKE (a parte do nome do host do nome da conta é “%”):
REVOKE SELECT ON *.* FROM ‘demouser’@’localhost’;
Para revogar todos os privilégios, REVOKE ALL pode ser usado:
REVOKE ALL PRIVILEGES ON *.* FROM ‘demouser’@’localhost’;
Você pode querer emitir um FLUSH PRIVILEGES; após executar as etapas acima.
Verificando quais privilégios são atribuídos no MySQL
- Para verificar quais privilégios são atribuídos, emita o SHOW GRANTS; declaração.
- Para cada solicitação emitida, o servidor determina a operação que você deseja executar e verifica se seus privilégios são suficientes para executar a operação em questão.
- O servidor usa as tabelas user e db no banco de dados mysql para garantir o controle de acesso.
- As tabelas user e global_grants concedem privilégios globais.
As demais opções serão abordadas nas próximas postagens.
Resumo
No que diz respeito à segurança do MySQL, você tem uma ampla gama de opções para escolher. As opções incluem medidas básicas de segurança que podem ser aplicáveis a praticamente todos os aplicativos, mas algumas das opções são bastante específicas para o MySQL. Tenha em mente que nem todas as opções disponíveis foram cobertas ainda - elas também serão discutidas nas próximas edições da série de segurança do MySQL.