rafamagalhaes
(usa Ubuntu)
Enviado em 30/03/2012 - 10:37h
Estou seguindo um tutorial que achei na internet na página
http://mapburghardt.blogspot.com.br/2010/06/squid-ad-kerberos-uma-solucao-decente.html segue abaixo:
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-act...
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...
Porém, me deparei com um erro que não estou conseguindo resolver.
Na parte "Compilando módulo de consulta em grupos por Kerberos" ocorreu o seguinte erro:
root@msolbhzvpx01:~/squid_kerb_ldap-1.2.1a# make
make all-recursive
make[1]: Entrando no diretório `/root/squid_kerb_ldap-1.2.1a'
make[2]: Entrando no diretório `/root/squid_kerb_ldap-1.2.1a'
gcc -DHAVE_CONFIG_H -I. -g -O2 -Wall -Wno-unknown-pragmas -Wextra -Werror -Wcomment -Wpointer-arith -Wcast-align -Wwrite-strings -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wdeclaration-after-statement -Wshadow -MT support_ldap.o -MD -MP -MF .deps/support_ldap.Tpo -c -o support_ldap.o support_ldap.c
support_ldap.c:33:39: erro: unknown type name âLDAPâ
support_ldap.c:34:48: erro: unknown type name âLDAPâ
support_ldap.c:36:1: erro: unknown type name âLDAPâ
support_ldap.c:50:45: erro: unknown type name âLDAPâ
support_ldap.c:50:55: erro: unknown type name âLDAPMessageâ
support_ldap.c:51:47: erro: unknown type name âLDAPâ
support_ldap.c:170:3: erro: #error "No rebind functione defined"
support_ldap.c:277:39: erro: unknown type name âLDAPâ
support_ldap.c:328:47: erro: unknown type name âLDAPâ
support_ldap.c:454:48: erro: unknown type name âLDAPâ
support_ldap.c: Na função âldap_set_ssl_defaultsâ:
support_ldap.c:558:10: erro: âLDAP_SUCCESSâ undeclared (first use in this function)
support_ldap.c:558:10: nota: each undeclared identifier is reported only once for each function it appears in
support_ldap.c:485:45: erro: unused parameter âmargsâ [-Werror=unused-parameter]
support_ldap.c: No nivel superior:
support_ldap.c:561:44: erro: unknown type name âLDAPâ
support_ldap.c:561:53: erro: unknown type name âLDAPMessageâ
support_ldap.c:648:1: erro: unknown type name âLDAPâ
support_ldap.c: Na função âtool_ldap_openâ:
support_ldap.c:649:5: erro: unknown type name âLDAPâ
support_ldap.c:705:7: erro: implicit declaration of function âldap_initâ [-Werror=implicit-function-declaration]
support_ldap.c:705:10: erro: assignment makes pointer from integer without a cast [-Werror]
support_ldap.c:707:7: erro: implicit declaration of function âldap_set_defaultsâ [-Werror=implicit-function-declaration]
support_ldap.c:708:17: erro: âLDAP_SUCCESSâ undeclared (first use in this function)
support_ldap.c:709:9: erro: implicit declaration of function âldap_err2stringâ [-Werror=implicit-function-declaration]
support_ldap.c:709:9: erro: formato â%sâ expects argument of type âchar *â, but argument 5 has type âintâ [-Werror=format]
support_ldap.c:710:9: erro: implicit declaration of function âldap_unbindâ [-Werror=implicit-function-declaration]
support_ldap.c:723:11: erro: formato â%sâ expects argument of type âchar *â, but argument 5 has type âintâ [-Werror=format]
support_ldap.c: Na função âget_memberofâ:
support_ldap.c:811:3: erro: unknown type name âLDAPâ
support_ldap.c:812:3: erro: unknown type name âLDAPMessageâ
support_ldap.c:971:7: erro: implicit declaration of function âldap_simple_bind_sâ [-Werror=implicit-function-declaration]
support_ldap.c:972:17: erro: âLDAP_SUCCESSâ undeclared (first use in this function)
support_ldap.c:973:2: erro: formato â%sâ expects argument of type âchar *â, but argument 5 has type âintâ [-Werror=format]
support_ldap.c:981:7: erro: implicit declaration of function âldap_set_rebind_procâ [-Werror=implicit-function-declaration]
support_ldap.c:981:32: erro: âldap_simple_rebindâ undeclared (first use in this function)
support_ldap.c:1011:3: erro: implicit declaration of function âcheck_ADâ [-Werror=implicit-function-declaration]
support_ldap.c:1013:5: erro: formato â%sâ expects argument of type âchar *â, but argument 5 has type âintâ [-Werror=format]
support_ldap.c:1035:3: erro: implicit declaration of function âldap_search_ext_sâ [-Werror=implicit-function-declaration]
support_ldap.c:1035:37: erro: âLDAP_SCOPE_SUBTREEâ undeclared (first use in this function)
support_ldap.c:1042:5: erro: formato â%sâ expects argument of type âchar *â, but argument 5 has type âintâ [-Werror=format]
support_ldap.c:1050:5: erro: implicit declaration of function âldap_count_entriesâ [-Werror=implicit-function-declaration]
support_ldap.c:1055:7: erro: implicit declaration of function âget_attributesâ [-Werror=implicit-function-declaration]
support_ldap.c:1101:9: erro: implicit declaration of function âsearch_group_treeâ [-Werror=implicit-function-declaration]
support_ldap.c:1127:5: erro: implicit declaration of function âldap_msgfreeâ [-Werror=implicit-function-declaration]
support_ldap.c:1245:5: erro: formato â%sâ expects argument of type âchar *â, but argument 5 has type âintâ [-Werror=format]
support_ldap.c: Na função âldap_set_ssl_defaultsâ:
support_ldap.c:559:1: erro: control reaches end of non-void function [-Werror=return-type]
cc1: todos os avisos devem ser tratados como erros
make[2]: ** [support_ldap.o] Erro 1
make[2]: Saindo do diretório `/root/squid_kerb_ldap-1.2.1a'
make[1]: ** [all-recursive] Erro 1
make[1]: Saindo do diretório `/root/squid_kerb_ldap-1.2.1a'
make: ** [all] Erro 2
Como posso resolver isso?