Squid 3 (Ubuntu 10.04 LTS) autenticando no Active Directory (Windows 2008)
Este artigo faz parte do tutorial Proxy Squid no Ubuntu com autenticação NTLM no Windows 2008 e regras baseadas em Grupos do AD. A idéia é aproveitar as credenciais dos usuários do AD, que já fizeram a autenticação no Windows e permitir que eles se autentiquem no Squid sem precisar digitar nenhuma senha.
Além disso os usuários serão incluidos em grupos do AD e as regras do Squid será configuradas para dar privilégios de acesso para estes grupos.
A sugestão aqui é a criação de 3 grupos de acesso: Internet_Acesso_Completo, Internet_Acesso_Padrao e Internet_Acesso_Bloqueado. Dessa forma o Squid gerencia os privilégios de cada grupo e fornece o acesso de acordo com o grupo que o usuário pertença.
Também serão criadas um conjunto de arquivos que irão conter palavras e sites permitidos e proibidos, além de computadores liberados e proibidos de navegar utilizando o proxy.
Por fim irei mostrar um pequeno script que utilizo para poder mostrar os logs do Squid de forma mais funcional e fácil de visualizar.
Pré-Requisitos
- Servidor Linux autenticando no AD - Você pode aprender como fazer isso aqui.
- Privilégios de administrador (root) no Linux instalado.
- Domínio Active Directory (AD) baseado em Windows 2000, 2003 ou 2008 já instalado e operando.
- Credenciais com privilégios para criação de grupos no AD.
Tutorial
1. Instalação do Squid 3
Instale o Squid 3 executando o comando abaixo:
sudo apt-get install squid3
Substitua o conteúdo do arquivo /etc/squid3/squid.conf pelo mostrado abaixo. Atenção para as linhas destacadas. Elas devem ser alteradas para refletir a realidade de seu ambiente.
# /etc/squid3/squid.conf #################################################### # Portas (padrão 3128) http_port 3128 #Habilitar debug #debug_options 28,3 #Configurações de Cache # tipo de cache (aufs), pasta raiz, tamanho em MB, diretorios pais, diretorios em cada diretorio cache_dir aufs /var/spool/squid3 8196 16 256 # Tamanho da cache para obejtos cache_mem 2 GB # Tamanho máximo dos objetos que serão salvos em disco maximum_object_size 131070 KB # Tamanho minimo dos objetos que serão salvos em disco minimum_object_size 0 KB # Número de entradas na tabela de cache de conversão de IP para FQDN ipcache_size 16384 # Percentagem de cache baixa - padrão 90 ipcache_low 90 # Percentagem de cache baixa - padrão 95 ipcache_high 95 # manter memória alocada e não usada, para não precisar realocar quando for usar memory_pools on # Número de entradas na tabela de cache de DNS fqdncache_size 16384 # tamanho máximo dos objetos guardados na cache maximum_object_size_in_memory 8 MB # Gerar resumo de cache - Útil somente quando existem squids parceiros deste squid digest_generation off # Configurações gerais # Como tratar o X-Forwared-For no cabeçalho HTTP forwarded_for off #logar parametros das URL's strip_query_terms on # Força IE 5.5 ou anteior a buscar novas páginas do servido em caso de refresh ie_refresh on #Detecta respostas quebradas de conexões persistnes e assuma que o reply foi enviado apos 10 segundos detect_broken_pconn on #Tenta executar até 2 requisições em paralelo - Pode quebrar autenticação NTLM/Kerberos pipeline_prefetch off # Continua baixando requisições abortadas quick_abort_min -1 KB # continua baixando requsições abortadas até o limite de 16KB quick_abort_max 16 KB # Quanto tempo manter cache de DNS positive_dns_ttl 5 minute # Fechar conexões TCP imediatamente half_closed_clients off # timeout de leitura de dados read_timeout 240 second # timeout de conexões persistentes pconn_timeout 240 second # Email do administrador cache_mgr adminsquid@dominio.com.br # Host visível visible_hostname proxy-squid.dominio.com.br # Linguagem dos erros error_directory /usr/share/squid3/errors/pt-br # Evita que sejam feitos coredumps. coredump_dir /var/spool/squid3 # Numero de arquivos de log rotacionados a guardar. logfile_rotate 120 # Tempo para agaurdar o fechamento de conexçoes durante encerramento do squid shutdown_lifetime 1 second # palavras que será tratadas diretamente por esse squid, ou seja, não serão repassadas para vizinhos hierarchy_stoplist cgi-bin ? # Dominio padrão de busca #append_domain .dominio.com.br # Padrão de refresh de cache para alguns sites # refresh_pattern [-i] regex min percent max [options] # -i : regular expressiona case-insensitive # regex: Expressão regular a buscar # min: tempo (em minutos) que um objeto será considerado novo # percent: % da idade do objeto que é considerado novo # max: limite máximo que os objetos sem tempo de expirar explicito serão considerados novos refresh_pattern -i http.*\.gov.br/.* 720 100% 7200 reload-into-ims refresh_pattern -i http.*\.globo.com/.* 720 100% 7200 reload-into-ims refresh_pattern -i http.*\.terra.com.br/.* 720 100% 7200 reload-into-ims refresh_pattern -i http.*\.google.*/.* 720 100% 10080 reload-into-ims refresh_pattern -i http.*\.msn.*/.* 720 100% 10080 reload-into-ims refresh_pattern -i http.*\.uol.com.*/.* 720 100% 10080 reload-into-ims refresh_pattern -i http.*\.bol.com.*/.* 720 100% 10080 reload-into-ims refresh_pattern -i http.*\.lyricsplugin.com.*/.* 720 100% 10080 reload-into-ims refresh_pattern ^ftp: 1440 20% 10080 refresh_pattern ^gopher: 1440 0% 1440 refresh_pattern . 0 20% 4320 # Logs #logformat combined %>a %ui %un [%tl] "%rm %ru HTTP/%rv" %Hs %# Log de acesso access_log /var/log/squid3/access.log # Log de cache cache_log /var/log/squid3/cache.log # pasta para arquivo de dump coredump_dir /var/spool/squid3 # comportamente para espaço em branco nas URLs uri_whitespace allow # Servidores de DNS a serem utilizados - Se não for especificado, o valor de /etc/resol.conf será utilizado #dns_nameservers 192.168.0.1 # Autenticação no Windows 2008 auth_param ntlm program /usr/bin/ntlm_auth --helper-protocol=squid-2.5-ntlmssp auth_param ntlm children 30 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 realm Proxy Squid - Digite suas credenciais auth_param basic credentialsttl 5 hours # ACLs # acls de origem # rede loopback acl localhost src 127.0.0.1/32 # Rede local acl rede_local src 192.168.0.0/24 # acls de destino #acl allDest dst 0.0.0.0/0.0.0.0 #acl to_localhost dst 127.0.0.0/8 # portas seguras acl SSL_ports port 443 acl SSL_ports port 8180 acl SSL_ports port 8443 # Demais serviços acl Safe_ports port 80 # http acl Safe_ports port 81 # http acl Safe_ports port 20-21 # ftp acl Safe_ports port 70 # gopher acl Safe_ports port 443 563 # https, snews acl Safe_ports port 210 # wais 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 Safe_ports port 901 # SWAT acl Safe_ports port 8080 # http acl Safe_ports port 8081 # http acl Safe_ports port 8082 # http acl Safe_ports port 8088 # http acl Safe_ports port 8180 # http acl Safe_ports port 3456 # receita federal - irpf acl Safe_ports port 3001 # diario oficial # acls default squid acl purge method PURGE acl CONNECT method CONNECT acl POST method POST # acl para obter grupos do AD external_acl_type grupo_AD ttl=60 %LOGIN /usr/lib/squid3/wbinfo_group.pl # Grupos do AD acl acesso_completo external grupo_AD Internet_Acesso_Completo acl acesso_padrao external grupo_AD Internet_Acesso_Padrao acl acesso_bloqueado external grupo_AD Internet_Acesso_Bloqueado # acls de segurança proteção do cache acl manager proto cache_object # acl controlar sites (sites-proibidos) acl sites_proibidos dstdomain -i "/etc/squid3/acls/sites_proibidos" acl sites_liberados dstdomain -i "/etc/squid3/acls/sites_liberados" # acl controlar palavras de sexo, baixo calão, etc acl palavras_proibidas url_regex -i "/etc/squid3/acls/palavras_proibidas" acl palavras_liberadas url_regex -i "/etc/squid3/acls/palavras_liberadas" acl maquinas_proibidas src "/etc/squid3/acls/maquinas_proibidas" acl maquinas_liberadas src "/etc/squid3/acls/maquinas_liberadas" # acl controlar horário de expediente #acl horario_allow url_regex -i "/etc/squid3/horario_allow" #acl fora_expediente time MTWHFA 20:01-23:59 #acl fora_expediente2 time MTWHFA 00:00-05:59 # Mensagem de erros personalizados para alguimas ACLs deny_info ARQ_SITES_PROIBIDOS sites_proibidos deny_info ARQ_SITES_PROIBIDOS sites_liberados deny_info ARQ_SITES_PROIBIDOS palavras_proibidas deny_info ARQ_SITES_PROIBIDOS palavras_liberadas deny_info ARQ_MAQUINAS_PROIBIDAS maquinas_proibidas deny_info ARQ_MAQUINAS_PROIBIDAS maquinas_liberadas deny_info ARQ_ACESSO_BLOQUEADO acesso_bloqueado deny_info ARQ_PORTAS_PROIBIDAS Safe_ports deny_info ARQ_PORTAS_PROIBIDAS SSL_ports # HTTP ACCESS # regras das acls de origem - libera os administradores #http_access allow admins # libera método POST sem autenticação. Para evitar problemas http_access allow POST http_access allow rede_local acesso_completo http_access deny acesso_bloqueado # regras das acls de portas - bloqueia todas as portas não listadas http_access deny !Safe_ports # bloqueia conexões das portas seguras não listadas http_access deny CONNECT !SSL_ports # regras das acls de controle (bloqueio e políticas de rede) http_access allow manager localhost http_access deny manager # controle de acesso de sites proibidos http_access deny sites_proibidos !sites_liberados # controle de acesso da acl de palavras de sexo, baixo calão, etc # bloqueia todas as palavras da lista de proibidas com exceção das # palavras liberadas http_access deny palavras_proibidas !palavras_liberadas http_access deny maquinas_proibidas !maquinas_liberadas http_access allow rede_local maquinas_liberadas # controle de horário de expediente # bloqueia utilização fora do expediente #http_access deny !horario_allow fora_expediente #http_access deny !horario_allow fora_expediente2 http_access allow purge localhost http_access allow rede_local acesso_padrao http_access deny purge # HTTP REPLY ACCESS http_reply_access allow all http_access deny all # ICP ACCESS icp_access deny all # MISS ACCESS miss_access allow rede_local miss_access deny all # MODO DE FTP PASSIVO #ftp_passive on # Negar cache de cgi-bin acl QUERY urlpath_regex cgi-bin \? cache deny QUERY # negar cache de POST acl POSTS method POST cache deny POSTS
O arquivo acima é apenas uma sugestão. Você pode fazer as alterações que julgar necessárias. A parte importante é a que controla a autenticação NTLM no dominio:
# Autenticação no Windows 2008 auth_param ntlm program /usr/bin/ntlm_auth --helper-protocol=squid-2.5-ntlmssp auth_param ntlm children 30 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 realm Proxy Squid - Digite suas credenciais auth_param basic credentialsttl 5 hours
Outra parte importante é a que configura a obtenção dos grupos do AD e a aplicação das regras associadas:
# acl para obter grupos do AD external_acl_type grupo_AD ttl=60 %LOGIN /usr/lib/squid3/wbinfo_group.pl # Grupos do AD acl acesso_completo external grupo_AD Internet_Acesso_Completo acl acesso_padrao external grupo_AD Internet_Acesso_Padrao acl acesso_bloqueado external grupo_AD Internet_Acesso_Bloqueado http_access allow rede_local acesso_completo http_access deny acesso_bloqueado #... conjunto de regras de bloqueio padrão http_access allow rede_local acesso_padrao
O campo ttl=60, na diretiva external_acl_type acima, controla por quanto tempo (em segundos) o grupo é válido para o acesso. Você pode diminuir ou aumentar este valor de acordo com suas preferências, para que as alterações de grupos dos usuários sejam aplicadas para os acessos ao Squid. Em outras palavras: com o ttl de 60, se por exemplo um usuário que possui acesso padrão for incluído no grupo Internet_Acesso_Completo, levará 1 minuto para que esta alteração seja efetivada pelo Squid.
Você pode comentar as regras que não se aplicarem a sua realidade ou não satisfizerem suas necessidades.
Cada diretiva possui uma breve descrição sobre sua função no próprio arquivo acima, mas em caso de dúvidas, consulte a ajuda do Squid: http://www.squid-cache.org/Doc/config/
2. Criação dos grupos no Active Directory (AD)
Você precisa criar os três grupos sugeridos no começo do tutorial em seu AD:
- Internet_Acesso_Completo
- Internet_Acesso_Padrao
- Internet_Acesso_Bloqueado
3. Criação de arquivos de controle
Crie a pasta /etc/squid3/acls e dentro dela os arquivos de controle de acesso a sites, palavras e computadores de origem.
sudo mkdir /etc/squid3/acls sudo touch /etc/squid3/acls/sites_proibidos sudo touch /etc/squid3/acls/sites_liberados sudo touch /etc/squid3/acls/palavras_proibidas sudo touch /etc/squid3/acls/palavras_liberadas sudo touch /etc/squid3/acls/maquinas_proibidas sudo touch /etc/squid3/acls/maquinas_liberadas
Inclua nos arquivos recém criadas as entradas que deseja permitir ou proibir, uma em cada linha.
Os arquivos de controle de sites devem conter o domínio completo do que se deseja permitir/proibir, por exemplo www.playboy.com.br.
Os arquivos de controle de palavras irão controlar o acesso para URLs que contenham em algum lugar as palavras listadas nos respectivos arquivos.
Os arquivos maquinas_proibidas e maquinas_liberadas, devem conter o endereço IP de computadores que devem ter seu acesso proibido ou liberado completamente, independente do usuário conectado no mesmo.
4. Arquivos de erros personalizados
As regras deny_info controlam arquivos de erro personalizado para cada regra acl que seja negada pelo Squid.
Crie os arquivos ARQ_SITES_PROIBIDOS, ARQ_MAQUINAS_PROIBIDAS, ARQ_ACESSO_BLOQUEADO e ARQ_PORTAS_PROIBIDAS na pasta /usr/share/squid3/errors/pt-br.
Estes arquivos são em formato HTML e devem conter as mensagens a serem reportadas para o usuário em caso de bloqueio no acesso.
Você pode utilizar alguns caracteres especiais para serem convertidas em informações antes de mostrar para o usuário. Para saber os caracteres permitidos consulte: http://www.squid-cache.org/Doc/config/deny_info/
Se quiser usar meus arquivos personalizados, descomprima o arquivo erros_squid.zip na pasta /usr/share/squid3/errors/pt-br.
Um exemplo de acesso negado contido nestes arquivos seria semelhante ao seguinte:
5. Como controlar o acesso a redes sociais para um grupo específico do AD
acl acesso_redes_sociais external grupo_AD Internet_Acesso_Redes_Sociais acl redes_sociais dstdomain -i "/etc/squid3/acls/redes_sociais"
Você pode usar url_regex ao invés de dstdomain, assim você não precisa digitar o nome exato de cada domínio de rede social, bastando escrever o domínio parcialmente em /etc/squid3/acls/redes_sociais.
Um exemplo do arquivo /etc/squid3/acls/redes_sociais seria:
twitter.com orkut.com facebook.com plus.google.com
Ainda no arquivo /etc/squid3/squid.conf, antes da linha abaixo:
http_access allow rede_local acesso_padrao
incluia as seguintes linhas:
http_access allow redes_sociais acesso_redes_sociais http_access deny redes_sociais
Visualização dos logs de acesso do Squid
Escrevi um pequeno script para permitir a visualização dos logs do Squid de uma forma mais simples e fácil de entender.
Você precisa ter o gawk instalado para ele funcionar corretamente. Instale-o com o comando abaixo:
sudo apt-get install gawk
Crie um arquivo squid3_log.sh com o conteúdo abaixo:
#!/bin/bash
tail -f /var/log/squid3/access.log | awk '{print strftime("\033[1;31m%F %H:%M:%S\033[0m",$1) " " $3 " \033[1;35m" $8 "\033[0m " $4 " \033[1;32m" $6 "\033[0m \033[1;33m" $7 "\033[0m"}'
Dê permissão de execução:
chmod +x squid3_log.sh
Execute o script para verificar os acessos em tempo real:
./squid3_log.sh
Você pode melhorar o script acima incluindo filtros, usando o grep, para por exemplo encontrar os acessos de usuários específicos e/ou data e hora de acesso determinados.
A saída do script acima será algo semelhante a imagem abaixo:

Observações e Dicas
Reinicie seu computador e teste todos os acessos com usuários de grupos diferentes antes de colocar o sistema em produção.
Em caso de problemas com as regras, descomente (remova o #) a linha debug no começo do /etc/squid3/squid.conf e verifique os logs no /var/log/squid3/cache.log.
O Squid é bastante poderoso e integrado ao AD torna-se uma ferramenta incrível e bastante simples de administrar.
Estude principalmente as ACLs e a aplicação das mesmas com a diretiva http_access. Você vai se surpreender com tudo que é capaz de fazer.
Abraços e em caso de dúvidas é só escrever nos comentários.
-
Referências
- Squid autenticando no Windows utilizando grupos do AD
- Integrating Squid and Samba3 with NTLM authentication
- Integrando autenticação do Squid ao Active Directory



Olá amigo!
Fiz exatamente como no tutorial, mas acho que estou pecando em alguma coisa.
Aparentemente o meu squid não inicia. Após iniciar manualmente o processo é derrubado em segundos.
O meu Ubuntu tá autenticando no domínio certinho. Apenas não consigo fazer funcionar o squid.
Obrigado.
Abs,
Fernando Silva