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
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.
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
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:
Muito legal Willian, parabens, vou tirar um tempinho e tentar botar para funcionar aqui.
ResponderExcluirUsando o squid_kerb_auth o usuário tem que digitar usuário e senha?
ResponderExcluirOu funciona igual ao NTLM ?
Olace,
ExcluirO 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.
Funcionou perfeitamente !!! Parabéns Willian !
ResponderExcluirQue bacana Alexandre, o principal objetivo é este mesmo. Caso tenha algum diferencial de configuração ou novos questionamentos favor compartilhar.
ExcluirObrigado.
Funciona com proxy transparente ? Tentei aqui inicialmente e não foi...
ResponderExcluirEle simplesmente passa por todas as regras e para na minha ultima acl que eh http_access deny all.
ResponderExcluirO squid em modo transparente não é possível utilizar autenticação, no site do squid-cache tem mais detalhes, segue link:
Excluirhttp://wiki.squid-cache.org/Features/Authentication#Authentication_in_interception_and_transparent_modes
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:
ResponderExcluirsquid: 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
BMX,
ExcluirEncontrei este link que fala sobre o seu erro.
http://www.vivaolinux.com.br/dica/squid-ERROR-no-running-copy
Willian,
ResponderExcluirSegue 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
LEgal,
ExcluirÉ 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?
Olá, Willian!
ResponderExcluirVerifiquei 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é!
Pessoal,
ExcluirNã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.
Olá Willian!
ResponderExcluirPreciso 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.
Daniel,
ExcluirNã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.
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
ResponderExcluirEverson,
ExcluirEste é 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!
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
ResponderExcluirEverson,
ExcluirQuais as dificuldades que estão ocorrendo. Atualmente tenho um cliente com 2008 R2 em funcionamento normal.
Willian, parabéns pelo blog.
ResponderExcluirObrigado 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.
Obrigado Everson, qualquer dúvida posta aqui no blog.
ExcluirAbraço!
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
ResponderExcluirHTTP/squid.lablinux.lan@LABLINUX.LAN?
Opa,
ExcluirO "-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"
ola! na linha ext_acl_type, o "grupo_internet" é o que?
ResponderExcluiroutra: 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
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.
Excluirquando vc cria o keytab, o que é aquele "CN=COMPUTERS" ????
ResponderExcluirÉ o RDN padrão no AD para cadastro dos computadores do domínio.
ExcluirParabéns ,, muito bacana post
ResponderExcluir