Executando verificação de segurança...
1

Como você implementaria uma autenticação para um site com usuário + senha + computador?

Tenho uma tarefa onde, na autenticação de um site, além de validar se o usuário e senha estão corretos, também preciso verificar se o computador que está acessando tem permissão.
Algo parecido com o que fazem os módulos de segurança de alguns bancos, onde você adiciona computadores confiáveis e só se pode acessar através deles.

Alguns desafios e reflexões:

  • Sabemos que não é possível acessar dados da máquina (número de série de hardware, informações de sistema operacional, etc) diretamente pelo navegador somente usando Javascript.
  • Usar o IP não é muito legal, pois impede de limitar que uma máquina da rede não possa acessar e também o IP pode ser dinâmico, então necessitaríamos de alterar frequentemente a lista de IPs confiáveis.
  • Bem provável que seja necessário criar um plugin para ser instalado diretamente na máquina. Será que tem outra forma?
  • Porém como esse plugin mandaria informações para o site? Talvez um servidor no localhost como uma API?
  • Qual linguagem você usaria para escrever esse plugin? O ideal seria que o usuário tivesse que instalar o mínimo de coisas possíveis, então por exemplo, se ele tiver que instalar um .NET Framework, ou o Java, não necessáriamente seria um problema, mas se tivesse uma alternativa que não precisasse disso seria legal.

Enfim, essas são algumas coisas que venho pensando antes de colocar essa tarefa em prática. Se alguém teve experiência parecida e quiser comentar como fez ou dar sugestões, o intuido é esse.

Obrigado!

Carregando publicação patrocinada...
2

Minha experiência

Já trabalhei em uma grande empresa de telecomunicações brasileira, e os sistemas internos são protegidos por login + senha + acesso via VPN + senha OTP via aplicativo (em alguns casos mais críticos), além de a VPN só ser acessível por um computador homologado da empresa e ações críticas como emissão de senha para um usuário, ou até mesmo um acesso específico deve ser autorizado por duas ou mais pessoas (geralmente o gestor da pessoa aprova e depois alguém da equipe responsável pelo sistema ou da diretoria de segurança), então acho que isso é o suficiente. Bancos também adotam um sistema semelhante de segurança para seus sistemas internos.


Sobre VPNs

Como eu citei acima, empresas utilizam VPNs para acesso de coisas mais restritas, como políticas, sistemas internos, entre outros, e é o que aparenta ser seu caso de uso. Existem vários fornecedores, como a Checkpoint, F5, OpenVPN e Wireguard, sendo estes dois últimos open-source em sua essência, o que significa que você pode utilizar gratuitamente.

Na prática, o processo para uma conectividade via VPN seria:
1 - Criar um servidor de VPN, como o OpenVPN Server
2 - Emitir credenciais para acesso a esse servidor. Geralmente o servidor de VPN ele emite um certificado próprio para cada usuário;
3 - Instalar um cliente de VPN próprio, como o OpenVPN Client.
4 - Fazer com que, quando o usuário quiser acessar o sistema, ele tenha que se logar primeiro na VPN, na qual ele precisa, além do certificado gerado, colocar uma senha
5 - Com o usuário logado na VPN e acessando o serviço, geralmente ele vai acessar utilizando um endereço IP privado e, considerando que esse IP privado é alocado dinamicamente pelo servidor de VPN, você consegue consultar o servidor de VPN pra verificar quem é o usuário. E você pode controlar, via servidor de VPN, que apenas MACs específicos possam acessar, então se alguém hackear teu usuário e usar outro computador, não vai conseguir entrar via VPN.


Autenticação multi-fatorial

Mas acredito que o que você realmente queira fazer é uma Autenticação de Múltiplos Fatores. Verificar a VPN, usuário e senha do sistema seria isso, mas geralmente também existem outros fatores de segurança.

Você pode adicionar no sistema uma autenticação via OTP, que basicamente seria enviado um código para o celular do usuário, via SMS (não recomendável) ou via algum aplicativo (como Authy ou Google Authenticator), esse código seria uma senha, geralmente de 6 dígitos numéricos aleatórios, que são resetados em um intervalo de tempo frequente (geralmente a cada 30 segundos).

Se tiver um orçamento bom para segurança e for ainda mais paranóico com segurança, você também pode ter um token físico de segurança, como o Yubikey, na qual você precisa inserir esse token (geralmente é um pen drive USB mesmo, com um certificado digital e alguns modelos tem suporte a NFC para casos de celular) no dispositivo como uma outra camada. Cada cliente teria que ter seu token físico, o que aumentaria o custo consideravelmente.

