sábado, 5 de novembro de 2011

Autenticando Squid no AD 2003/2008 via Kerberos




Devido a problemas de segurança com NTLMv1 e incompatibilidade com NTLMv2, realizei um estudo para autenticação do squid com AD via kerberos (puro!), foi uma tarefa bastante árdua, encontrei bons tutorias mas nenhum completo, sempre faltava algum detalhe de configuração ou dependências.
Segue tutorial e para quem quiser saber mais detalhes vejam as referências no final, possuem informações bastante úteis.

Distro utilizada: CentoOS 6.0 / Red Hat 6.0 com Active Diretory 2003/2008

Instalação dos programas e suas dependências.

GCC
# yum install gcc

Squid
Tive um melhor funcionamento com versões 3.x
# yum install squid

Ldap
# yum install openldap openldap-devel openldap-servers cyrus-sasl-ldap openldap-clients python-ldap nss-pam-ldapd

Kerberos
# yum install krb5-auth-dialog krb5-devel krb5-libs krb5-server krb5-workstation pam_krb5

Cyrus
# yum install cyrus-sasl-gssapi

Utilitários
# yum install wget bind-utils telnet tcpdump

Copiar e colar
# yum install gcc squid openldap openldap-devel openldap-servers cyrus-sasl-ldap openldap-clients python-ldap nss-pam-ldapd krb5-auth-dialog krb5-devel krb5-libs krb5-server krb5-workstation pam_krb5 cyrus-sasl-gssapi bind-utils telnet tcpdump -y

Kerberos Ldap
Com este programa será possível leitura de grupos do AD.
# wget http://sourceforge.net/projects/squidkerbauth/files/squidkerbldap/squid_kerb_ldap-1.2.2/squid_kerb_ldap-1.2.2.tar.gz/download
# tar -xvzf squid_kerb_ldap-1.2.2.tar.gz -C /usr/local/src/
# cd /usr/local/src/
# ./configure && make && make install

Msktutil
Este é usado para criar o keytab. Em outros fóruns citaram o ktpass para criação direto no servidor windows, comigo não funcionou.
# wget http://pkgs.repoforge.org/msktutil/msktutil-0.3.16.4-1.el6.rf.i686.rpm
# rpm -ivh msktutil-0.3.16.4-1.el6.rf.i686.rpm

Configurações
Nome do Dominio - lablinux.lan
Nome do servidor CentOS – squid
Nome do servidor AD - srv2003
Não existe firewall entre os servidores.
Selinux desabilitado.

IP AD: 10.10.10.1
IP SQUID: 10.10.10.2

# nslookup squid
Server:         10.10.10.1
Address:        10.10.10.1#53
Name:   squid.lablinux.lan
Address: 10.10.10.2

# nslookup 10.10.10.2
Server:         10.10.10.1
Address:        10.10.10.1#53
2.10.10.10.in-addr.arpa name = squid.lablinux.lan.

# cat /etc/hosts
127.0.0.1   localhost
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
10.10.10.1  srv2003.lablinux.lan lablinux.lan srv2003
10.10.10.2  squid.lablinux.lan squid

# cat /etc/resolv.conf
search lablinux.lan
nameserver 10.10.10.1

Os nomes dos servidores deverão estar cadastrados em um servidor dns, neste caso estou utilizando o DNS do servidor AD.

Kerberos
O arquivo /etc/krb5.conf
Atenção para os nomes com letras MAIÚSCULAS.

[libdefaults]
default_realm = LABLINUX.LAN
dns_lookup_realm = false
dns_lookup_kdc = false
ticket_lifetime = 24h
forwardable = yes
default_keytab_name = /etc/squid/HTTP.keytab
kdc_timesync = 1
ccache_type = 4
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 windos 2008
#default_tkt_enctypes = arcfour-hmac-md5 des-cbc-crc des-cbc-md5
#default_tgs_enctypes = arcfour-hmac-md5 des-cbc-crc des-cbc-md5
[realms]
LABLINUX.LAN = {
kdc = srv2003.lablinux.lan
default_domain = LABLINUX.LAN
admin_server = srv2003.LABLINUX.LAN
}
[domain_realm]
.lablinux.lan = LABLINUX.LAN
lablinux.lan = LABLINUX.LAN
[appdefaults]
pam = {
debug = false
ticket_lifetime = 36000
renew_lifetime = 36000
forwardable = true
krb4_convert = false
}
[logging]
default = FILE:/var/log/krb5libs.log
kdc = FILE:/var/log/krb5kdc.log
admin_server = FILE:/var/log/kadmind.log

