quinta-feira, 17 de junho de 2010

Squid + AD + Kerberos - Uma solução decente.

Buenas!!

Após um tempinho de correria voltei para publicar aqui mais uma ótima solução para nosso dia-a-dia.
Todos conhecem Squid e todos conhecem AD.

É muito comum termos organizações com as bases de usuários totalmente centralizadas no AD. Isso é fato.
Porém sempre houve uma dificuldade de se implementar ótimos proxies como o Squid por motivos que não nos estressam, mas estressam os usuários. O maior exemplo disso é a maldita janela de autenticação.

O motivo!
Em uma estrutura que administro, após uma mudança de topologias de Firewall precisei instalar proxies em cada filial (antes todas usavam o proxy da Matriz).

A opção!
Obviamente a solução de proxy escolhida para as filiais foi o Squid. Há quem diga que ele não é bom, mas basta ler e estudar suas funcionalidades que rapidamente achará diferenciais que colocam outros proxies vários anos atrás. O que você prefere para suas soluções? Algo fácil e medilcre ou a melhor e mais segura solução mesmo que você precise estudá-la e entendê-la? Estudar não mata ninguém!! O que ferra é o "profissional" ter a cara de pau de implementar algo "nas coxas" mesmo sabendo que podia ser melhor. Mas cada caso é um caso. No meu caso essa foi a MELHOR solução. : )

O problema!
Todos os usuários estavam acostumados com uma estrutura completamente integrada, onde a única vez que ele precisava colocar sua senha para serviços de rede era na autenticação do Windows. Todo o resto era feito através de kerberos, o que particularmente acho muito interessante. Para que fazer trabalho repetitivo se o objetivo final é o mesmo?
Outro fato é que essa solução de Squid integrado com Kerberos, AD e fazendo controles baseados em usuários e grupos é muito difícil de ser encontrada até mesmo pela sua complexidade. Não basta dar um "rpm -ivh" e fazer algumas configurações que o negócio saí funcionado. Isso seria ótimo!!! Até tive uma idéia: Vou mandar um e-mail para o pessoal do Squid e/ou gerar os pacotes para as distros que uso.

A solução!
Bom, vamos dar um jeito de fazer isso funcionar de forma profissional. Gambiarras qualquer um consegue fazer. Vamos fazer algo um pouco mais decente do que os preguiçosos costumam fazer... hehehehe Não é nada pessoal com ninguém, mas para o seu próprio bem, espero que o chapéu não sirva... e por favor, se alguém achar uma solução ainda melhor compartilhe. Sempre temos algo para aprender com os próximos.
Também é fato que muitos profissionais bons nem mesmo sabiam dessa possibilidade. Não devemos julgar ninguém ainda mais de forma preconceituosa. Para isso estou colocando a solução aqui. Algo construtivo.

Importante: Não é integração com LDAP, isso é fácil e está cheio de tutorial na Internet. Isso é Kerberos!

Resumo:
Basicamente faremos uma compilação da última versão do squid pois nas versões das oferecidas pelas distros (testei em CentOS) não vem com o módulo de integração com kerberos.
Depois vamos baixar e compilar um módulo bem interessante para fazermos buscas de grupos e usuários através de kerberos.
Por fim vamos ajustar nosso SO para se comunicar com o servidor kerberos e criar um arquivo de credenciais para consultas vindas do Squid.
Se tudo funcionar legal você pode pedir aumento, replicar a solução, abrir uma cerveja, pagar um churras para os amigos (me chama), etc etc... Como preferir.


Let's Start!!

FQDN do meu servidor Squid: squidserver.macus.net
FQDN do meu servidor AD: adserver.marcus.net
Distro Linux: CentOS 5.5 x86
Versão AD: 2008 R2

Preparando o Squid
Fiz o download da última versão do Squid no site http://www.squid-cache.org/. Antes do download dê uma olhada se já não tem uma versão mais nova.

$ wget http://www.squid-cache.org/Versions/v3/3.1/squid-3.1.4.tar.gz

$ tar -xvzf squid-3.1.4.tar.gz
$ cd squid-3.1.4

As opções em negrito são importantes na hora de compilar, pode colocar outras se quiser...
$ ./configure --enable-negotiate-auth-helpers=squid_kerb_auth --enable-stacktraces --prefix=/opt/squid-3.1

$ make
$ make install


Antes de configurarmos nosso Squid vamos fazer os outros procedimentos que ele depende.

Compilando módulo de consulta em grupos por Kerberos
Bem interessante esse módulo, mas infelizmente não vem nativamente no Squid.

$ cvs -z3 -d:pserver:anonymous@squidkerbauth.cvs.sourceforge.net:/cvsroot/squidkerbauth co -P squid_kerb_ldap
$ cd squid_kerb_ldap
$ ./configure ; make
$ cp -a squid_kerb_ldap /opt/squid-3.1/sbin


Gerando o Keytab pelo Windows
Para que o Squid consiga trocar tickets com o servidor kerberos, o mesmo precisa de credenciais para isso. Não temos como ficar autenticando o squid manualmente a cada incialização do mesmo, por isso vamos criar um arquivo keytab e adicioná-lo no nosso arquivo de inicialização do Squid.

Esse processo pode ser feito pelo próprio Linux usando o msktutil, mas encontrei alguns problemas nele quando o servidor Squid não está no domínio. Como não vou colocar ele no domínio usei a própria ferramenta do Windows 2008 (AD) que é nativa no SO.