Obviamente esses critérios mais fortes de segurança fora de login e senha vão exigir um servidor dedicado de autenticação, como o Keycloak (open source), Auth0, Cognito, entre outros.


Minha sugestão de implementação do caso de uso

Então o que eu faria nesse seu caso de uso seria: estudar OpenVPN e Keycloak, integrar o Keycloak na sua aplicação (é meio chatinho, vai precisar de uma semana pra entender ele), instalar e configurar o servidor OpenVPN (também é chatinho de mexer, mas tem interfaces de usuário que facilitariam o gerenciamento), além de também instalar os clients e certificados do OpenVPN nos computadores do usuário.

Por fim, adicionaria uma lógica no backend de aplicação, para verificar se usuário é o mesmo usuário conectado à OpenVPN por meio do IP privado coletado (já que o OpenVPN aloca IPs privados dinâmicos e atribui a um usuário), além de adicionar em um firewall ou proxy reverso uma regra para o sistema ser acessível somente pelos IPs privados relacionados à VPN.


Sobre autorização dupla e conclusão

Adicionar várias camadas de segurança não vai deixar seu sistema imune, mas vai deixar ele casca grossa (principalmente se utilizar tokens físicos, como aconteceu nesse caso da Cloudflare que eles atribuem a mitigação do ataque de phishing aos tokens físicos), porém pense comigo: e se o usuário fornecer o computador homologado com usuário e senha, e também dar nas mãos do invasor o token físico ou até mesmo o celular com o aplicativo de autenticação instalado? É difícil, mas pode acontecer.

Se o sistema for crítico, você pode adicionar autorização de uma ação por duas ou mais pessoas por exemplo, o que dificulta ainda mais a chance de uma ação nociva acontecer. Um exemplo disso são os approvals de Pull Requests do próprio TabNews, na qual o PR necessita de aprovação de várias pessoas (caso a pessoa não tenha acesso de escrita ao repositório), então isso reduz muito a chance de dar problema.

Bem, sem detalhes sobre o que é o sistema não dá pra estimar quais medidas de segurança são necessárias. Obviamente passei diversas alternativas, cabe a quem for implementar entender a realidade e estimar custos para cada camada de segurança, além de estabelecer processos de segurança. Espero que eu tenha dado um direcionamento sobre o que existe no mercado que pode ser implementado no seu caso, e estou a disposição para responder futuras perguntas, se houver.

1

Muito obrigado pela contribuição, no caso esse sistema que vou usar essa feature é bem simples e pequeno, sem apelo para tanta complexidade, mas suas resposta certamente vai ajudar pessoas no futuro, no mínimo pra adquirir conhecimento. Abraços.

1

Autenticação por usuário + senha + computador parece ser meio esotérica. O primeiro passo seria questionar se este é mesmo um requerimento válido. E se for mesmo desejado, recomendo uma auditoria de segurança depois que vocês escolherem o método, segurança é algo difícil de fazer bem feito por isso a preferência é utilizar um método já conhecido no mercado.

Uma ideia que me surgiu seria mudar o requerimento para ser usuário + senha + sistema operacional instalado. Deste jeito você poderia usar algum tipo de valt ou coisas tipo Windows Credential Manager.

Se tiver mesmo que ser autenticação por usuário + senha + computador meu pensamento inicial  seria desenvolver um aplicativo instalado na máquina onde verificaria vários atributos da máquina (número de série do CPU, memória, placa gráfica, etc) combinado com algum outro valor externo gerado previamente associado naquela máquina para gerar uma chave primária que seria então utilizada para gerar uma autenticacao por TOTP https://spfbl.net/totp/
Rapaz, vai ser uma trabalheira ehehehe, boa sorte.

1
1

Olá Rafael :)

Provavel que isso não resolva todo seu problema mas sugiro você dar uma olhada nas informações dispóniveis quando você acessa o navigator "window.navigator" no browser, você vai conseguir tirar bastante informações de lá e talvez suficiente para dizer que aquele computador é o computador do acesso ou anterior ou algo similar.

Boa sorte :)

1

Eu já cheguei a dar uma olhada nisso mas não encontrei nada que pudesse me ajudar, mas depois de estudar o assunto vou voltar pra essa ideia e ver se tem algo que acabou passando.
A propósito, estudando o assunto eu descobri uma biblioteca chamada printfinger.js que justamente consegue gerar uma impressão digital do browser, provavelmente usando algumas informações do window.navigator e mais algumas outras coisas.
Essa biblioteca não é muito utilizada pra segurança, é mais utilizada em ferramentas de marketing pra identificar usuários e principalmente pra sites que querem impedir que um mesmo usuário crie várias contas com e-mails diferentes.