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: