Como implementar com segurança o login automático


15

Eu li muitos, muitos, muitos posts sobre como "você provavelmente está armazenando senhas erradas". Eles estão sempre se referindo ao armazenamento de senhas em um servidor no qual um usuário está efetuando login; eles basicamente reformulam conselhos onipresentes como trocadilhos, etc. etc. No entanto, nunca vi um artigo sobre práticas recomendadas para armazenar senhas em um cliente, para que ele não precise fazer login manualmente toda vez que quiserem fazer login; o recurso "lembre-se de mim".

Muitos softwares possuem esse recurso, de navegadores a programas como o Dropbox.

Li recentemente um artigo antigo sobre como o Dropbox estava armazenando um ID no seu computador, que você poderia simplesmente copiar / colar em outro computador, iniciar o Dropbox e fazer login como o dispositivo do qual o ID foi obtido; sem login, sem nada e acesso total à conta do Dropbox. Parece um design realmente estúpido, mas não consigo pensar em nenhuma maneira melhor de fazê-lo.

Não tenho certeza de como evitar o armazenamento de algo como um cookie em texto sem formatação. Se você criptografá-lo, onde você armazena a chave para descriptografá-lo?

A única maneira que vejo para não introduzir vulnerabilidades de segurança é remover o recurso de login automático e fazer com que o usuário digite sua senha toda vez que quiser usar um serviço, mas isso é um esforço de usabilidade e os usuários ficam estragados ao esperar que não precisem fazer isso.

O que posso ler sobre o armazenamento local de credenciais com segurança para implementar o recurso de login automático? Se os princípios são simples demais para um artigo inteiro, quais são eles? O software em questão não deve depender de recursos não presentes em todas as plataformas (como o "chaveiro" que algumas distribuições Linux têm).


2
É sobre o que você confia. Se você não confia na máquina, armazene o ID, esse é o seu problema. Se você confiar no chaveiro, essa é a segurança máxima que você obterá. É claro que você pode adicionar alguma segurança personalizada, como detectar o hardware do dispositivo ou algo assim, mas é tudo falso, para que você não saiba no final. Está fora de seu controle. É claro que coisas estúpidas, como salvar senhas de texto não criptografado, são excluídas.
precisa

@ LucFranken, como você pode confiar na máquina? Alguém pode explorá-lo como eles fizeram no dropbox. Também confiaria no chaveiro, mas nem todos os computadores têm um, e o Windows nunca (AFAIK). E se você estiver armazenando senhas, como evitá-las em texto não criptografado? Se você os criptografar, onde você armazena a chave para descriptografá-la?
Jay Simon

Essa é exatamente a questão, você não pode confiar nela. O usuário pode definir apenas para confiar nele. Isso leva em consideração que o usuário entende o quão segura é sua máquina. Escrever um vírus obtendo dados do Dropboxes é apenas possível. Mesmo com chaves armazenadas localmente e outros dados locais. Você pode ajudar a torná-lo mais seguro (pense em aplicativos que exigem um código de 5 números), mas no final é local e fora de seu controle.
Luc Franken

@ LucFranken sou eu ou o autologin parece um recurso onipresente? Se for, por que as pessoas não escreveram sobre como fazê-lo corretamente?
Jay Simon

É um requisito tão comum, embora um pouco mais de software corporativo não permita. Por exemplo, o SalesForce permite salvar apenas o nome de usuário, não a senha. Vamos colocar claro. que você não precisa armazenar a senha no cliente para fazer login. Você pode armazenar um hash aleatório que corresponda a um hash no servidor.
precisa

Respostas:


12

Uma maneira é:

  • Quando o usuário efetuar login, armazene um ID da sessão em um cookie no computador do cliente (não o nome de usuário ou a senha).
  • Amarre a sessão ao endereço IP, para que um ID de sessão individual funcione apenas com o computador em que foi iniciado.

Dependendo da estrutura que você está usando para desenvolver seu site, esse comportamento pode estar disponível como um recurso interno.

Observe que, como o protocolo HTTP não tem estado, de fato, não há diferença funcional entre manter alguém conectado durante uma única sessão de uso do site e o "login automático" na próxima vez em que usarem o site; é apenas uma questão de quanto tempo você concede antes que a sessão expire.

Atualização: Além disso, use HTTPS para aumentar a segurança, obviamente.

Atualização 2: observe que essa abordagem tem limitações, pois não funciona bem para usuários que alteram muito seu endereço IP. No entanto, ele fornece um nível aumentado de segurança e pode ser útil em algumas situações.


1
Vinculá-lo a um endereço IP não ajuda muito, porque alguém pode ter um computador atrás do mesmo firewall que você.
Jay Simon

2
@ JaySimon, eu não diria "não ajuda muito". O número de computadores atrás do mesmo firewall que você é muito menor que o número de computadores no mundo. Trata-se de limitar sua exposição potencial ao ataque, e isso a limita bastante. Essa é uma abordagem padrão, e eu realmente não acho que haja muito que você possa fazer além dela. Se alguém tiver o mesmo endereço IP do usuário e conseguir obter um ID de sessão, essa pessoa será indistinguível do usuário na perspectiva do servidor. Se você tiver algum tipo de login no site, estará exposto a esse ataque.