SQUID

#Parametro para autenticação de usuários
auth_param negotiate program /usr/bin/squid_kerb_auth -d -i -s HTTP/squid.lablinux.lan@LABLINUX.LAN
auth_param negotiate children 5
auth_param negotiate keep_alive on

#Parametro para leitura de grupo no AD
external_acl_type grupo_internet ttl=3600 negative_ttl=3600 %LOGIN /usr/local/bin/squid_kerb_ldap -i -g internet -D LABLINUX.LAN -S srv2003.lablinux.lan@lablinux.lan

#Autenticação individual
acl autenticados proxy_auth REQUIRED
http_access allow autenticados

#Autenticação por grupo
acl site dstdomain www.terra.com.br (ou um arquivo com relação dos sites)
acl grupo external grupo_internet
http_access allow grupo site

Também configurei para não fazer cache das autenticações pois degradou muito performance do servidor.
No arquivo de inicialização do squid adicionar:

#vi /etc/init.d/squid

PATH=/usr/bin:/sbin:/bin:/usr/sbin
export PATH

KRB5RCACHETYPE=none
export KRB5RCACHETYPE


Integrando squid com AD

# kinit -V administrador
Password for administrador@LABLINUX.LAN:

Criando o keytab:
# msktutil -c -b "CN=COMPUTERS" -s HTTP/squid.lablinux.lan -h squid.lablinux.lan -k /etc/squid/HTTP.keytab --computer-name squid --upn HTTP/squid.lablinux.lan --server srv2003.lablinux.lan --verbose


Dar permissão para o usuário squid
#chown squid /etc/squid/HTTP.keytab
Após este comando deverá ser criado o arquivo HTTP.keytab dentro do diretório /etc/squid.
Este arquivo será utilizado para o squid verificar no AD a autenticidade do usuário na rede.

Testando as configurações

[root@squid etc]# klist -ek
Keytab name: WRFILE:/etc/squid/HTTP.keytab
KVNO Principal
---- --------------------------------------------------------------------------
  2 HTTP/squid.lablinux.lan@LABLINUX.LAN (DES cbc mode with CRC-32)
  2 HTTP/squid.lablinux.lan@LABLINUX.LAN (DES cbc mode with RSA-MD5)
  2 HTTP/squid.lablinux.lan@LABLINUX.LAN (ArcFour with HMAC/md5)


[root@squid etc]# kinit -V -k -t /etc/squid/HTTP.keytab HTTP/squid.lablinux.lan
Authenticated to Kerberos v5

[root@squid etc]# kvno HTTP/squid.lablinux.lan@LABLINUX.LAN
HTTP/squid.lablinux.lan@LABLINUX.LAN: kvno = 2

Reparem os números em vermelho, caso estejam diferentes apagar o computador do AD e cadastrar novamente no domínio.

Testar leitura de grupo no AD

#/usr/local/bin/squid_kerb_ldap -i -g internet -N host/squid.lablinux.lan@LABLINUX.LAN -D LABLINUX.LAN -S srv2003.lablinux.lan@lablinux.lan
Digitar um usuário do grupo internet <Enter>

Configurando o browser
É necessário configurar o proxy com o nome completo do servidor(FQDN):
squid.lablinux.lan, caso contrário não irá funcionar.

O IE6 não suporta este metodo de autenticação.
Realizei testes com IE7, chrome e firefox com sucesso.

Erros e soluções
Os erros são logados no arquivo cache.log do squid e para isso é necessário que no aquivo de configuração do squid.conf tenha a opção “-d”.

auth_param negotiate program /usr/bin/squid_kerb_auth -d -i -s
HTTP/squid.lablinux.lan@LABLINUX.LAN


2010/11/24 16:20:20| squid_kerb_auth: gss_acquire_cred() failed: Unspecified GSS failure. Minor code may provide
more information. Permission denied
2010/11/24 16:20:20| authenticateNegotiateHandleReply: Error validating user via Negotiate. Error returned 'BH
gss_acquire_cred() failed: Unspecified GSS failure. Minor code may provide more information. Permission denied

O aquivo HTTP.keytab não tem como dono o usuário squid.

2010/11/24 16:03:38| squid_kerb_auth: gss_accept_sec_context() failed: Unspecified GSS failure. Minor code may
provide more information. Key version number for principal in key table is incorrect
2010/11/24 16:03:37| authenticateNegotiateHandleReply: Error validating user via Negotiate. Error returned 'BH
gss_accept_sec_context() failed: Unspecified GSS failure. Minor code may provide more information. Key version
number for principal in key table is incorrect'

