Por: @jonasc
Publicado em: 2021-03-26
Suporte a autenticação de domínio windows AD (NTLM) para o SSO
Quando um máquina já está logada no domínio Windows, é possível autenticar o usuário sem pedir login e senha. O objetivo deste laboratório é estudar a melhor tecnologia para implementar a autenticação. Para isso, algumas ferramentas foram estudadas:
- Apache:
- mod_auth_ntlm / SSPI NTLM
- mod_auth_ntlm_winbind
- mod_auth_ntlm_kerb
- mod_auth_gssapi
- Nginx
- Módulo NTLM
- Squid
- Como é feito no firewall v2
- Via aplicação Web
- Avaliar se existe alguma LIB que fala NTLM com navegador
Topologia
Topologia de rede padrão com FWFLEX. Requisitos mínimos: 1x LAN e 1x WAN. 1x Windows server AD na LAN e 1x cliente Windows na LAN integrado com AD.
Instalação
mod_auth_ntlm / SSPI NTLM
Instalado direto de um projeto não oficial do GitHub: https://github.com/TQsoft-GmbH/mod_authn_ntlm
Foi simplesmente copiado o binário.
mod_auth_ntlm_winbind
Não possui pacote para CentOS 8. Foi compilado a partir do repo oficial do samba.org.
Dependências:
yum install httpd php httpd-devel "@Development Tools" krb5-workstation samba-common authconfig samba-winbind samba-winbind-clients
Clonar os arquivos de https://www.samba.org/ftp/unpacked/lorikeet/mod_auth_ntlm_winbind/ e rodar os comandos abaixo.
autoconf
./configure
apxs -DAPACHE2 -c -i mod_auth_ntlm_winbind.c
mod_auth_ntlm_kerb
Não possui pacote para CentOS 8. Está sendo descontinuado e substituído pelo mod_auth_gssapi.
Seria possível compilar manualmente, mas não seguimos com esta ferramenta, por estar depreciada.
mod_auth_gssapi
O mais recente para Kerberos, isntalado via Yum:
yum install mod_auth_gssapi
Nginx
Disponível só na versão premium. Inviável.
Squid
Necessário instalar squid e samba/winbind igual é feito no v2.
Configuração
Devido a dificuldade para instalação dos módulos, seguimos a configuração apenas do mod_auth_ntlm_winbind e mod_auth_gssapi.
mod_auth_ntlm_winbind
Necessário ativar KeepAlive no Apache httpd.conf
KeepAlive On
MaxKeepAliveRequests 1000
KeepAliveTimeout 600
Dentro do vHost, configurar autenticação NTLM com helper ntlmssp:
#Require all granted
NTLMAuth on
AuthType NTLM
AuthName "NTLM Authentication"
NTLMAuthHelper "/usr/bin/ntlm_auth --helper-protocol=squid-2.5-ntlmssp"
#NTLMAuthHelper "/usr/bin/ntlm_auth --helper-protocol=squid-2.5-basic"
#NegotiateAuthHelper "/usr/bin/ntlm_auth --helper-protocol=gss-spnego"
#NTLMBasicAuthoritative on
Require valid-user
#AuthType Negotitate
#NegotiateAuth on
OBS: Os helpers basic e spnego foram testados, mas não funcionaram.
mod_auth_gssapi
Na teoria a configuração é relativamemte simples:
AuthType GSSAPI
AuthName "GSSAPI Single Sign On Login"
GssapiBasicAuth On
GssapiCredStore keytab:/etc/httpd/apache.keytab
GssapiBasicAuthMech ntlmssp
#GssapiBasicAuthMech krb5
require valid-user
#GssapiNegotiateOnce On
#GssapiSSLonly Off
#GssapiLocalName On
#GssapiUseSessions On
#GssapiDelegCcacheDir /run/httpd/clientcaches
#GssapiPublishErrors On
#GssapiAcceptorName HTTP@{HOSTNAME}
#GssapiUseSessions On
#Session On
#SessionCookieName gssapi_session path=/private;httponly;secure;
A diferença é que o GSSAPI se autentica através de uma chave gerada para o usuário no Windows server, em vez de login e senha.
O GSSAPI é um recurso que negocia com o cliente o mecanismos de autenticação suportado (pode ser NTLM, krb5, iakerb). O GssapiBasicAuthMech pode ser usado para forçar um mecanismo específico.
As demais opções de sessão comentadas acima foram testadas, mas não surtiram efeito.
Para gerar a chave, executar o Powershell como Administrador no Windows Server:
ktpass -princ HTTP/jonasc-fwflex.itflex-eng.local@ITFLEX-ENG.LOCAL -mapuser admin@ITFLEX-ENG.LOCAL -crypto ALL -ptype KRB5_NT_PRINCIPAL -pass semprelinux -out c:\kerberos.keytab
O usuário admin precisa suportar Kerberos. Active Directory Users and Computers > Users > admin > properties > Account > This account supports AES 128 / 256 bit encryption.
O usuário admin precisa estar habilitado para delegação Active Directory Users and Computers > Users > admin > properties > Delegation > Trust this user for delegation to any service.
Caso for implementar o mecanismo do Kerberos, também é necessário configurar trusted URI no navegador do cliente. No Internet Explorer, Edge e Chrome, é definido no Local Intranet Sites, nas Opções da Internet do Windows. No firefox, é necessário configurar em about:config:
network.negotiate-auth.delegation-uris
network.negotiate-auth.trusted-uris
Resultados
O mod_auth_ntlm_winbind funcionou autenticação, porém pede login e senha para o usuário (não resolveu o problema).
O mod_auth_gssapi não funcionou. Os logs em modo debug não trazem muita informação. Por ser um recurso novo, tem pouca documentação. Foi encontrado apenas um artigo na Red Hat (acesso restrito).
Mesmo que um dos recursos acima funcionasse, ainda teria o trabalho do motor do SSO guardar a informação de qual usuário autenticou. Também não foi encontrado nenhuma biblioteca que fizesse o intermédio NTLM entre navegador e AD.
Nesse sentido, nenhuma ferramenta foi considerada viável. Optamos pela estratégia de prolongar o tempo de sessão do usuário que autenticou no SSO e manter a sessão com base nos cookies do navegador.
Links relacionados
- https://hemakhema.blogspot.com/2017/07/enable-sso-login-in-linux.html
- https://docs.moodle.org/310/en/NTLM_authentication
- https://www.geeklab.info/2011/08/install-mod_auth_ntlm_winbind-on-centos-6-0/
- https://www.crowdstrike.com/cybersecurity-101/ntlm-windows-new-technology-lan-manager/#:~:text=Like%20NTLM%2C%20Kerberos%20is%20an,Windows%202000%20and%20later%20releases
- http://help.sonicwall.com/help/sw/eng/6730/25/9/0/content/Ch110_Users_Management.127.16.html
- https://plugins.miniorange.com/guide-to-setup-kerberos-single-sign-sso
- https://help.liferay.com/hc/en-us/articles/360026505211-Authenticating-with-Kerberos
- https://active-directory-wp.com/docs/Networking/Single_Sign_On/NTLM_SSO_with_Apache_on_Windows.html
- https://hc.apache.org/httpcomponents-client-4.5.x/ntlm.html
- https://access.redhat.com/articles/3161491