Esse artigo mostrará a configuração do Squid3 utilizando autenticação Kerberos. Ambiente utilizado: Squid3, Ubuntu 10.04, squid_kerb_auth e Windows 2003 AD.
Pessoal, depois de 2 anos utilizando Squid + NTLM na empresa ele começou a dar problemas, eu realizei uma pesquisa sobre as diversas maneiras de autenticação, vou resumir para quem quer aprender um pouco sobre como autenticar o Squid.
Para realizar a autenticação o Squid utiliza os chamados helpers, que nada mais são que interfaces que realizam a autenticação e retorna um OK ou um ERR para o proxy. A forma como essa autenticação vai ser negociada é o que define sua segurança, eficiência e compatibilidade. Cabe ao responsável decidir a melhor forma a ser utilizada.
Existem basicamente 4 formas de autenticação:
Basic (passando a senha em texto puro)
A Autenticação Basic é a mais comum, compatível e fácil de ser configurada, porém a mais insegura, qualquer interceptação de pacote é possível capturar a senha do usuário que está navegando. Ela pode ser implementada com diversos helpers, por exemplo pam, httpd, ldap, nsca etc. Há diversos tutoriais sobre esse tipo de autenticação.
Digest (passando o hash da senha)
Esse tipo de autenticação invés de passar a senha em texto puro passa o hash em MD5 ou SHA-1, isso dificulta um pouco a captura de senhas, porém senhas inferiores a 15 caracteres são facilmente quebradas com ataque de rainbowtables ou de dicionário. Há tutoriais explicando como implementar esse tipo de autenticação com LDAP, porém não achei para o Active Directory, somente para Open LDAP.
ntlm (utilizando challenge response)
Na autenticação NTLM é realizado um challenge response, ao autenticar o usuário se identifica e recebe um desafio do servidor, o que trafega pela rede é o hash da senha com a resposta do desafio, caso o pacote seja capturado o atacante não terá a senha e sim a senha + alguma coisa, isso dificulta a quebra da senha e aumenta um pouco a segurança.
Esse método porém possui 2 defeitos, devido ao desafio, para cada requisição http no proxy ele gera 3 registro no proxy 2 HTTP_DENIED 407 e um HTTP_MISS ou HIT no momento que a autenticação dá certo, para cada requisição é necessário essa autenticação, o que perde um pouco de performance.
Outro problema é a incompatibilidade. Esse tipo de autenticação também já não é tão segura, tanto que vem desabilitado por padrão o suporte a NTLM no Windows7, para quem quiser testar mesmo assim pode seguir o tutorial do próprio site do Squid:
Esse é o tipo de autenticação que abordaremos no artigo, baseia-se na emissão de tickets. Para configuração é necessário gerar um keymap no AD para o srvsquid funcionando da seguinte forma, o srvsquid (nome do servidor Squid) confia no srvdc1 (nome do servidor do AD), o usuário paulo se autentica no servidor srvdc1 e ganha um ticket, uma espécie de "crachá", onde ele autentica seus acessos ao servidor de arquivos, impressão etc. Ao tentar acessar a internet é solicitada autenticação e ele mostra esse "crachá" para o srvsquid, o srvsquid então verifica a validade do crachá com o srvdc1 e se estiver ok ele dá o acesso, tudo isso é feito de forma segura.
Os tickets duram em média 5 minutos, o que torna improvável a quebra de uma senha com esse nível de criptografia em tão pouco tempo, após 5 minutos o usuário solicita um novo ticket. O processo de autenticação é mais leve em termo de performance.
O porém dessa autenticação é a incompatibilidade, só funciona com Internet Explorer 7 pra cima e com o Firefox 3 ou superior (não foram testados Chrome, Opera, Safari etc).
Para questão de compatibilidade é possível configurar uma autenticação do tipo Basic como alternativa, será descrito no artigo.
[1] Comentário enviado por leandromoreirati em 24/05/2010 - 17:28h
Prezado troppy,
Muito interessante seu artigo, na pratica tenho q colocar senha no browser ou o processo de autenticação é automatico, o usuário logou no dominio ta logado?
[3] Comentário enviado por jucaetico em 25/05/2010 - 11:39h
troppy ,
Parabéns pelo artigo. Você chegou a fazer autenticando atráves de um domínio configurado no Windows 2008?
Pelo que pesquisei na internet o windows 2008 mudou a maneira de autenticar está diferente do windows 2003. Não consegui fazer funcionar. Se tiver alguma coisa poste aqui mesmo.
[4] Comentário enviado por troppy em 25/05/2010 - 15:58h
Muito interessante seu artigo, na pratica tenho q colocar senha no browser ou o processo de autenticação é automatico, o usuário logou no dominio ta logado?
R= Para o internet explorer 7 ou superior e firefox3 ou superior a autenticação é automática não aparece a caixinha com usuário e senha, o modo LDAP Basic que tem no artigo faz isso caso falhe a autenticação é bom quando for implantar comentar o modo LDAP e testar somente o kerberos. Essa autenticação direta eu consegui no windows XP, Vista e windows 7. No linux eu consegui utilizando um pacote chamado likewise open que coloca a máquina no domínio do AD.
Uma pequena duvida, com essa configuração, um relatório feito com o sarg viria especificados os usuários do AD?
R=Sim os relatórios vem descriminados por cada usuário.
Parabéns pelo artigo. Você chegou a fazer autenticando atráves de um domínio configurado no Windows 2008?
R= Infelizmente não tenho ambiente com o 2008 pra teste, mas creio que a alteração seja na hora de gerar o keymap, há outras maneiras de gerar o keymap, via samba mais creio que para tentar no 2008 eu verificava o modo de gerar o key map. "ktpass -princ HTTP/srvsquid.meudominio.com.br@MEUDOMINIO.COM.BR -mapuser srvsquid -crypto rc4-hmac-nt -pass SENHA_DO_USR_SRVSQUID -ptype KRB5_NT_PRINCIPAL -out c:\srvsquid.keytab" tentaria substituir a tag -crypto rc4-hmac-nt por outro método de criptografia.
[8] Comentário enviado por HC em 27/05/2010 - 15:33h
Muito bom o seu artigo Troppy, deixa eu postar um problema que ocorre aqui na empresa, aqui sempre usamos o squid com o método de autenticação NTLM, recentemente migramos todos os nossos Domain Controllers para Windows Server 2008 R2, e começaram a surgir problemas.
Depois de muita pesquisa e testes, constatamos que após a migração, só as estações com o Windows XP não autenticavam, o problema ainda persiste, só tirei essas estações da regra para passarem pelo proxy.
Caso alguem já passou por esse problema e quiser dar uma força é só postar.
[9] Comentário enviado por leandromoreirati em 31/05/2010 - 14:19h
Troppy,
Segui o seu artigo na integra, quando vou acessar a internet, ele fica com a popup pedindo senha e ao entrar com login/senha além de nao logar ele retorna a seguinte mensagem no log do squid:
2010/05/31 14:17:01| squid_kerb_auth: Got 'YR TlRMTVNTUAABAAAAl4II4gAAAAAAAAAAAAAAAAAAAAAGAHEXAAAADw==' from squid (length: 59).
2010/05/31 14:17:01| squid_kerb_auth: Decode 'TlRMTVNTUAABAAAAl4II4gAAAAAAAAAAAAAAAAAAAAAGAHEXAAAADw==' (decoded length: 40).
2010/05/31 14:17:01| squid_kerb_auth: received type 1 NTLM token
2010/05/31 14:17:01| authenticateNegotiateHandleReply: Error validating user via Negotiate. Error returned 'BH received type 1 NTLM token'
[10] Comentário enviado por troppy em 01/06/2010 - 11:17h
Olá Leo,
qual o browser que você está usando?
aqui homologamos o IE7 e o firefox 3.0 ou superior, tivemos um problema com alguns IE 8 no windows XP e estamos tentando resolver.
lembrando que deve setar o proxy SRVSQUID.DOMINIO.COM.BR e estar com o dns reverso direitinho pra funcionar o kerberos.
O ambiente de teste é o mesmo ubuntu 10.04 squid3 e windows 2003?
tu ainda tem máquina 98 na rede? Recebi uns reports de quem tem máquina windows 98 o Domain Controler tem que habilitar umas autenticações mais fracas para compatibilidade e não funcionou também.
[11] Comentário enviado por leandromoreirati em 01/06/2010 - 14:42h
Troppy,
Estou testando de um IE 8 e no SO e windows 2008, setei na configuração do proxy o ip do servidor proxy, vou testar agora com o nome ja que esta td criado, inclusive o reverso no DNS.
[13] Comentário enviado por brunofreitas em 16/06/2010 - 11:34h
Fala ae cara,
primeiramente parabens pelo seu artigo.
porem estou com alguns problemas e pelo que percebi semelhantes aos do Leandro Moreira, o navegador fica pedindo usuario e senha e não aceita nenhum usuario do ad, o ambiente é exatamente o mesmo porem o navegador é o IE8, ja inclusive abilitei a autenticação LDAP e mesmo assim nada, poderia dar uma ajuda?
[14] Comentário enviado por troppy em 16/06/2010 - 15:12h
Voce ja tentou utilizando o domian controller com ms w2k8 ?
R: Não, infelizmente não possuo esse ambiente e nem muito tempo pra montar um em VM pra teste.
Bruno,
muito obrigado, quanto aos erros da um tail -f no /var/log/squid3/access.log e no cache.log e tenta realizar o acesso.
eu tive problemas com o IE8 no windows XP no windows7 funcionou, teria como tu fazer o teste do firefox, só pra ver se funciona??
outra coisa é muito importante setar o proxy no navegador com o nome completo srvsquid.meudominio.com.br, pois o kerberos precisa fazer um reverso do dns pra funcionar. Não deve setar o IP nem o nome WINS.
Tanta aí e posta o results do log pra ver qual o prob.
[15] Comentário enviado por brunofreitas em 17/06/2010 - 16:54h
troppy,
bom quanto ao log não pude pegar pois após testar sem sucesso também no IE7 resolvi começar do zero novamente, quanto a setagem do proxy no navegador eu tinha feito exatamente como voce falou, nesse momento eu estou fazendo por partes e começei a ver se consigo fazer o kerberos funcionar ele tem me retornado erros dizendo que não consegue chegar até o meu KDC, vou colar o conf dele aqui. outro ponto é que no AD eu tenho a opção de liberar o acesso de qualquer máquina especifica para acessar o kerberos, e dei essa permissão ao meu servidor proxy também, no mais o dns reverso está funcionando e o squid está adicionado no computers do AD, o arquivo do 2003 foi gerado, que no momento está sem uso uma vez que ainda não instalei o squid e pelo que itnendi é ele quem vai usar o arquivo. sou iniciante em linux por isso talvez esteja cometendo erros simples hehehe. segue o conf do kerberos e o erro:
[libdefaults]
default_realm = SYGMAMOTORS.LOCAL
dns_lookup_realm = no
dns_lookup_kdc = no
ticket_lifetime = 24h
forwardable = yes
# The following krb5.conf variables are only for MIT Kerberos.
krb4_config = /etc/krb.conf
krb4_realms = /etc/krb.realms
kdc_timesync = 1
ccache_type = 4
forwardable = true
proxiable = true
# for Windows 2003
default_tgs_enctypes = rc4-hmac des-cbc-crc des-cbc-md5
default_tkt_enctypes = rc4-hmac des-cbc-crc des-cbc-md5
permitted_enctypes = rc4-hmac des-cbc-crc des-cbc-md5
# For Windows XP:
default_tgs_enctypes = rc4-hmac des-cbc-crc des-cbc-md5
default_tkt_enctypes = rc4-hmac des-cbc-crc des-cbc-md5
permitted_enctypes = rc4-hmac des-cbc-crc des-cbc-md5
# The following libdefaults parameters are only for Heimdal Kerberos.
v4_instance_resolve = false
v4_name_convert = {
host = {
rcmd = host
ftp = ftp
}
plain = {
something = something-else
}
}
fcc-mit-ticketflags = true
[17] Comentário enviado por troppy em 08/09/2010 - 08:41h
Eu nunca tive um ambiente windows 2008 para teste, aqui na empresa utilizamos 2000 e 2003.
Porém tivemos alguns problemas com o windows7, este tinha que mudar uma opção no registro para funcionar o ntlm, talves fazendo esse procedimento no seu 2008 funcione também.
1) Em HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa
caso nao exista crie uma DWORD value com o nome LmCompatibilityLevel e coloque o valor de 1 para LM NTLM e NTLMv2 se é negociavel. Deve ser colocado valores entre 0 e 2
[18] Comentário enviado por andrefreire em 02/10/2010 - 07:46h
Bom dia !
Troppy testei seu modelo de autenticação e funcionou muito bem porém quando tentei fazer o controle dos usuários pelos grupos criados no AD não consegui fazer funcionar. Na autenticação NTLM, embora um pouco menos segura funciona perfeito inclusive com o Win7 mesmo sem alterações no registro.
[19] Comentário enviado por troppy em 02/10/2010 - 13:00h
Se tu tiver trazendo os usuários por consulta via winbind ou ntlm tem que ver aonde tu tá jogando esses grupos. tipo digamos que tu quer colocar os grupos
GRUPO DIRETORIA
/etc/squid3/diretoria.txt
PEDRO
CARLOS
PAULO
MATHEUS
quando tu utiliza o Kerberos se tu deres um tail -f /var/log/squid3/access.log tu vais ver os acessos via kerberos possui @MEU.DOMINIO.COM aí pra funcionar nos grupos criados além de ter o nome do usuário tu tem que fazer um script com o SED para adicionar @MEU.DOMINIO.COM. por exemplo o grupo diretoria ficaria
/etc/squid3/diretoria.txt
PEDRO
CARLOS
PAULO
MATHEUS
PEDRO@MEU.DOMINIO.COM
CARLOS@MEU.DOMINIO.COM
PAULO@MEU.DOMINIO.COM
MATHEUS@MEU.DOMINIO.COM
Eu não sei se tu tah fazendo consulta na base LDAP via winbind e jogando em grupos no arquivo txt se tiver fazendo isso é só testar adicionar o domínio. tente também deixar tudo maiúsculo.
Squid Cache (Version 3.0.STABLE8): Terminated abnormally.
CPU Usage: 0.012 seconds = 0.000 user + 0.012 sys
Maximum Resident Size: 0 KB
Page faults with physical i/o: 0
failed!
Me dá uma ajuda ai...porque eu ja revisei tudo e até agora não vi o erro.
Vou postar aqui o squid.conf
auth_param negotiate program /usr/lib/squid3/squid_kerb_auth -d -s HTTP/cnc.com@CNC.COM
auth_param negotiate children 20
auth_param negotiate keep_alive on
#Segue a configuração BASIC LDAP, basta descomentar as 4 linhas abaixo.
#O usuário fornecido deve ter permissão de consultar a base LDAP.
#auth_param basic program /usr/lib/squid3/squid_ldap_auth -R -b "DC=cnc,DC=com" -D "CN=Proxy-User,OU=Proxy-User,OU=internet,DC=cnc,DC=com" -w "123456" -f sAMAccountName=%s -P -v 3 -h 192.168.0.5
#auth_param basic children 20
#auth_param basic realm Autenticacao internet
#auth_param basic credentialsttl 2 hours
acl auth proxy_auth REQUIRED
acl manager proto cache_object
acl localhost src 127.0.0.1/32
acl to_localhost dst 127.0.0.0/8 0.0.0.0/32
acl SSL_ports port 443
acl Safe_ports port 80 # http
acl Safe_ports port 21 # ftp
acl Safe_ports port 443 # https
acl Safe_ports port 70 # gopher
acl Safe_ports port 210 # wais
acl Safe_ports port 1025-65535 # unregistered ports
acl Safe_ports port 280 # http-mgmt
acl Safe_ports port 488 # gss-http
acl Safe_ports port 591 # filemaker
acl Safe_ports port 777 # multiling http
acl CONNECT method CONNECT
auth_param negotiate program /usr/lib/squid3/squid_kerb_auth -d -s HTTP/cnc.com@CNC.COM
auth_param negotiate children 20
auth_param negotiate keep_alive on
#Segue a configuração BASIC LDAP, basta descomentar as 4 linhas abaixo.
#O usuário fornecido deve ter permissão de consultar a base LDAP.
#auth_param basic program /usr/lib/squid3/squid_ldap_auth -R -b "DC=cnc,DC=com" -D "CN=Proxy-User,OU=Proxy-User,OU=internet,DC=cnc,DC=com" -w "123456" -f sAMAccountName=%s -P -v 3 -h 192.168.0.5
#auth_param basic children 20
#auth_param basic realm Autenticacao internet
#auth_param basic credentialsttl 2 hours
acl auth proxy_auth REQUIRED
acl manager proto cache_object
acl localhost src 127.0.0.1/32
acl to_localhost dst 127.0.0.0/8 0.0.0.0/32
acl SSL_ports port 443
acl Safe_ports port 80 # http
acl Safe_ports port 21 # ftp
acl Safe_ports port 443 # https
acl Safe_ports port 70 # gopher
acl Safe_ports port 210 # wais
acl Safe_ports port 1025-65535 # unregistered ports
acl Safe_ports port 280 # http-mgmt
acl Safe_ports port 488 # gss-http
acl Safe_ports port 591 # filemaker
acl Safe_ports port 777 # multiling http
acl CONNECT method CONNECT
[22] Comentário enviado por plague70 em 18/04/2011 - 14:38h
como faco se eu tiver visitantes na empressa como eles vão fazer para usar a internet com proxy autenticado se eles não estão no mesmo dominio?????????
o acesso será dado conforme a política de segurança da informação da tua empresa. aqui quando é algum parceiro, instrutor, auditor, visitante, whatever... é colocado na OU Visitante. a pessoa responsável pelo visitante abre um chamado na central de TI e é criada uma conta com uma senha padrão, e repassado para o usuário. criamos um portal em java para o usuário alterar a senha sem ter que entrar no domínio, essa senha não entra no domínio.
por enquanto a classe faz alteração em clear text por conta de uma config de compatibilidade do AD para funcionamento da autenticação de impressão do mainframe, mas resolvemos a parte cliente servidor com ssl, o trafego clear é só entre o srvapl e o AD
Quanto ao 2008 infelizmente eu não posso falar pois não possuo esse cenário para testar, usamos 2003 aqui. Mas se alguém puder dar um feedback para ver se funcionou.
[25] Comentário enviado por hiroshibata em 05/08/2011 - 12:39h
Pessoal,
Quando tento gerar uma keytab no Server AD Windows 2008 Server dá uma mensagem de erro.
c:\Users\Hiro\Desktop>ktpass -princ HTTP/proxy-auth.domain.com.br@DOMAIN.COM.BR
-mapuser squid2 -crypto rc4-hmac-nt -pass ???????????? -ptype KRB5_NT_PRINCIPAL
-out c:\proxy-auth.keytab
Targeting domain controller: SRVAD.domain.com.br
Using legacy password setting method
Failed to set property 'servicePrincipalName' to 'HTTP/proxy-auth.domain.com.br' on
Dn 'CN=Squid2,OU=Admin IT,OU=TI,DC=domain,DC=com,DC=br': 0x32.
WARNING: Unable to set SPN mapping data.
If squid2 already has an SPN mapping installed for HTTP/proxy-auth.domain.com.br, t
his is no cause for concern.
Failed to retrieve user info for squid2: 0x5.
Aborted.
O que isso significa? Alguém já se deparou com esse problema?
Provavelmente esse keytab é que está gerando erro no meu /var/log/squid3/cache.log,
onde diz:
2011/08/05 11:33:37| squid_kerb_auth: DEBUG: Got 'YR TlRMTVNTUAABAAAAl4II4gAAAAAAAAAAAAAAAAAAAAARABDdAAAADw==' from squid (length: 59).
2011/08/05 11:33:37| squid_kerb_auth: DEBUG: Decode 'TlRMTVNTUAABAAAAl4II4gAAAAAAAAAAAAAAAAAAAAARABDdAAAADw==' (decoded length: 40).
2011/08/05 11:33:37| squid_kerb_auth: WARNING: received type 1 NTLM token
2011/08/05 11:33:37| authenticateNegotiateHandleReply: Error validating user via Negotiate. Error returned 'BH received type 1 NTLM token'