Antes de gerar o keytab é necessário criar um usuário no AD que será cadastrado nessas credenciais.
No meu caso criei o usuário "squid.filial" e rodei o seguinte comando no meu PDC.

C:\> ktpass -princ HTTP/squidserver.marcus.net@MARCUS.NET -mapuser marcus.net\squid.filial -crypto All -mapop set -pass senha -ptype KRB5_NT_SRV_HST -out squid.filial.keytab

Mande o arquivo keytab gerado para o servidor Squid. No meu caso coloquei na pasta /opt/squid.


Em alguns materiais da Internet o pessoal usava criptografia "rc4-hmac-nt", mas tive alguns problemas com autenticação. Dei uma pesquisada por cima e encontrei algumas referênias dizendo que no Windows 7 e 2008 foram alteradas algumas questões de criptografia. Com o all todos os serviços funcionaram legal. Algo interessante é usar o Wireshark para monitorar as requisições de tickets entre cliente e servidor.

Adicione as estradas do keytab no script de inicialização do Squid.
Caso não tenha o script de inicialização do mesmo, aconselho pegar de um pacote do squid específico da distro.

De volta ao Linux
No arquivo /etc/init.d/squid adicione as seguintes linhas:

KRB5_KTNAME=/opt/squid/squid.filial.keytab
export KRB5_KTNAME


Kerberos Client
Edite o arquivo /etc/krb5.conf

No meu caso ficou assim:
##################
[logging]
 default = FILE:/var/log/krb5libs.log
 kdc = FILE:/var/log/krb5kdc.log
 admin_server = FILE:/var/log/kadmind.log

[libdefaults]
 default_realm = MARCUS.NET
 dns_lookup_realm = false
 dns_lookup_kdc = false
 ticket_lifetime = 24h
 forwardable = yes

; for Windows 2008 with AES
      default_tgs_enctypes = aes256-cts-hmac-sha1-96 rc4-hmac des-cbc-crc des-cbc-md5
      default_tkt_enctypes = aes256-cts-hmac-sha1-96 rc4-hmac des-cbc-crc des-cbc-md5
      permitted_enctypes = aes256-cts-hmac-sha1-96 rc4-hmac des-cbc-crc des-cbc-md5

[realms]
 MARCUS.NET = {
  kdc = adserver.marcus.net:88
  admin_server = adserver.marcus.net:749
  default_domain = marcus.net
 }

[domain_realm]
 .marcus.net = MARCUS.NET
 marcus.net = MARCUS.NET

[appdefaults]
 pam = {
   debug = false
   ticket_lifetime = 36000
   renew_lifetime = 36000
   forwardable = true
   krb4_convert = false
 }

##################


Configurações do Squid
Antes de mexer no squid copiei mais um arquivo para a pasta sbin.

$ cd /opt/squid-3.1
$ cp -a libexec/squid_kerb_auth sbin/

Dentre as demais configurações, o que interessa para a autenticação kerberos é:

##################
# KERBEROS - Integracao completa com AD
auth_param negotiate program /opt/squid-3.1/sbin/squid_kerb_auth -s HTTP/squidserver.marcus.net
auth_param negotiate children 10
auth_param negotiate keep_alive on

# ACLs externas para buscar grupo baseado em Kerberos.
external_acl_type Internet_Full ttl=3600 negative_ttl=3600 %LOGIN /opt/squid-3.1/sbin/squid_kerb_ldap -g Internet_Full

##################

Beleza! Feito isso é só criar os diretórios de cache e iniciar o squid.
Configure o proxy e porta no navegador das estações e teste.

Detalhes e Dicas:
- Certifique-se que os servidores conseguem resolver nomes DNS do Squid e do AD.
- Verifique as permissões dos arquivos e pastas do Squid.
- Verifique se os horários dos servidores e clientes estão sincronizados.
- Observe o arquivo cache.log do Squid para resolver problemas ou entender o funcionamento.
- Da para colocar os módulos squid_kerb_auth e squid_kerb_ldap em modo dedug apenas adicionando um "-d" depois do comando no squid.conf.


Fontes que li durante a implementação

Belo Tutorial:
http://klaubert.wordpress.com/2008/01/09/squid-kerberos-authentication-and-ldap-authorization-in-active-directory/

Squid Kerb Helper
http://sourceforge.net/projects/squidkerbauth/

Informações sobre KeyTabs
http://publib.boulder.ibm.com/infocenter/wasinfo/v6r1/index.jsp?topic=/com.ibm.websphere.express.doc/info/exp/ae/tsec_SPNEGO_config_dc.html

Informações sobre erros comuns:
http://sammoffatt.com.au/jauthtools/Kerberos/Troubleshooting

