Protegendo senhas de banco de dados

18

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?

Kaji
fonte
11
Para esclarecer - você está perguntando sobre o armazenamento das credenciais para efetuar login no banco de dados no site, e não sobre como armazenar corretamente senhas para os usuários do site no banco de dados, correto?
Joe
Corrigir; é para isso que estou chegando.
Kaji

Respostas:

10

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á.

Joe
fonte
11
Fazemos algo semelhante. No entanto, geralmente criamos uma nova conta para cada usuário / aplicativo do banco de dados, em vez de fazê-lo por funcionalidade. Isso resolve dois problemas para nós: 1) podemos diferenciar o uso do banco de dados em ferramentas como OEM (ou seja, podemos ver quem está martelando o banco de dados com granularidade) e 2) podemos personalizar individualmente o que cada usuário vê e tem acesso no base de dados.
ScottCher
7

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.

Yasir Arsanukaev
fonte
4

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.

Gaurav
fonte
3

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.

Jeremiah Peschka
fonte
3

Se suas senhas estiverem armazenadas em texto sem formatação, use os hashes (MD5, SHA), Luke!

Yasir Arsanukaev
fonte
O OP não está perguntando sobre o armazenamento de senhas de usuários. Mas sim, certamente hash suas senhas de usuário, mas nunca o usuário MD5 ou a família SHA para fazer isso! Use bcrypt ou PBKDF2. Caso contrário, em breve você se encontrará nas notícias como essas empresas que usavam MD5 e SHA1 e, assim, expôs seus usuários a ataques simples de força bruta.
Nick Chammas
Certamente, são necessárias técnicas de salga e outras, além do hash. E nunca se deve implementar primitivas de criptografia, ele próprio, mas sim usar algumas bibliotecas de criptografia amplamente testadas.
Yasir Arsanukaev
2

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.

Patrick
fonte
Se você criptografar as credenciais, precisará de algum outro segredo para descriptografá-las novamente. Ou, alternativamente, o formulário criptografado se torna o segredo, para que um invasor possa usá-lo. Faltam alguns detalhes.
Peter Eisentraut