Como o SSO com Active Directory funciona, pelo qual os usuários fazem logon transparente em um aplicativo Web da intranet?

40

Disseram-me que é possível criar um aplicativo Web que não exija login. O usuário efetua login no Windows, que é autenticado por meio de uma pesquisa do Active Directory (LDAP). Em seguida, eles devem poder acessar meu aplicativo da web e nunca ver um prompt de login. Esses clientes estão se referindo a isso como Logon único (talvez incorretamente e parte da minha confusão).

Mas, pelo que li o Logon único nos documentos do Tomcat, é:

A Válvula de Logon Único é utilizada quando você deseja oferecer aos usuários a capacidade de conectar-se a qualquer um dos aplicativos Web associados ao seu host virtual e, em seguida, ter sua identidade reconhecida por todos os outros aplicativos Web no mesmo host virtual.

Isso está perfeitamente claro para mim. O usuário precisa fazer login uma vez e pode acessar todos os aplicativos da web em uma instância do tomcat. Mas o que preciso fazer é, de alguma forma, permitir que eles entrem sem fornecer credenciais ao meu servidor tomcat.

Então, para que isso funcione, imagino:

  • Usuário faz solicitação para alguma página
  • O servidor não vê nenhum token de sessão e solicita ao cliente algumas credenciais.
  • O navegador do cliente sem nenhuma intervenção do usuário fornece algumas credenciais ao servidor.
  • Em seguida, usando essas credenciais fornecidas pelo navegador do cliente, ele faz uma pesquisa em um LDAP.

Eu já vi alguns exemplos que usam certificados do lado do cliente ... particularmente o sistema DoD PKI que faz algum sentido para mim, porque nesses casos você configura o Tomcat para solicitar certs do lado do cliente , mas apenas acessando janelas, não vejo como isso funcionaria e quais informações o navegador passaria para o servidor etc. É para isso que o NTLM é usado?

blak3r
fonte

Respostas:

40

Antes de tudo - e no caso de outros usuários visitarem esta página -, existem apenas alguns métodos de autenticação que permitem fazer o SSO imediato. Estes são NTLM e Kerberos . O LDAP - por outro lado - nunca fornecerá um SSO imediato.

NTLM é realmente NTLMv1 e NTLMv2. Eles são muito diferentes e o NTLMv1 foi preterido devido a sérios problemas de segurança. Você deve evitar as soluções de autenticação Java que não conseguem identificar corretamente se suportam NTLMv1 ou NTLMv2, porque elas usam apenas a palavra "NTLM" na documentação. Provavelmente, o desenvolvedor da referida solução de segurança não se conhece, o que é mais um motivo para procurar a saída de incêndio.

Ao contrário da crença tradicional, o NTLMv1 e o NTLMv2 são totalmente documentados pela Microsoft, mas você ainda encontrará soluções que alegam ter “engenharia reversa” do protocolo. É verdade que isso era necessário antes da Microsoft documentar os protocolos que acredito por volta de 2006 ou 2007. De qualquer forma, NTLMv1 é um não-não. Não há nada errado com o NTLMv2 em si, mas a Microsoft reduziu gradualmente o NTLM (de qualquer forma) em todos os seus produtos em favor da autenticação Kerberos. O NTLMv1 está morto há muito tempo e o NTLMv2 agora é usado apenas pela Microsoft nos casos em que nenhum Controlador de Domínio está disponível. Conclusão: NTLM (de qualquer forma) não é realmente o caminho a seguir. Na verdade, devemos saudar a Microsoft por adotar uma abordagem baseada em padrões aqui.

Isso deixa você com o Kerberos. A Microsoft criou um protocolo para negociar e transportar informações de autenticação por HTTP. Isso é conhecido nos produtos da Microsoft como " Autenticação Integrada do Windows ", mas foi definido como um padrão oficial sob o nome de SPNEGO . É isso que você deve procurar. O SPNEGO suporta NTLMv2 e Kerberos como o mecanismo de autenticação subjacente, mas pelos motivos acima, você deve direcionar o Kerberos ao invés de NTLMv2.

