Olhando para a estrutura da maioria dos sites baseados em PHP/MySQL que já vi, parece que não é muito difícil discernir a senha do banco de dados se você cavar um pouco, pois há invariavelmente uma configuração ou arquivo de configuração em algum lugar que armazena as informações para registro no banco de dados. Além da precaução básica de garantir que os privilégios do meu banco de dados sejam adequadamente restritos para solicitações remotas, quais opções estão disponíveis que eu poderia implementar em meus próprios projetos para proteger essas informações?
relate perguntas
-
Existem ferramentas de benchmarking do MySQL? [fechado]
-
Onde posso encontrar o log lento do mysql?
-
Como posso otimizar um mysqldump de um banco de dados grande?
-
Quando é o momento certo para usar o MariaDB em vez do MySQL e por quê?
-
Como um grupo pode rastrear alterações no esquema do banco de dados?
Não é uma resposta direta sobre o armazenamento das senhas, mas geralmente uso pelo menos duas conexões de banco de dados ao criar aplicativos da web - uma é usada 99% do tempo para atividades relacionadas ao usuário, com privilégios restritos, e a outra é usada para funcionalidade 'admin' (excluir usuários, etc.).
Em alguns casos, onde estou instalando o pacote de outra pessoa, instalarei duas instâncias... minha sub-rede local (possivelmente até em uma máquina diferente) que deve ser usada para qualquer atividade do tipo 'admin'. Nenhum dos dois tem acesso para modificar tabelas, etc, embora ... Prefiro entrar por meio das ferramentas de banco de dados nativas do que permitir que o aplicativo da web execute suas próprias tarefas de atualização que não foram verificadas.
Você pode ir ainda mais longe e adicionar mais conexões especificamente para determinadas tarefas ... para que as tarefas de criação de usuário e gerenciamento de senhas passem por um usuário que tenha privilégios extras nas tabelas de usuários, o login tenha privs de banco de dados para autenticar e não muito mais , etc
Dessa forma, se houver um ataque de injeção de SQL, na maioria das páginas da Web, ele não poderá fazer nada significativo - não poderá ver os hashes de senha, não poderá adicionar um novo usuário administrador (não que eles possam fazer qualquer coisa de qualquer maneira), etc. Ainda não ajudará se eles conseguirem colocar um shell em sua máquina, mas os deixará lentos.
Use senhas únicas , Kerberos , LDAP ou qualquer outra coisa para armazenar os dados da sua conta e autenticar/autorizar usuários. Os serviços de diretório são um bom meio para armazenar informações do usuário e usá-las como um back-end para os dados da conta.
Sou um grande fã de usar a autenticação 'Ident' do PostgreSQL em soquetes locais sempre que posso. Dessa forma, os usuários locais são mapeados diretamente para os usuários Unix/Windows do computador local e não preciso me preocupar em armazenar senhas. Eu não acho que isso seja uma opção no MySQL ainda, no entanto.
Onde o banco de dados e o servidor web estão em duas máquinas separadas, eu uso senhas MD5 sobre SSL: se um hostil tiver acesso ao meu servidor front-end, é apenas uma questão de tempo até que ele descubra como ele se comunica com o banco de dados.
Se suas senhas forem armazenadas em texto simples, use os hashes (MD5, SHA), Luke!
Se você estiver usando o .NET Framework, poderá usar strings de conexão criptografadas. Não sei se isso é possível em outras linguagens/frameworks, mas isso seria outra salvaguarda para garantir que suas conexões não sejam comprometidas.
Além de usar cadeias de conexão criptografadas, usar LDAP/Kerberos/Active Directory será sua opção mais segura.
Dependendo da sua linguagem de programação, você pode criptografar as credenciais de login, mas se estiver executando uma linguagem interpretada, não há como garantir que alguém não consiga descobrir as credenciais se obtiver acesso ao sistema.
Se você estiver executando C ++ ou algo semelhante, recomendo que crie/encontre uma função de criptografia/descriptografia salgada e execute as credenciais por meio dela e armazene o hash resultante como um arquivo no sistema.
Se você estiver executando PHP ou algo semelhante, recomendo que escreva um wrapper para o
mcrypt_encrypt()
sal e as credenciais e, em seguida, execute alguma ofuscação de código para desacelerar qualquer hacker se eles obtiverem acesso ao sistema.