squid + windows 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
Inclua os usuários nos respectivos grupos, conforme o nível de acesso desejado para cada um deles.
Se todos os seus usuários forem membros do grupo Domain Users, você pode incluir o grupo Domain Users como membro do grupo Internet_Acesso_Padrao, assim todos os usuários terão o acesso padrão. Sendo que pelas regras apresentadas no /etc/squid3/squid.conf acima se o usuário fizer parte de mais de um grupo de acesso a Internet, o grupo Internet_Acesso_Completo terá a maior prioridade, seguido do grupo Internet_Acesso_Bloqueado. Ou seja se o usuário fizer parte dos 3 grupos ele terá o acesso liberado totalmente e se ele fizer parte do Internet_Acesso_Padrao e do Internet_Acesso_Bloqueado, seu acesso será 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:

Erro Squid Exemplo

5. Como controlar o acesso a redes sociais para um grupo específico do AD

Você pode criar outros grupos e liberar o acesso a sites específicos somente para este grupo. Por exemplo, você pode bloquear as redes sociais, criando um grupo no AD chamado Internet_Acesso_Redes_Sociais,  incluindo os respectivos dominios (twitter, orkut, facebook, ...) em um novo arquivo chamado /etc/squid3/acls/redes_sociais e incluir as seguintes regras no /etc/squid3/squid.conf:
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:

Squid Log

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