52 comentários:

  1. Legal! :-)

    Uma curiosidade: mesmo utilizando o keytab gerado pelo ktpass, ainda aparecem os "TCP_MISS" no log do squid?

    ResponderExcluir
  2. Olá Rodrigo!

    Sim, a tag "TCP_MISS/200" é normal nos logs de acesso do squid usando essa configuração.

    Abração!

    ResponderExcluir
  3. Excelente artigo, muito bem explicado e refinado!
    Parabéns!

    ResponderExcluir
  4. Este comentário foi removido pelo autor.

    ResponderExcluir
  5. Olá Juliano!

    Usando somente o squid_kerb_auth não, pois ele é específico para trabalhar com kerberos e mais especificamente com autenticação.

    Para regras de grupos precisamos, nesse caso, procurar nas bases ldap (AD, OpenLDAP, etc), pois são nelas que acharemos as informações de grupos e usuários.

    Nesse mesmo post tem exemplo de configuração do squid_kerb_ldap.

    Abraço!

    ResponderExcluir
  6. Ola Marcus, ainda fiquei com uma duvida desse seu post. Trabalho numa grande corporação e estou precisando implantar uma solução de entrega de internet mais inteligente, com filtro de conteúdo. Mas então me interessei por sua postagem. O que voce quis dizer com ela foi autenticação no AD utilizando Kerberos. Assim dispensava a famosa tela de autenticação. Mas ai que mora a dúvida. Esse usuário utilizado para autenticar é o mesmo sempre? Assim toda navegação fica atras dessa autenticação? Ou apenas voce trocou o protocolo utilizado de NTLM para Kerberos, ocorrendo uma autenticação inetragada ao AD, ou seja, todos os browsers captam o usuário logado na maquina e essa ao AD, e ja autenticam automaticamente?

    Obrigado.

    ResponderExcluir
  7. Olá Luisinho!

    Kerberos é o método de autenticação usado pelas ferramentas para fazer a chamada "integração", ou seja, o usuário se autentica apenas uma vez e as demais ferramentas se autenticam a partir dessa primeira autenticação.

    Dessa forma realmente não aparecerá mais a janela de autenticação do navegador. Se você está integrando com AD, acredito que cada pessoa tenha seu próprio usuário/senha de domínio. Nesse caso a pessoa digita o usuário e senha apenas uma vez. Para acessar o Windows, por exemplo. E quando abrir o navegador, o proxy fará a autenticação usando kerberos, ou seja, usará as mesmas credenciais usadas no logon do Windows.

    Os logs de SARG, por exemplo, mostraram os acessos daquele usuário autenticado na máquina.

    Acredito que tenha respondido suas questões. Qualquer coisa entre em contato.

    Abraço!

    ResponderExcluir
  8. Fala marcus,

    Excelente artigo, muito bom mesmo. Você já fez este tipo de implementação ou algum teste com clientes Windows XP ? Alguma dica para este cenário?



    Desde já agradeço pela atenção

    Thalysson Sarmento

    ResponderExcluir
  9. Olá Thalysson!

    Primeiramente desculpe a demora na resposta. Não pude olhar antes...

    Muito obrigado! Fico feliz que tenha sido útil o artigo.

    Quanto ao XP, essa implementação é completamente compatível, inclusive já vi em alguns fóruns que o pessoal já a implementou. O que eu não tinha visto ainda era com o Windows 7 (por isso publiquei... hehe).

    Com a entrada do Windows Server 2008 como AD, houveram algumas mudanças em relação aos algoritmos de criptografia de kerberos, mas isso comentei ali no artigo mesmo. O segredo está na hora de gerar o keytab.

    Pode seguir em frente com esse cenário que funcionará legal. E conte comigo no que for possível.

    Grande abraço!

    ResponderExcluir
  10. Fala cara.

    Que isso rapaz, fica tranquilo.

    Ah legal, só perguntei porque um colega testou e não deu certo, pois o Windows 2008 Server usa no kerberos o AES256, porém, o XP não aceita essa criptografia, só o Windows 7 mesmo. Mas irei falar com meu colega, e também efetuar uns testes.

    Fico muito grato pela atenção.

    Sucesso cara.


    Abraço.

    ResponderExcluir
  11. Marcus

    Estou utilizando o seu post para implantamos o SSO aqui no proxy da empresa.
    Você chegou a encontrar o este erro?

    squid_kerb_auth: parseNegTokenInit failed with rc=101

    Não autenticação nem a pau, já fiz de tudo.

    ResponderExcluir
  12. Olá William!

    Não me recordo de ter visto esse erro.
    Mas uma dica interessante é habilidar o modo de debug nele com a opação "-d".

    Outros detalhes que precisam ser observados são a sincronização do horário e a forma como foi gerado o keytab.

    Abração!

    ResponderExcluir
  13. Marcus!

    Parabéns pelo artigo, simples mas extremamente eficiente.

    O meu squid estava autenticando beleza, mas não estava conseguindo consultar os grupos com o squid_kerb_ldap...

    Já estava batendo cabeça, e acredito que o problema que estava relacionado ou ao parâmetro "-crypto All" ou "-mapop".

    Refiz o arquivo keytab, com esta dica e tudo aconteceu.

    Forte abraço!

    César Menezes

    ResponderExcluir
  14. Marcus,
    Estou tentando seguir o passo-a-passo e me deparo com algumas dependencias no SO. Estou com a versão do CENTOS 5.6 e squid-3.1.14, a última. Gostaria de pedir que me passe, se possível, os requisitos de pacotes para esse processo. No momento me deparo com o seguinte erro:

    make[4]: Entrando no diretório `/root/program/squid-3.1.14/helpers/negotiate_auth/squid_kerb_auth'
    make[5]: Entrando no diretório `/root/program/squid-3.1.14/helpers/negotiate_auth/squid_kerb_auth'
    gcc -DHAVE_CONFIG_H -I. -I../../../ -I../../../include/ -I/root/program/squid-3.1.14/include -I/root/program/squid-3.1.14/src -I/root/program/squid-3.1.14 -g -O2 -Wall -Wextra -Werror -Wcomment -Wpointer-arith -Wcast-align -Wwrite-strings -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wdeclaration-after-statement -Wshadow -MT squid_kerb_auth.o -MD -MP -MF .deps/squid_kerb_auth.Tpo -c -o squid_kerb_auth.o squid_kerb_auth.c
    In file included from squid_kerb_auth.c:32:
    ska_config.h:247:2: error: #error "GSSAPI header required"
    squid_kerb_auth.c:88: error: expected â)â before âmajor_statusâ
    squid_kerb_auth.c:144: error: expected â)â before âmajor_statusâ
    squid_kerb_auth.c: In function âmainâ:
    squid_kerb_auth.c:212: error: âOM_uint32â undeclared (first use in this function)
    squid_kerb_auth.c:212: error: (Each undeclared identifier is reported only once
    squid_kerb_auth.c:212: error: for each function it appears in.)
    squid_kerb_auth.c:212: error: expected â;â before âret_flagsâ
    cc1: warnings being treated as errors

    To tentando debugar, mas tá difícil. Parece que é relacionado com o GSS-API, mas não faço idéia de como solucionar o problema.
    Att,
    Hiro

    ResponderExcluir
  15. Olá César!!

    Muito obrigado pelo feedback.

    Abração!

    ResponderExcluir
  16. Olá Hiro!

    Possivelmente os pacotes de Kerberos não estão instalados no seu CentOS 5.6. Procure os pacotes de kerberos com o comando:
    # yum search kerberos ou
    # yum search krb
    Instale os pacotes necessários de kerberos do MIT e tente compilar novamente.

    Grande abraço!

    ResponderExcluir
  17. Olá Marcus!
    Depois de apanhar um pouco, consegui resolver. Muito obrigado.
    Tem alguma forma de passar essa autenticação para o squidGuard? Se sim, tem algum exemplo de como utilizá-lo no squidGuard?
    Abraço!

    ResponderExcluir
  18. Olá Marcus! Tudo bem? Artigo muito bom. Consegui implementar. Gostaria de saber como faço para criar ACLs a partir de grupos do AD. É possível eu buscar grupos do AD e declarar ACLs com esse grupos restringindo tempo de acesso, sites a determinados grupos? Grato

    Wladner

    ResponderExcluir
  19. Bom dia, meu nome é carlos

    Estou com dificuldades para criar o arquivo KTPASS, está dando o seguinte erro.

    Cannot DsCrackNames: 0x57
    Ktpass: failed getting target domain for specified user.

    meu arquivo é:

    C:\> ktpass -princ HTTP/firewall-cpd.fit21.com.br@FIT21.COM.BR -mapuser fit21.com.br\teste -crypto All -mapop set -pass 12345 -ptype KRB5_NT_SRV_HST -out teste.keytab

    Meu usuário é: teste
    Meu server Squid é: firewall-cpd

    Agradeço pela atenção.
    Meu e-mail é carlosalexandre@crtisolutions.com.br

    ResponderExcluir
  20. Ola Marcus, Belo tutorial. Esse exemplo que voce deu serve para o AD do Windows 2003 tambem? muda alguma coisa?

    Abraço
    Ass. Douglas

    ResponderExcluir
  21. Olá Hiro!

    Descilpe da demora na resposta. Nunca testei essa solução com o SquidGuard, mas acredito que não haja problemas, pois o SquidGuard usaria a autenticação do próprio Squid.

    Abraço!

    ResponderExcluir
  22. Olá Anônimo!

    Primeiramente obrigado!

    Nesse próprio artigo está descrito como fazer acls por grupos. Da uma olhadinha ali em cima. : )

    A acl é tratada como todas as outras, então tudo isso é possível sim de combinar nas regras de acessos (http_access) seguindo os padrões do próprio Squid.

    Abraço!

    ResponderExcluir
  23. Olá Carlos!

    Tente usar o "domínio netbios":

    C:\> ktpass -princ HTTP/firewall-cpd.fit21.com.br@FIT21.COM.BR -mapuser fit21\teste -crypto All -mapop set -pass 12345 -ptype KRB5_NT_SRV_HST -out teste.keytab

    Pelo erro ele diz que não encontra o domínio para o usuário teste. As configurações de DNS estão ok também? É válido checar.

    Abraço!

    ResponderExcluir
  24. Olá Douglas!

    Esses procedimentos devem funcionar normalmente no Windows 2003.

    Talvez você tenha que mudar apenas a criptografia na hora de gerar o KeyTab para "rc4-hmac-nt".

    Descrevi alguma coisa ali em cima na sessão "Gerando o keytab pelo Windows".

    Abraço!

    ResponderExcluir
  25. Marcus

    Tenho algumas dúvidas:
    o meu linux squid precisa estar no dominio do AD windows 2003?
    Eu preciso instalar o samba para integração entre eles?
    Quando isso estiver funcionando, ele só vai pedir a senha uma unica vez?
    Grato
    Douglas

    ResponderExcluir
  26. Olá Douglas!

    Seu Linux não precisa estar no domínio (net ads join) devido ao uso do keytab.

    Não há necessidade de instalar samba. Essa é uma das grandes vantagens dessa solução (ao meu ver).

    O Squid usará a mesma senha do Logon do Usuário, ou seja, uma vez digitada a senha no logon o Kerberos se encarrega de deixar tudo transparente ao usuário.

    Abraço!

    ResponderExcluir
  27. Este post e os comentários me ajudaram em várias dúvidas que eu tinha. Agora a próxima missão é botar a mão na massa e seguir o roteiro, hehe. Caso tenha alguma outra dúvida, comentarei aqui, Marcus.

    ResponderExcluir
  28. Excelente artigo Marcus, Já fiz algumas implementações de squid com kerberos usando Debian e Ubuntu Server, e agora estou fazendo uma em CENTOS e pelo que vi no seu artigo, o processo é basicamente o mesmo.

    Só complementando o artigo, na versão 6.2 do CENTOS o squid já vem com o squid_kerb_auth compilado no pacote RPM, então pode-se instalar atraves do yum mesmo para facilitar na hora de instalar/atualizar.

    Respondendo a duvida do colega acima, já fiz com domínios 2003 SP2 e 2008 R2 e a solução funciona sim, a única diferença é, como o Marcus falou, na hora de gerar o KEYTAB, mudar a criptografia. Para quem tiver problemas usando criptografia "ALL", pode consultar as específicas para cada versão de AD no site abaixo que tem uma tabela bem completa, pesquise por "Use ktpass options as describe in the table below":
    http://www.grolmsnet.de/kerbtut/


    []'s
    Alexandre

    ResponderExcluir
    Respostas
    1. Olá Alexandre!

      Muito obrigado pela contribuição.
      Agradecemos.


      Abraço!

      Excluir
  29. Oi Marcus,

    Parabéns pelo artigo, estou querendo implantar aqui, gostaria da sua ajuda se possível, eu preciso implantar esta solução junto com a opção de grupo no ad coisa que não achei aqui, vc poderia me ajudar?

    Grato,

    Ass: Erik P. Ghijs - eghijs@gmail.com

    ResponderExcluir
    Respostas
    1. Olá Erik, tudo bem?

      Ali em cima tem a sessão "Compilando módulo de consulta em grupos por Kerberos" que descreve como isso é feito.

      Da uma olhadinha lá e qualquer dúvida entre em contato.

      Abraço!

      Excluir
  30. Srs, outra observação:

    Em uma instalação com CENTOS 6.2 + Squid +kerberos do pacote, nem conseguia inicializar o squid, dava erro de permissão no acesso ao squid.conf logo na inicialização... Descobri que o SELINUX estava bloqueando e coloquei-o em modo "permissive". Assim o squid inicializou, mas os processos do squid_kerb_auth estavam consumindo 90% da CPU, Tentei o parâmetro no /etc/init./squid que desabilita a checagem de cache do kerberos, isso abre a possibilidade para replay attacks de curta duração, mas é uma alternativa válida em ambientes de alta carga e que não precisam de tanta segurança:
    #########################
    KRB5RCACHETYPE=none
    export KRB5RCACHETYPE
    #########################
    Isso amenizou a fome de processamento do kerberos, mas não resolveu... O problema foi resolvido definitivamente apenas desabilitando completamente o SELINUX, que mesmo no modo permissivo estava causando problemas com o kerberos. Fica ai a dica para quem utiliza essa solução de proxy em ambientes de alta carga, agora a utilização da CPU caiu para 10%, vou ficar devendo o teste removendo o CACHETYPE.

    []'s
    Alexandre

    ResponderExcluir
  31. Boa noite Marcus Implantar esse artigo em distribuições derivado do Debian tem algum problema? Pois estou entrando em uma empresa que há muitos problemas com o Squid referente a autenticação no AD e estarei incumbido de resolver. Preciso estudar bastante sobre isso. Inclusive, se você puder me indicar material de estudo ficaria muito grato.
    Email: genius.tux@gmail.com

    ResponderExcluir
    Respostas
    1. Olá!

      Apesar de ainda não ter feito essa implementação com o Debian ou derivados, não vejo nenhum impedimento para que não funcione.

      No final do post coloquei umas fontes nas quais encontrei informações úteis.

      Basicamente, o conteúdo que seria interessante estudar e dominar para essa solução é Kerberos e AD. Claro, entender bem o funcionamento do Squid e o conceito de proxy também agrega.

      Abraço!

      Excluir
  32. Marcus,

    Você já testou a solução com o Firefox? No IE funciona tudo certinho, mas no Firefox não.

    ResponderExcluir
    Respostas
    1. Marcus,

      Segue o recomentado acima passo a passo, mais quando testo o meu acesso, o squid da o erro abaixo. Vc sabe onde estou comendo bola?
      Grato
      Douglas

      squid_kerb_auth: WARNING: received type 1 NTLM token
      2012/06/05 13:48:31| authenticateNegotiateHandleReply: Error validating user via Negotiate. Error returned 'BH received type 1 NTLM token'

      Excluir
    2. Olá!

      Já testei com o Firefox e tive um problema de autenticação. Ele não estava aceitando kerberos. Naquela ocasião, o firefox não era usado na estrutura então acabei não pesquisando como ativar o suporte a kerberos nele (acredito que tenha como).

      Uma alternativa para o momento foi criar um segundo método de autenticação no Squid, no caso, o LDAP. Na prática, quando eu acessava do meu computador com Firefox, ele não passava no kerberos e acabava mostrando a janela de autenticação. Nela eu digitava minhas credenciais do AD (LDAP) e navegava normalmente.

      Caso encontre como habilitar o kerberos no firefox, compartilhe conosco. Se eu achar essa informação antes também publico aqui.

      Abração!

      Excluir
    3. Olá, Douglas!

      Esse erro parece algum problema com a conta do Squid criada no AD. Por favor, acesse as propriedades dessa conta no AD e vá na aba "Account".

      Nessa aba, observe se a conta está semelhante a "HTTP/squidserver.dominio.net".

      Caso não esteja nesse formato, por favor, revise a sessão "Gerando o Keytab pelo Windows".

      Compartilhe o resultado conosco.

      Abraço!

      Excluir
  33. Marcus,
    Comando executado no AD com Windows 2003.

    ktpass -princ HTTP/srvsquid.intranet-sede.local@INTRANET-SEDE.LOCAL -mapuser squid1 -crypto rc4-hmac-nt -pass prod%2@12% -ptype KRB5_NT_PRINCIPAL -out c:\
    srvsquid175.keytab

    Propriedades do AD:
    Nome de Logon do Usuario:
    HTTP/srvsquid.intranet-sede.local @intranet-sede.local

    Linha do SQUID
    auth_param negotiate program /usr/local/squid/libexec/squid_kerb_auth -d -s HTTP/estiva-nd1.intranet-sede.local@INTRANET-SEDE.LOCAL
    auth_param negotiate children 20
    auth_param negotiate keep_alive on
    acl autentica proxy_auth REQUIRED

    Obs:
    No Meu servidor squid só subi o processo do squid, preciso subir outros processos, como por exemplo winbind,samba,kerberos?
    Tambem não instalei o squid_kerb_ldap, pois não tenho grupos, isso faz diferença?
    também não coloquei a máquina do dominio do AD.

    Não sei mais o que fazer. Tem alguma outra idéia?

    Grato Marcus.
    SDS
    Douglas

    ResponderExcluir
  34. Marcus,

    Quando executo o comando abaixo para testar a conversa
    com o AD 2008
    /usr/local/bin/squid_kerb_ldap -i -d -g AcessoTI -N proxyuser.g3.local@G3.LOCAL -D G3.LOCAL -S michigan.g3.local@g3.local

    Aparece a mensagem de erro:
    2012/07/05 18:20:40| squid_kerb_ldap: Error while binding to ldap server with SASL/GSSAPI: Unknown authentication method
    2012/07/05 18:20:40| squid_kerb_ldap: Setting up connection to ldap server G3.LOCAL:389
    2012/07/05 18:20:40| squid_kerb_ldap: Bind to ldap server with SASL/GSSAPI
    2012/07/05 18:20:40| squid_kerb_ldap: ldap_sasl_interactive_bind_s error: Unknown authentication method
    2012/07/05 18:20:40| squid_kerb_ldap: Error while binding to ldap server with SASL/GSSAPI: Unknown authentication method
    2012/07/05 18:20:40| squid_kerb_ldap: Error during initialisation of ldap connection: Bad file descriptor
    2012/07/05 18:20:40| squid_kerb_ldap: Error during initialisation of ldap connection: Bad file descriptor
    2012/07/05 18:20:40| squid_kerb_ldap: User is not member of group@domain AcessoTI@NULL
    ERR


    O que pode estar errado? Agradeço antecipadamente

    Glauco

    ResponderExcluir
  35. Marcus,

    Complementando o problema relatado, vi em outro tutorial que precisa instalar o pacote cyrus-sasl-ldap, contudo este pacote não existe para a minha versão do Mandriva 2010.2. A informação que tenho é que este pacote ficou obsoleto. No meu linux o serviço de Kerberos não está rodando, está apenas instalado e alterei o arquivo krb5.conf conforme seu tutorial.
    Será que posso compilar o pacote squid_kerb_ldap sem utilizar o SASL/GSSAPI?

    Agradeço antecipadamente

    Glauco

    ResponderExcluir
  36. Marcus,

    Consegui resolver o problema do SASL/GSSAPI. Instalei o pacote libsasl2.
    Agora meu problema é que sempre retorna ERR. Não acha o usuário que está no grupo especificado.
    Estrutura do meu AD:
    UO - Internet
    Grupo - AcessoTI com usuários do AD

    Executo o teste com o comando abaixo e sempre retorna ERR.

    **PRIMEIRA PARTE do ERRO**

    [root@ggssf_g3 squid]# squid_kerb_ldap -d -i -g AcessoTI@g3.local -N proxyuser.g3.local@G3.LOCAL -D G3.LOCAL -S michigan.g3.local@g3.local -u demo -p demo 2012/07/06 09:43:02| squid_kerb_ldap: Starting version 1.2.2
    2012/07/06 09:43:02| squid_kerb_ldap: Group list AcessoTI@g3.local
    2012/07/06 09:43:02| squid_kerb_ldap: Group AcessoTI Domain g3.local
    2012/07/06 09:43:02| squid_kerb_ldap: Netbios list proxyuser.g3.local@G3.LOCAL
    2012/07/06 09:43:02| squid_kerb_ldap: Netbios name proxyuser.g3.local Domain G3.LOCAL
    2012/07/06 09:43:02| squid_kerb_ldap: ldap server list michigan.g3.local@g3.local
    2012/07/06 09:43:02| squid_kerb_ldap: ldap server michigan.g3.local Domain g3.local

    2012/07/06 09:43:03| squid_kerb_ldap: Got User: set default domain: G3.LOCAL
    2012/07/06 09:43:03| squid_kerb_ldap: Got User: Domain: G3.LOCAL
    2012/07/06 09:43:03| squid_kerb_ldap: User domain loop: group@domain AcessoTI@g3.local
    2012/07/06 09:43:03| squid_kerb_ldap: Found group@domain AcessoTI@g3.local
    2012/07/06 09:43:03| squid_kerb_ldap: Setup Kerberos credential cache
    2012/07/06 09:43:03| squid_kerb_ldap: Get default keytab file name
    2012/07/06 09:43:03| squid_kerb_ldap: Got default keytab file name /etc/krb5.keytab
    2012/07/06 09:43:03| squid_kerb_ldap: Get principal name from keytab /etc/krb5.keytab


    Agradeço antecipadamente.

    Glauco

    ResponderExcluir
  37. Marcus,

    Quebrei a mensagem em duas devido ao limite de caracteres.

    ** SEGUNDA PARTE DO ERRO **

    2012/07/06 09:43:03| squid_kerb_ldap: Keytab entry has realm name: G3.LOCAL
    2012/07/06 09:43:03| squid_kerb_ldap: Found principal name: HTTP/saci.g3.local@G3.LOCAL
    2012/07/06 09:43:03| squid_kerb_ldap: Set credential cache to MEMORY:squid_ldap_28437
    2012/07/06 09:43:03| squid_kerb_ldap: Got principal name HTTP/saci.g3.local@G3.LOCAL
    2012/07/06 09:43:03| squid_kerb_ldap: Stored credentials
    2012/07/06 09:43:03| squid_kerb_ldap: Initialise ldap connection
    2012/07/06 09:43:03| squid_kerb_ldap: Canonicalise ldap server name for domain G3.LOCAL
    2012/07/06 09:43:03| squid_kerb_ldap: Ldap server loop: lserver@domain michigan.g3.local@g3.local
    2012/07/06 09:43:03| squid_kerb_ldap: Found lserver@domain michigan.g3.local@g3.local
    2012/07/06 09:43:03| squid_kerb_ldap: Resolved address 1 of G3.LOCAL to michigan.g3.local
    2012/07/06 09:43:03| squid_kerb_ldap: Resolved address 2 of G3.LOCAL to michigan.g3.local
    2012/07/06 09:43:03| squid_kerb_ldap: Resolved address 3 of G3.LOCAL to michigan.g3.local
    2012/07/06 09:43:03| squid_kerb_ldap: Adding G3.LOCAL to list
    2012/07/06 09:43:03| squid_kerb_ldap: Sorted ldap server names for domain G3.LOCAL:
    2012/07/06 09:43:03| squid_kerb_ldap: Host: michigan.g3.local Port: -1 Priority: -1 Weight: -1
    2012/07/06 09:43:03| squid_kerb_ldap: Host: G3.LOCAL Port: -1 Priority: -2 Weight: -2
    2012/07/06 09:43:03| squid_kerb_ldap: Setting up connection to ldap server michigan.g3.local:389
    2012/07/06 09:43:03| squid_kerb_ldap: Bind to ldap server with SASL/GSSAPI
    2012/07/06 09:43:03| squid_kerb_ldap: Successfully initialised connection to ldap server michigan.g3.local:389
    2012/07/06 09:43:03| squid_kerb_ldap: Search ldap server with bind path "" and filter: (objectclass=*)
    2012/07/06 09:43:03| squid_kerb_ldap: Search ldap entries for attribute : schemaNamingContext
    2012/07/06 09:43:03| squid_kerb_ldap: 1 ldap entry found with attribute : schemaNamingContext
    2012/07/06 09:43:03| squid_kerb_ldap: Search ldap server with bind path CN=Schema,CN=Configuration,DC=g3,DC=local and filter: (ldapdisplayname=samaccountname)
    2012/07/06 09:43:03| squid_kerb_ldap: Found 1 ldap entry
    2012/07/06 09:43:03| squid_kerb_ldap: Determined ldap server as an Active Directory server
    2012/07/06 09:43:03| squid_kerb_ldap: Search ldap server with bind path dc=G3,dc=LOCAL and filter : (samaccountname=)
    2012/07/06 09:43:03| squid_kerb_ldap: Found 0 ldap entries
    2012/07/06 09:43:03| squid_kerb_ldap: User is not member of group@domain AcessoTI@g3.local
    2012/07/06 09:43:03| squid_kerb_ldap: Default domain loop: group@domain AcessoTI@g3.local
    2012/07/06 09:43:03| squid_kerb_ldap: Default group loop: group@domain AcessoTI@g3.local
    ERR
    2012/07/06 09:43:03| squid_kerb_ldap: ERR



    Glauco

    ResponderExcluir
  38. Marcus,

    Descobri que o squid_kerb_ldap está funcionando normalmente. Eu que não estava digitando o nome do usuário para ele buscar no grupo AcessoTI do AD.
    Agora meu problema é no squid. Recompilei conforme sua orientação porém não está funcionando.
    Como este módulo utiliza o krb5.conf e o arquivo .keytab então acredito que o problema possa estar no módulo squid_kerb_auth que é o que pega o login do windows e passa para o squid_kerb_ldap. Verifiquei que na pasta /usr/lib/squid tem um módulo chamado squid_kerb_auth_test. Estou tentando entender como testar este módulo fora do squid.
    Caso você tenha alguma sugestão para o meu problema, agradeço antecipadamente.

    Glauco

    ResponderExcluir
  39. Marcus,

    Só consegui gerar o arquivo keytab no windows com os parâmetros abaixo.
    ktpass -princ HTTP/saci.g3.local@G3.LOCAL -mapuser proxyuser@g3.local -crypto All -mapop set -pass minha_senha -ptype KRB5_NT_PRINCIPAL -out proxyuser.keytab
    Isto pode estar influenciando?

    O Kerberos está instalado com seus arquivos de configuração porém não tem nenhum serviço dele rodando no linux. Também não tem SAMBA e nem adicionei o servidor linux no domínio.
    Quando executo pelo prompt do linux o comando squid_kerb_auth -S HTTP/saci.g3.local@G3.LOCAL ele pede alguma entrada que ainda não sei o que é.

    Grato!

    Glauco

    ResponderExcluir
  40. Marcus,

    Meu servidor é o windows 2008 std 32bits (Português)

    Quando gero o arquivo keytab com os parâmetros que você recomenda aparece a seguinte mensagem:

    - Comando:
    c:\> ktpass -princ HTTP/saci.g3.local@G3.LOCAL -mapuser g3.local\proxyuser -crypto All -mapop set -pass ggssf7 -ptype KRB5_NT_SRV_HST -out proxyuser.key

    - Mensagem de erro:
    Cannot DsCrackNames : 0x57
    ktpass: failed getting target domain for specified user

    - Meu arquivo krb5.conf
    [logging]
    default = FILE:/var/log/krb5libs.log
    kdc = FILE:/var/log/krb5kdc.log
    admin_server = FILE:/var/log/kadmind.log

    [libdefaults]
    ticket_lifetime = 24000
    default_realm = G3.LOCAL
    dns_lookup_realm = false
    dns_lookup_kdc = false
    forwardable = true

    ; for Windows 2008 with AES
    default_tgs_enctypes = aes256-cts-hmac-sha1-96 rc4-hmac des-cbc-crc des-cbc-md5
    default_tkt_enctypes = aes256-cts-hmac-sha1-96 rc4-hmac des-cbc-crc des-cbc-md5
    permitted_enctypes = aes256-cts-hmac-sha1-96 rc4-hmac des-cbc-crc des-cbc-md5

    [realms]
    G3.LOCAL = {
    kdc = michigan.g3.local
    admin_server = michigan.g3.local
    default_domain = g3.local
    }

    [domain_realm]
    .g3.local = G3.LOCAL
    g3.local = G3.LOCAL
    pam = {
    debug = false
    ticket_lifetime = 36000
    renew_lifetime = 36000
    forwardable = true
    krb4_convert = false
    }
    login = {
    krb4_convert = false
    krb4_get_ticket = false

    }

    Grato

    Glauco
    glaucojr@g3comercial.com.br

    ResponderExcluir
  41. Marcus,

    Outra informação é que na compilação do squid tive problemas com os parâmetros --enable-epoll e --disable poll que pelo que li no site do projeto squid está em desuso desde a versão 2.??. E tive também problemas com a compilação do parâmetro --enable-basic-auth-helpers com as opções "PAM" e --enable-external-acl-helpers "session". Só consegui compilar sem elas. Confesso que fiquei na dúvida em relação ao parâmetro PAM, as demais acredito pelo que pesquisei que não tem influência na utilização do Kerberos.
    Este problema de compilação tem ocorrido em muitas versões do squid com muitos usuários.
    Utilizo o Mandriva 2010.2 com kernel versão 2.6.33.7.

    O squid que veio na minha distribuição já tinha o parâmetro enable-negotiate-auth-helpers=squid_kerb_auth.

    O que não tinha é o --enable-stacktraces. Preciso deste segundo parâmetro mesmo?

    Aguardo um retorno breve.

    Obrigado.

    Glauco

    ResponderExcluir
  42. Marcus,

    Mais uma informação.
    Utilizei o kinit para fazer teste do kerberos no meu linux. Segue o que obtive.

    [root@ggssf_g3 squid]# kinit
    Password for administrador@G3.LOCAL:
    [root@ggssf_g3 squid]# klist
    Ticket cache: FILE:/tmp/krb5cc_0
    Default principal: administrador@G3.LOCAL

    Valid starting Expires Service principal
    07/10/12 08:14:49 07/10/12 14:54:49 krbtgt/G3.LOCAL@G3.LOCAL
    [root@ggssf_g3 squid]# klist -f
    Ticket cache: FILE:/tmp/krb5cc_0
    Default principal: administrador@G3.LOCAL

    Valid starting Expires Service principal
    07/10/12 08:14:49 07/10/12 14:54:49 krbtgt/G3.LOCAL@G3.LOCAL
    Flags: FIA

    Posso concluir que o kerberos está ok?
    Também coloquei o meu arquivo proxyuer.keytab em etc com o nome krb5.keytab

    Glauco

    ResponderExcluir
  43. Prezado Marcus,

    Bom dia!

    Talvez você possa me ajudar.
    Estamos tendo sérios problemas de performance com essa solução adotada, principalmente quando o cliente é o Windows 7.

    Nosso SO é o Red Hat EL 6.3 + win 2008 R2.

    Você tem alguma dica em relação a este problema?

    Desde já, MUITO obrigado!

    Att.,
    Fabiano

    ResponderExcluir
  44. Alguem Pode Me ajuda Nao Entendi Algumas regras do Blog sobre a autenticação SOu novo No linux mas ja tentei quase Tudo ldap_auth NT_auth etc... se alguem Puder me add skype ( fomezero5 ) ou Msn f0mezero@hotmail.com Obrigado

    ResponderExcluir
  45. Prezado Marcus,

    Executei o comando conforme esta no blog:
    ktpass -princ HTTP/proxy.srv2008.com.br@SRV2008.COM.BR -mapuser srv2008.com.br\squid -crypto All -mapop set -pass pass@123 -ptype KRB5_NT_SRV_HST -out c:\squid.keytab

    Mas eu obtive a seguinte mensagem de erro:
    ktpass:failed getting target domain for specified user.



    Após ler os posts vi que outro usuário teve o mesmo problema e você pediu para colocar o domínio netbios (srv2008\squid), a key foi gerada, porém o windows retornou uma mensagem de aviso:

    WARNING: pType and account type do not match. This might cause problems.

    Tem algum problema esta mensagem?????

    ResponderExcluir
    Respostas
    1. meu e-mail é:
      rodrigo.ultrazone@gmail.com

      Excluir