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
Crie um site grátis Webnode