Temos um aplicativo da web (Apache / PHP) que atualmente usa autenticação de nome de usuário / senha e pode ser acessado de qualquer lugar. Possui SSL do lado do servidor habilitado.

Nosso programa cliente é uma versão do FireFox que modificamos e renomeamos. Este cliente firefox modificado serve apenas para se conectar ao nosso servidor de aplicativos da web. Os usuários devem usar este programa cliente para se conectar ao serviço da web.

Além da autenticação do usuário, gostaríamos de bloquear o acesso no nível do servidor para qualquer pessoa que não esteja usando nosso programa cliente *. Portanto, se um usuário digitar um URI usando um navegador normal, ele será negado imediatamente.

Para fazer isso, o programa cliente precisa se identificar para o servidor para que o servidor saiba que nosso programa cliente está sendo usado e não um navegador da web ou bot.

* O verdadeiro objetivo é ter certeza de que eles são funcionários autorizados de nossa empresa antes de tentar um login, incorporar este "comprovante de emprego" no programa do cliente parece ser a maneira mais fácil de fazer isso, já que o aplicativo é fornecido apenas para pessoas que precisam usá-lo.

Até agora, tive algumas idéias sobre como fazer isso.

1.) Incorpore um tolken ao aplicativo cliente que é enviado quando o cliente faz um login (o login é tratado por uma interface chrome / XUL). Isso não bloquearia no nível do servidor, apenas no nível do aplicativo. A chave pode ser roubada tão facilmente quanto uma senha, mas não adivinhada pela força bruta tão facilmente, pois pode ter qualquer comprimento ou complexidade.

1a.) Adicione um parâmetro tolken especial ao cabeçalho do navegador do cliente em todas as solicitações. Isso é mais parecido com segurança através da obscuridade, mas certamente pode desacelerar um invasor tentando usar senhas de força bruta se o login sempre falhar (mesmo com a senha correta) quando a string mágica está faltando na solicitação.

2.) Incorpore um certificado SSL do cliente ao programa do cliente. Parece que pode ser uma boa solução, mas a boa documentação sobre SSL do lado cleint é quase inexistente. NÃO queremos assinar um certificado para cada usuário, nem queremos que o usuário tenha que criar um certificado ou ser incomodado com diálogos de segurança. A chave privada teria que ser incorporada ao navegador e seria uma chave compartilhada entre todos os programas clientes e distribuída por instalação em nosso navegador personalizado.

3.) Verifique a string do agente do usuário. Acho que o Apache pode restringir com base nisso. Mas parece uma medida fraca, na melhor das hipóteses. Eu provavelmente faria isso além de outras medidas.

Estou esperando uma ideia melhor de como fazer isso?

answer

Incluir um certificado SSL de cliente com o navegador modificado seria mais fácil e provavelmente mais seguro.

Se você estiver usando a mesma chave para todos, você perderá muitas das vantagens dos certificados de cliente, mas é melhor do que verificar o useragent. E presumo que você ainda precisará de um nome de usuário e senha para fazer o login.

Você já pensou em VPN? Isso soa exatamente o que você realmente deseja.