3
Você acha que essa abordagem será irritante para os usuários de telefones celulares cujo endereço IP pode mudar com frequência?
Jay Simon

@ JaySimon, se isso acontecesse em uma sessão, o usuário experimentaria um logout repentino, o que certamente seria irritante. Porém, não sei quantas vezes eles realmente mudam (uma pesquisa rápida no Google não revela uma resposta definitiva). Eu não ficaria muito preocupado com isso, a menos que o IP provavelmente mudasse enquanto eles realmente o estivessem usando.

Restringir a sessão ao IP não é realmente realista, como foi dito. Os usuários mudam de local com frequência. Com telefones celulares, mas também com laptops; por exemplo, trabalho flexível. O melhor que você pode fazer é verificar cheques GeoIP com o tempo para percorrer essa distância; como o Gmail.
Lode

5

A Amazon (e muitas outras) usam uma abordagem híbrida. Eles fornecem logon automático para navegar, adicionar itens ao carrinho e fazer pedidos usando as combinações de endereço de entrega / cartão de crédito que você usou anteriormente. No entanto, eles exigem que você digite sua senha para várias ações, como adicionar cartões de crédito, adicionar / alterar endereços de entrega, atualizar senhas, visualizar pedidos passados ​​(opcionalmente para o usuário) e muitas outras configurações de conta.

Então, sim, as pessoas que obtêm acesso ao seu computador podem invadir sua sessão, mas você ainda recebe o que elas pedem! (Mais importante, o incentivo para seqüestrar uma sessão é praticamente negado.) Mas se alguém tiver acesso ao meu computador, eu tenho problemas maiores do que as pessoas que roubam as sessões médias do site.

Se você possui partes de seu aplicativo que não precisam de alta segurança, pode escolher um modelo híbrido no qual armazena um ID de sessão (com hash ou o que desejar) para fazer login automático de usuários em partes de baixa segurança do site , mas exija que eles insiram a senha quando entrar nas áreas de segurança mais alta e exclua o token de alta segurança quando a sessão terminar.

Obviamente, se este é um site no nível bancário, o login automático não é uma opção. Novamente, os sites que usam esses tipos de segurança assumem o valor dos dados que estão protegendo e a conveniência adicional para o usuário pesa o risco potencial de uma sessão seqüestrada. Se você acha que esse não é o caso do seu aplicativo, não implemente logins automáticos. Você precisa acessar qual nível de compensação de segurança / usabilidade é apropriado para o seu caso de uso.


2

Na verdade, não é tão difícil. Primeiro armazene um cookie com este formato:

userID.token

Você pode usar um hash sha1 para o token. Em sua tabela de banco de dados remember_me_tokens, armazene o ID do usuário, um hash bcrypt do token e a hora em que o token foi gerado.

Então, quando alguém visitar seu site, verifique se o cookie está definido. Se o cookie estiver definido, verifique se há uma linha válida no banco de dados nos últimos 7 dias, digamos. Se houver uma linha válida no banco de dados para o cookie, defina a sessão para indicar que o usuário está conectado e também exclua a linha correspondente de cookie / banco de dados e gere uma nova linha de cookie / token / banco de dados.

Se eles saírem, exclua o cookie.

Execute um trabalho cron para remover remember_me_tokens com mais de 7 dias.


O que impede alguém de copiar essa chave e colar em sua máquina e obter acesso à conta sem o nome de usuário ou a senha?
Jay Simon

como você vai conseguir a chave? é armazenado localmente no computador de alguém.
Ryan

você caminha até o computador e abre o arquivo em que está armazenado :) #
Jay Simon Jay

2
@JaySimon Esse mesmo argumento pode ser usado para alguém que se conecta e se afasta por 5 minutos sem bloquear o computador ou clica em Lembrar de mim e alguém pula a senha da conta. Se você pode aceitar essa possível situação de segurança, a conveniência é boa, mas é por isso que você não vê um recurso Lembrar-me na lista CIA NOC :) O servidor deve fornecer algum tipo de token que o cliente deve armazenar no sistema de arquivos. Não está mais em suas mãos da perspectiva do servidor.
Maple_shaft

@maple_shaft Por que alguém ficou surpreso que você pudesse fazer isso no dropbox? (I ligou-o na minha pergunta.)
Jay Simon

0

Você pode apenas se confiar no dispositivo em que o armazena. Depende do usuário (se você não pode influenciar o dispositivo) o quão seguro ele é. Está simplesmente fora de suas mãos.

Como indicado nos comentários:

É sobre o que você confia. Se você não confia na máquina, armazene o ID, esse é o seu problema. Se você confia no chaveiro, essa é a segurança máxima que você terá. É claro que você pode adicionar alguma segurança personalizada, como detectar o hardware do dispositivo ou algo assim, mas é tudo falso, para que você não saiba no final. Está fora de seu controle.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.