Squid com Ntlm autenticando no AD
26/01/2009 13:53 SQUID AUTENTICADO NO ACTIVE DIRECTORY
Squid é um proxy-cache de alta performance para clientes web, suportando protocolos FTP, gopher e HTTP.
O Squid mantém meta dados e especialmente objetos armazenados na RAM, cacheia buscas de DNS e implementa cache negativo de requests falhos.
Ele suporta SSL, listas de acesso complexas e logging completo. Por utilizar o Internet Cache Protocol, o Squid pode ser configurado para trabalhar de forma hierárquica ou mista para melhor aproveitamento da banda.
Podemos executar o Squid nas principais plataformas do mercado, como Linux, Unixes e Windows.
- Sistema Operacional: Linux
Instalando Servidor Squid no Debian GNU/Linux
Instale o servidor Squid através dos repositórios do Debian. Caso desejar poderá instalar o squid através do fonte.
# apt-get install squid
Configuração do Squid
Após a instalação do Squid você deverá configurar o arquivo /etc/squid.conf da seguinte maneira:
Faça um backup do arquivo de configuração por segurança:
# cd /etc
# cp squid.conf squid.conf.original
Em especial o arquivo squid.conf vem com uma espécie de manual em seu arquivo de configuração, deixando esse arquivo muito extenso para uma compreensão administrativa. É recomendado que você elimine linhas que não irão fazer parte da configuração principal.
# grep –v ^# squid.conf.original | uniq > squid.conf
Arquivo padrão do squid:
# cat squid.conf
hierarchy_stoplist cgi-bin ?
acl QUERY urlpath_regex cgi-bin \?
no_cache deny QUERY
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
refresh_pattern ^ftp: 1440 20% 10080
refresh_pattern ^gopher: 1440 0% 1440
refresh_pattern . 0 20% 4320
acl all src 0.0.0.0/0.0.0.0
acl manager proto cache_object
acl localhost src 127.0.0.1/255.255.255.255
acl to_localhost dst 127.0.0.0/8
acl SSL_ports port 443 563
acl Safe_ports port 80 # http
acl Safe_ports port 21 # ftp
acl Safe_ports port 443 563 # https, snews
acl Safe_ports port 70 # gopher
acl Safe_ports port 210 # wais
acl Safe_ports port 1025-65535 # unregistered ports
acl Safe_ports port 280 # http-mgmt
acl Safe_ports port 488 # gss-http
acl Safe_ports port 591 # filemaker
acl Safe_ports port 777 # multiling http
acl CONNECT method CONNECT
http_access allow manager localhost
http_access deny manager
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow localhost
http_reply_access allow all
icp_access allow all
coredump_dir /var/spool/squid
#Local onde será armazenado o cache do squid
cache_dir ufs /var/spool/squid 24576 16 256
#Local onde será guardado os logs do squid
cache_access_log /var/log/squid/access.log
#Converte as mensagens geradas pelo squid para o Português
error_directory /usr/share/squid/errors/Portuguese
#Nome do seu servidor (sem espaços)
visible_hostname squid.dominio.com.br
Integrando o Linux no Active Directory
Você deverá realizar algumas configurações para que seu sistema Linux enxergue o Active Directory.
Instale os pacotes responsáveis pela integração:
# apt-get install winbind krb5-clients krb5-user krb5-config krb5-kdc
1.Configurando o Kerberos
O Kerberos é o serviço responsável pela comunicação Active Directory e Linux, você precisará indicar no arquivo de configuração qual é a base AD.
Altere as seguintes linhas em negrito:
# vi /etc/krb5.conf
[libdefaults]
ticket_lifetime = 24000
default_realm = DOMINIO_AD
default_tgs_enctypes = des3-hmac-sha1 des-cbc-crc
default_tkt_enctypes = des3-hmac-sha1 des-cbc-crc
permitted_enctypes = des3-hmac-sha1 des-cbc-crc
dns_lookup_realm = false
dns_lookup_kdc = false
kdc_req_checksum_type = 2
checksum_type = 2
ccache_type = 1
forwardable = true
proxiable = true
[realms]
DOMINIO_AD = {
kdc = <IP DO AD>
default_domain = dominio_ad
}
[domain_realm]
.dominio_ad = DOMINIO_AD
1.Configurando o Samba
O Squid usuário o recurso do winbind para realizar as consultas no AD, por esse motivo temos que configurar o Samba-Winbind.
Edite o arquivo smb.conf para especificar os parâmetros do AD:
# vi /etc/samba/smb.conf
[global]
workgroup = DOMINIOAD
netbios name = <hostname>
server string = Server
unix charset = LOCALE
log file = /var/log/samba/log.%m
max log size = 50
log level = 2
map to guest = bad user
security = ADS
password server = <IP do AD>
realm = DOMINIO_AD
encrypt passwords = yes
smb passwd file = /etc/samba/smbpasswd
winbind uid = 10000-20000
winbind gid = 10000-20000
winbind separator = /
winbind use default domain = yes
socket options = TCP_NODELAY SO_RCVBUF=8192 SO_SNDBUF=8192
1.Configurando o nsswitch.conf
O nsswitch.conf é o arquivo responsável por indicar quais bases de usuários o sistema irá checar. Temos que configurá-lo para enxergar a base do winbind que estará se comunicando com o AD.
OBS: ESSE ITEM É OPCIONAL, NÃO INTERFERINDO A SOLUÇÃO PROXY+AD
Altere as seguintes linhas:
# vi /etc/nsswitch.conf
passwd: files winbind
shadow: files winbind
group: files winbind
Reinicie os serviços:
# /etc/init.d/samba restart
# /etc/init.d/winbind restart
Teste a autenticação no AD com um comando do kerberos:
# kinit user@DOMINIO_AD
Password for admin@DOMINIO_AD:
Caso não retorne nada nesse comando siginifica que a comunicação com o AD foi bem sucedida.
Em seguida vamos adicionar o nosso servidor samba ao domínio AD, com o comando:
# net ads join
Using short domain name – DOMINIO_AD
Joined '<HOSTNAM>' to realm 'DOMINIO_AD'
Você poderá estar checando no Active Directory se a máquina realmente consta como participante do domínio, ou checar pelo comando net:
# net ads testjoin
Join is OK
Após inserir a máquina no domínio você já será capaz de realizar consultas em toda a Base AD:
# net ads info
LDAP server: <IP DO AD>
LDAP server name: HOSTNAME_AD
Realm: DOMINIO_AD
Bind Path: dc=DOMINIO,dc=AD
LDAP port: 389
Server time: Wed, 16 Aug 2006 09:04:40 GMT
KDC server: <IP DO AD>
Server time offset: 2
# net ads user
... Listagem dos usuários do AD
# net ads group
.... Listagem dos grupos do AD
Agora temos que checar se o Samba-Winbind está conseguindo se comunicar com o AD pois o squid irá usar exatamente esse módulo para realizar a autenticação.
Vamos primeiramente setar o usuário e a senha que o winbind irá utilizar para realizar as pesquisas, com o comando:
# wbinfo --set-auth-user=<usuario administrador>%'<senha>'
Reinicie o winbind, após isto, vamos realizar os testes. Tudo já deverá estar funcional, para testar, utilize os comandos:
# wbinfo -u
...(Lista os usuários)
# wbinfo -t
checking the trust secret via RPC calls succeeded
...(Testa se o secret está ok)
# wbinfo -g
...(Lista os grupos)
Esse comandos só irão funcionar caso tenha configurado o nsswitch.conf
# getent group
...(Lista os grupos)
# getent passwd
...(Lista os usuários)
Se todos os passos acima foram executados com sucesso, você poderá integrar o squid sem problemas.
Integrando o Squid no Active Directory de forma transparente
É importante ressaltar que os passos abaixo só terão sucesso, caso sua comunicação com o Active Directory já esteja funcionando corretamente.
Edite o arquivo de configuração do squid para deixá-lo como o exemplo abaixo:
OBS: Muitas Linhas desse arquivo são padrão, altere apenas as linhas que estão relacionadas com a autenticação. Elas estarão destacadas para melhor visualização.
# vi /etc/squid/squid.conf
hierarchy_stoplist cgi-bin ?
acl QUERY urlpath_regex cgi-bin \?
no_cache deny QUERY
auth_param ntlm program /usr/bin/ntlm_auth --helper-protocol=squid-2.5-ntlmssp
auth_param ntlm use_ntlm_negotiate off
auth_param ntlm children 5
auth_param ntlm max_challenge_reuses 0
auth_param ntlm max_challenge_lifetime 5 minutes
auth_param basic program /usr/bin/ntlm_auth --helper-protocol=squid-2.5-basic
auth_param basic children 5
auth_param basic realm "Controle de Acesso Web"
auth_param basic credentialsttl 2 hours
auth_param basic casesensitive off
refresh_pattern ^ftp: 1440 20% 10080
refresh_pattern ^gopher: 1440 0% 1440
refresh_pattern . 0 20% 4320
acl all src 0.0.0.0/0.0.0.0
acl manager proto cache_object
acl localhost src 127.0.0.1/255.255.255.255
acl rede src 192.168.0.0/255.255.255.0
acl to_localhost dst 127.0.0.0/8
acl SSL_ports port 443 563
acl Safe_ports port 80 # http
acl Safe_ports port 21 # ftp
acl Safe_ports port 443 563 # https, snews
acl Safe_ports port 70 # gopher
acl Safe_ports port 210 # wais
acl Safe_ports port 1025-65535 # unregistered ports
acl Safe_ports port 280 # http-mgmt
acl Safe_ports port 488 # gss-http
acl Safe_ports port 591 # filemaker
acl Safe_ports port 777 # multiling http
acl CONNECT method CONNECT
http_access allow manager localhost
http_access deny manager
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
## Sites Liberados por Grupo do Active Directory
acl SitesNegados dstdomain "/etc/squid/ACLS/sites-group_ad"
## ACLS EXTERNAS DE GRUPOS DO Active Directory
external_acl_type nt_group %LOGIN /usr/lib/squid/wbinfo_group.pl
# Neste Arquivo terá a lista dos grupos que poderão acessar a net.
acl AllowGroupAD external nt_group "/etc/squid/ACLS/allow-group_ad"
http_access allow AllowGroupAD !SitesNegados
http_access allow localhost
http_access deny rede
http_reply_access allow all
icp_access allow all
cache_dir ufs /var/spool/squid 24576 16 256
coredump_dir /var/spool/squid
visible_hostname hostname.dominio
Após alterar o arquivo ainda precisamos realizar algumas configurações que foram especificadas no squid.conf.
Linhas Importantes do squid.conf
acl SitesNegados dstdomain "/etc/squid/ACLS/sites-group_ad"
Temos que criar um arquivo em /etc/squid/ACLS/sites-group_ad com os domínios que serão negados para os usuários.
# mkdir /etc/squid/ACLS/
# vi sites-group_ad
orkut.com
uol.com.br
hotmail.com
external_acl_type nt_group %LOGIN /usr/lib/squid/wbinfo_group.pl
Essa linha é obrigatória para que o squid possa carregar o módulo NTLM com o WinBind.
acl AllowGroupAD external nt_group "/etc/squid/ACLS/allow-group_ad"
Esse arquivo deverá conter os nomes do grupos que estão cadastrados no Active Directory que terão acesso a internet. Todos os usuários pertencentes aos grupos definido nesse arquivo poderão navegar na internet assim que se logarem no AD através do Windows.
# vi /etc/squid/ACLS/allow-group_ad
"Grupo_AD"
"Domain Admins"
Você poderá criar várias regras de acesso a internet. Esse tutorial não tem a função de te auxiliar na construção das ACLS e sim na autenticação do squid no active directory de forma transparente para o usuário.
IMPORTANTE:
Ao configurar esse tipo de integração no Squid, você precisa dar permissão para o usuário do squid (proxy) acessar o socket do Winbind, para que o mesmo possa realizar as consultas de usuários e grupos.
# chown root.proxy /var/run/samba/winbindd_privileged
Reinicie o squid e cheque os arquivos de LOG.
# /etc/init.d/squid restart
Arquivos de LOG
Para checar erros do Samba-WinBind
# tail -f /var/log/samba/log.winbindd
Para checar possíveis erros nos parâmetros do squid:
# tail -f /var/log/squid/cache.log
Para checar o acesso autenticado do squid
# tail -f /var/log/squid/access.log
Comandos Administrativos
Para a solução Squid NTLM integrado no AD, é fundamental que o Servidor Squid esteja corretamente ingressado no Active Directory, para checar essa conectividade utilize os seguintes comandos:
# kinit squid@DOMINIO
O comando kinit irá pedir a senha do usuário que deverá existir no AD com permissão de administrador, pois ele irá fazer consultas no AD quando os usuários solicitarem navegação.
Os dois erros mais comuns desse comando são:
Erro de Sicronização de Hora: O Servidor Squid e o AD devem estar com o mesmo horário e fuso horário.
Erro de Autenticação e Privilégio: Caso o usuário não exista, ou a senha tenha sido digitada errada, esse comando não terá sucesso.
Caso o mesmo tenha sido executado sem retornar erros, você terá que checar se a máquina Squid tem a conta de máquina cadastrada no AD:
# net ads testjoin
Join is OK
Caso não tenha obtido sucesso no comando acima, você pode tentar ingressar a máquina novamente:
# net ads join
Ao executar o comando acima, se a conta já existir no AD, você receberá um retorno semelhante a esse, dizendo apenas que a conta já existe e confirmando a mesma.
# net ads join
[2007/05/07 16:04:49, 0] libads/ldap.c:ads_add_machine_acct(1405)
ads_add_machine_acct: Host account for hostname already exists - modifying old account
Using short domain name -- DOMINIO
Joined 'HOSTNAME' to realm 'DOMINIO'
Para checar se o Linux está conseguindo consultar os grupos e usuários do AD através do Winbind execute:
# wbinfo -g
É IMPORTANTE LEMBRAR QUE SEMPRE QUE HOUVER ALTERAÇÕES NO AD, VOCÊ PRECISARÁ REINICAR O SERVIÇO WINBIND PARA QUE O MESMO POSSA ATUALIZAR.
Checar a Comunicação com o AD
# ldapsearch -x -h 192.168.0.1 -D "cn=user,ou=Fornecedores,ou=SP,dc=dominio,dc=brasil" -b "dc=dominio,dc=brasil" -W objectclass=*
Modelo do arquivo squid.conf completo
####################################################################
####################################################################
#### SERVICO DE CONTROLE DE ACESSO A INTERNET ###########
####################################################################
####################################################################
http_port 3128
hierarchy_stoplist cgi-bin ?
acl QUERY urlpath_regex cgi-bin \?
no_cache deny QUERY
# Definindo a Linguagem das Páginas de Controle do Squid
error_directory /usr/share/squid/errors/Portuguese
#Arquivo de Log
cache_access_log /var/log/squid/access.log
#### Parametros especificos para o Proxy Autenticado
auth_param ntlm program /usr/bin/ntlm_auth --helper-protocol=squid-2.5-ntlmssp
auth_param ntlm children 5
auth_param ntlm keep_alive on
auth_param basic program /usr/bin/ntlm_auth --helper-protocol=squid-2.5-basic
auth_param basic children 5
auth_param basic credentialsttl 2 hours
auth_param basic casesensitive off
# Especifique a Informacao que ira aparecer para o usuario caso abra
# a janela de autenticacao.
auth_param basic realm "Controle de Acesso Web "
refresh_pattern ^ftp: 1440 20% 10080
refresh_pattern ^gopher: 1440 0% 1440
refresh_pattern . 0 20% 4320
acl all src 0.0.0.0/0.0.0.0
acl manager proto cache_object
acl localhost src 127.0.0.1/255.255.255.255
acl to_localhost dst 127.0.0.0/8
#### Liberando a Rede
acl rede src 10.0.7.0/24
#### Liberando Portas
acl SSL_ports port 443 563
acl Safe_ports port 80 # http
acl Safe_ports port 81 # sarg
acl Safe_ports port 86 # auth_speedy
acl Safe_ports port 21 # ftp
acl Safe_ports port 443 563 # https, snews
acl Safe_ports port 70 # gopher
acl Safe_ports port 210 # wais
acl Safe_ports port 1025-65535 # unregistered ports
acl Safe_ports port 280 # http-mgmt
acl Safe_ports port 488 # gss-http
acl Safe_ports port 591 # filemaker
acl Safe_ports port 777 # multiling http
acl CONNECT method CONNECT
http_access allow manager localhost
http_access deny manager
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
#### Sites Liberados para a rede
acl SitesLiberados url_regex -i "/etc/squid/controles/sitesliberados.txt"
#### ACL NOCACHE
acl NOCACHE url_regex -i repom.com.br
no_cache deny NOCACHE
#### Sites Negados por Grupo do Active Directory
acl SitesNegados url_regex -i "/etc/squid/controles/sitesbloqueados.txt"
acl siteavg url_regex "/etc/squid/controles/siteavg"
acl msn url_regex -i "/etc/squid/controles/msn"
#### ACLS EXTERNAS DE GRUPOS DO Active Directory
external_acl_type nt_group %LOGIN /usr/lib/squid/wbinfo_group.pl
# Nota: Os arquivos abaixo deverao conter nomes de grupos validos do Active Diretory
acl proxyNavVcp external nt_group "/etc/squid/grupos/proxynavvcp-groups"
acl proxyMsnVcp external nt_group "/etc/squid/grupos/proxymsnvcp-groups"
# Liberando a rede sem autenticacao - Saida de Ermegencia
#http_access allow rede
#### Regras de Acessos
http_access allow rede siteavg
http_access allow rede SitesLiberados
http_access allow !SitesNegados !msn proxyNavVcp
http_access allow proxyMsnVcp !SitesNegados !msn
http_access allow localhost
http_access deny rede
http_access deny all
http_reply_access allow all
icp_access allow all
cache_dir ufs /var/spool/squid 300 16 256
coredump_dir /var/spool/squid
# Nome da Maquina que ira aparecer nas paginas de controle do Squid para o Usuario.
visible_hostname squid.dominio
———
Voltar