Olhando para a estrutura da maioria dos sites baseados em PHP / MySQL que eu já vi, parece que não é muito difícil discernir a senha do banco de dados se você cavar um pouco, pois há sempre um arquivo de instalação ou 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, que opções estão disponíveis que eu poderia implementar em meus próprios projetos para proteger essas informações?
18
Respostas:
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 - um usado 99% do tempo para atividades relacionadas ao usuário, com privilégios restritos, e o outro usado para a funcionalidade 'admin' (excluir usuários etc.).
Em alguns casos, em que estou instalando o pacote de outra pessoa, instalarei duas instâncias ... uma instância voltada para o público que só tem acesso ao banco de dados para fazer as coisas gerais do tipo usuário, e uma segunda instância com restrição de IP para minha sub-rede local (possivelmente até em uma máquina diferente) que deve ser usada para qualquer atividade do tipo 'admin'. Porém, nenhum deles tem acesso para modificar tabelas, etc ... Prefiro acessar as ferramentas de banco de dados nativas do que permitir que o webapp execute suas próprias tarefas de atualização que não foram examinadas.
Você pode ir ainda mais longe e adicionar mais conexões especificamente para determinadas tarefas ... para que as tarefas de criação e gerenciamento de senhas do usuário passem por um usuário que tenha privilégios adicionais nas tabelas de usuários, o login tenha privilégios 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 de qualquer maneira), etc. Ainda não ajudará se eles conseguirem obter um shell em sua máquina, mas os atrasará.
fonte
Use senhas de uso único , 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 de armazenar informações do usuário e usá-las como back-end para os dados da conta.
fonte
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 ainda não acho que essa seja uma opção no MySQL.
Onde o banco de dados e o servidor da web estão em duas máquinas separadas, eu uso senhas MD5 sobre SSL: se um hostil tiver acesso ao meu servidor front-end, será apenas uma questão de tempo até que ele descubra como ele se comunica com o banco de dados.
fonte
Se você estiver usando o .NET Framework, poderá analisar o uso de cadeias de conexão criptografadas. Não sei se isso é possível em outras linguagens / estruturas, mas isso seria outra salvaguarda para garantir que suas conexões não sejam comprometidas.
Fora o uso de cadeias de conexão criptografadas, o uso do LDAP / Kerberos / Active Directory será sua opção mais segura.
fonte
Se suas senhas estiverem armazenadas em texto sem formatação, use os hashes (MD5, SHA), Luke!
fonte
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 tiver acesso ao sistema.
Se você estiver executando C ++ ou algo semelhante, recomendo que você crie / encontre uma função salgada de criptografia / descriptografia e execute as credenciais por meio dela e armazene o hash resultante como um arquivo no sistema.
Se você estiver executando o PHP ou algo semelhante, recomendo que você escreva um invólucro para as
mcrypt_encrypt()
credenciais e salte, em seguida, execute alguma ofuscação de código para diminuir a velocidade de qualquer hacker, caso ele tenha acesso ao sistema.fonte