Versão da chave (keytab) está diferente com o servidore AD.
O keytab deverá ser apagado e criado novamente com o comando msktutil, caso o erro persita
será necessário apagar a maquina do AD e criar o keytab novamente.

As versões podem ser visualizadas com os comando abaixo:
# klist -ek
Keytab name: FILE:/etc/squid/HTTP.keytab
KVNO Principal
---- --------------------------------------------------------------------------
3 HTTP/squid.lablinux.lan@LABLINUX.LAN (DES cbc mode with CRC-32)
# kvno HTTP/squid.lablinux.lan@LABLINUX.LAN
HTTP/squid.lablinux.lan@LABLINUX.LAN: kvno = 3

Mais erros podem ser encontrado no link abaixo:

Referências:

29 comentários:

  1. Muito legal Willian, parabens, vou tirar um tempinho e tentar botar para funcionar aqui.

    ResponderExcluir
  2. Usando o squid_kerb_auth o usuário tem que digitar usuário e senha?

    Ou funciona igual ao NTLM ?

    ResponderExcluir
    Respostas
    1. Olace,

      O usuário não precisará digitar usuário e senha, a autenticação é realizada via ticket kerberos.

      Caso peça é porque existe algum erro de configuração ou aplicação não suporta autenticação via kerberos. Um exemplo é o skype.

      Nesta configuração não é utilizado o NTLM.

      Excluir
  3. Funcionou perfeitamente !!! Parabéns Willian !

    ResponderExcluir
    Respostas
    1. Que bacana Alexandre, o principal objetivo é este mesmo. Caso tenha algum diferencial de configuração ou novos questionamentos favor compartilhar.

      Obrigado.

      Excluir
  4. Funciona com proxy transparente ? Tentei aqui inicialmente e não foi...

    ResponderExcluir
  5. Ele simplesmente passa por todas as regras e para na minha ultima acl que eh http_access deny all.

    ResponderExcluir
    Respostas
    1. O squid em modo transparente não é possível utilizar autenticação, no site do squid-cache tem mais detalhes, segue link:

      http://wiki.squid-cache.org/Features/Authentication#Authentication_in_interception_and_transparent_modes

      Excluir
  6. Olá sou novo em Linux, mas otimo how to parabéns, dos que li sem duvida o melhor mas estou com problema meu squid parou de funcionar e da esse erro:
    squid: ERROR: Could not send signal 1 to process 1522: (3) No such process.
    poderia passar um squid.conf de exemplo por favor ainda estou estudando ele. abraços

    ResponderExcluir
    Respostas
    1. BMX,

      Encontrei este link que fala sobre o seu erro.

      http://www.vivaolinux.com.br/dica/squid-ERROR-no-running-copy

      Excluir
  7. Willian,
    Segue todo a dica e quando testo o acesso o squid da o seguinte erro no log
    squid_kerb_auth: WARNING: received type 1 NTLM token
    2012/09/25 14:30:42| authenticateNegotiateHandleReply: Error validating user via Negotiate. Error returned 'BH received type 1 NTLM token'

    O que pode ser isso?
    É necessário colocar a maquina no dominio do AD? e quanto ao samba é necessário?
    Grato
    Douglas

    ResponderExcluir
    Respostas
    1. LEgal,

      É necessário que a estação "windows" esteja no domínio do AD, caso já esteja é normal que apareça alguns mensagens como essa no cache.log.
      Possivelmente algum programa na máquina esteja tentando autenticar ser via NTLM.
      Está solução não usa o samba, porém, caso seu proxy esteja junto com o samba, e este no domínio do AD terá problemas.
      Quanto aos testes de configuração, funcionaram?

      Excluir
  8. Olá, Willian!

    Verifiquei que seu post está muito semelhante ao publicado em http://mapburghardt.blogspot.com.br/2010/06/squid-ad-kerberos-uma-solucao-decente.html

    Observando as datas, esse acima existe a mais tempo. Acho que seria legal da sua parte colocar esse link nas referências.

    Até!

    ResponderExcluir
    Respostas
    1. Pessoal,

      Não usei o link como referência para criação deste artigo. O link já está nos comentários do blog para quem quiser consultar.
      Ele usou o ktpass para criação do ticket, como eu disse, não consegui fazer funcionar.

      Excluir
  9. Olá Willian!


    Preciso implementar uma solução que autentique no AD ou no BD do Squid (squid_passwd), via ncsa.

    Resumindo, se não autenticar no AD, autentique usando a base do squid_passwd.

    O problema é que a maioria das pessoas onde trabalho não tem login no AD, e sim no Squid.

    Poderia me dá uma ideia ou já implementou algo parecido?

    Abs.

    Daniel.

    ResponderExcluir
    Respostas
    1. Daniel,

      Não cheguei a implementar algo parecido, mas realizei um teste e aparentemente funcionou utilizando as duas autenticações, segue como ficou o squid.conf que testei:
      #Parametros Kerberos.
      auth_param negotiate program /usr/bin/squid_kerb_auth -d -i -s HTTP/squid.lablinux.lan@LABLINUX.LAN
      auth_param negotiate children 5
      auth_param negotiate keep_alive on

      #Grupo com acesso a internet
      external_acl_type grupo_internet ttl=3600 negative_ttl=3600 %LOGIN /usr/local/bin/squid_kerb_ldap -i -g internet
      \ -D LABLINUX.LAN -S srv2003.lablinux.lan@lablinux.lan

      #Parametros NCSA
      auth_param basic program /usr/lib64/squid/ncsa_auth /etc/squid/passwd
      auth_param basic children 5
      auth_param basic realm Squid proxy-caching web server
      auth_param basic credentialsttl 2 hours
      auth_param basic casesensitive off

      #NCSA
      acl ncsa_users proxy_auth REQUIRED
      http_access allow ncsa_users

      #Grupo
      acl grupo external grupo_internet
      http_access allow grupo

      Acredito que em seu ambiente seja mais fácil validar a configuração acima.
      Nos informe os resultados.

      Abraço.

      Excluir
  10. Estou tentando montar, mas tem algumas coisas diferentes, será que poderia me ajudar ? o kvno = 3, este é 1, não fica igual a 2, ja removi o copmutador do AD, mas mesmo assim não se acerta. Grato Everson Silva

    ResponderExcluir
    Respostas
    1. Everson,

      Este é o valor da versão do keytab, como está criando pela primeira vez o valor será 1, caso execute o comando novamente para criação do keytab será 2 e assim por diante.
      O importante é que a versão do keytab deve estar igual ao do AD, que podem ser verificados conforme abaixo:

      # klist -ek
      Keytab name: FILE:/etc/squid/HTTP.keytab
      KVNO Principal
      ---- --------------------------------------------------------------------------
      3 HTTP/squid.lablinux.lan@LABLINUX.LAN (DES cbc mode with CRC-32)
      # kvno HTTP/squid.lablinux.lan@LABLINUX.LAN
      HTTP/squid.lablinux.lan@LABLINUX.LAN: kvno = 3

      Abraço!

      Excluir
  11. Estou com dificuldades para implementar no win2008 R2, se alguém conseguiu e puder me adicionar no skype para me dar uma força, ficarei grato. skype: eveban

    ResponderExcluir
    Respostas
    1. Everson,

      Quais as dificuldades que estão ocorrendo. Atualmente tenho um cliente com 2008 R2 em funcionamento normal.

      Excluir
  12. Willian, parabéns pelo blog.
    Obrigado por toda a atenção fornecida e o suporte que foi dado.
    Esta funcionando perfeitamente, foi difícil achar algo bem detalhado igual ao seu. Realmente esta de parabéns.

    ResponderExcluir
    Respostas
    1. Obrigado Everson, qualquer dúvida posta aqui no blog.

      Abraço!

      Excluir
  13. Olá voce sabe me informar o significado dos parametros -i e -s dessa linha de configuraçao: auth_param negotiate program /usr/bin/squid_kerb_auth -d -i -s
    HTTP/squid.lablinux.lan@LABLINUX.LAN?

    ResponderExcluir
    Respostas
    1. Opa,

      O "-i" é para gerar informações no cache.log do squid, leitura de grupo e autenticação de usuário, o "-s" para o principal name, no meu caso "HTTP/squid.lablinux.lan@LABLINUX.LAN"

      Excluir
  14. ola! na linha ext_acl_type, o "grupo_internet" é o que?
    outra: uso squid 3.3.8, e não possuo os arquivos squid_kerb_auth e nem squid_kerb_ldap. dentro de /usr/lib/squid3/ tenho negotiate_kerberos_auth e negotiate_wrapper_auth

    ResponderExcluir
    Respostas
    1. Marcelo, estes binários não são instalados por padrão, é necessário fazer o download, os links estão no início do artigo.

      Excluir
  15. quando vc cria o keytab, o que é aquele "CN=COMPUTERS" ????

    ResponderExcluir
    Respostas
    1. É o RDN padrão no AD para cadastro dos computadores do domínio.

      Excluir

Em breve responderemos seu comentário.