Integrei com sucesso vários aplicativos Tomcat (em execução no Linux / Solaris) com o Active Directory usando o Projeto SPNEGO no SourceForge . Eu descobri que essa é a abordagem mais simples. Isso fornece um SSO imediato, semelhante ao que, por exemplo, um servidor Sharepoint. É mais provável que seus usuários esperem ao falar sobre 'SSO'. Acertar a configuração do Kerberos, gerar chaves e configurar contas 'fictícias' no Active Directory pode ser um aborrecimento, mas uma vez que você acertar, funciona como um encanto.

A única coisa de que não gosto no projeto SPNEGO no SourceForge é que não entendo com que frequência ele realiza a autenticação. Minha desconfiança é que ele faz isso para todas as visualizações de página em vez de uma vez para cada sessão. Talvez eu esteja errado nisso. De qualquer forma: isso destaca outra coisa a considerar nas soluções de SSO: você não deseja implementar uma solução que 'spams' seu provedor de identidade (por exemplo, Active Directory) com solicitações desnecessárias.

unixhacker2010
fonte
2
Obrigado, fez desta a resposta aceita. Uma coisa a acrescentar à sua lista de logins sem prompt é o logon de certificado x509 ... Como os cartões CAC do governo.
blak3r
Esta é uma resposta fantástica, mesmo com 6 anos! Eu recomendaria x10 se pudesse!
Tim S.
2

Em um ambiente Windows Active Directory, o Logon único é usado para significar que visitar uma página da Web interna carrega suas permissões de login do Windows e o servidor da Web pode agir sobre elas. É para isso que o NTLM é usado, mas implementações mais recentes usam o Kerberos.

Se você abrir um site do Sharepoint Server, ele sabe quem você é sem precisar de um nome de usuário e senha de login, mas isso funciona apenas para sites internos na mesma rede, não acho que faça muito sentido trabalhar em um site público. (Não sei dizer se você quer dizer "host virtual" como em um vhost Apache ou em um servidor hospedado terceirizado).

Aqui está um documento da Microsoft que descreve como a autenticação Kerberos funciona em um servidor Web executando o IIS / ASP.Net: http://msdn.microsoft.com/en-us/library/ff647076.aspx

Parece possível fazer com Apache / Tomcat / Java. Aqui está um PDF descrevendo uma implementação da Universidade do Reino Unido disso: http://gfivo.ncl.ac.uk/documents/UsingKerberosticketsfortrueSingleSignOn.pdf e um projeto Codeplex para isso: http://tomcatspnego.codeplex.com/ e Openfire têm alguns documentação relacionada ao trabalho geral com Java / Kerberos aqui ( http://community.igniterealtime.org/docs/DOC-1060 ).

TessellatingHeckler
fonte
0

Parece que você está descrevendo o que a Microsoft chama de Autenticação Integrada do Windows.

Parece que o Tomcat suporta autenticação do Windows, com base neste artigo .

Artomegus
fonte
-1

Para iniciantes, você não pode evitar o login. Se você deseja identificar usuários, é necessário que eles façam login. Esqueça o NTLM, o Kerberos vem em socorro - ele pode fazer tudo de uma maneira completamente transparente.

O SingleSignOnValve não é o que você está procurando. Se você usa o Tomcat 7, pode usar o SpnegoAuthenticator imediatamente, mas no 6 é necessário usá- lo .

Michael-O
fonte
Pouco confuso ... primeira e segunda frases parecem contradizer. Com o Kerberos, o usuário não é solicitado a fazer login?
blak3r
11
Não, eles não. Veja o quadro geral: graças ao Kerberos, o usuário insere suas credenciais uma vez manualmente e depois disso todo login ocorre automaticamente em seu nome. Isso não significa que nenhum login aconteça. Isto é o que você escreveu.