Squid3 no Debian autenticando via Active Directory

Olá pessoal,  depois de bastante prometer, estou disponibilizando um pouco do meu conhecimento em servidores Linux, inclusive em distros baseadas em Debian e compartilhar este método de utilizar as bases de dados do Active Directory para autenticar o acesso à internet usando o Squid.

Etapa 1: Preparando a estrutura

Domain Controller: Windows 2003 Standard Proxy: Debian 6.0.5

Etapa 2: Preparando o servidor proxy

Primeiro, edite o arquivo /etc/hosts colocando o nome e o ip do seu Domain Controller:

127.0.0.1 localhost
# The following lines are desirable for IPv6 capable hosts
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
ff02::3 ip6-allhosts
ip_do_host nome_da_maquina.seu.dominio nome_do_host

Em seguida, vamos instalar o NTPDATE para efetuar o sincronismo de horário entre o Servidor Linux e um NTP Server:

# apt-get install ntpdate

Instalação do Kerberos: - Kerberos p/ Linux

# apt-get install krb5-kdc krb5-config krb5-clients libpam-krb5 krb5-user

Caso apareça uma tela azul solicitando o Nome do Domínio e o IP do Servidor, deixe as opções padrão. Após a instalação dos pacotes acima, é necessário alterar o arquivo /etc/krb5.conf.

[logging]
default = FILE:/var/log/krb5libs.log
kdc = FILE:/var/log/krb5kdc.log
admin_server = FILE:/var/log/kadmind.log
[libdefaults]
default_realm = SEU.DOMINIO
dns_lookup_realm = true
dns_lookup_kdc = true
ticket_lifetime = 24h
forwardable = yes
[realms]
SEU.DOMINIO = {
kdc = servidor.seu.dominio
admin_server = servidor. seu.dominio
default_domain = SEU.DOMINIO
}
[domain_realm]
.dominio.seu = SEU.DOMINIO
dominio.seu = SEU.DOMINIO
[kdc]
profile = /var/kerberos/krb5kdc/kdc.conf
[appdefaults]
pam = {
debug = false
ticket_lifetime = 36000
renew_lifetime = 36000
forwardable = true
krb4_convert = false
}

Vamos editar alguns dos arquivos de configuração e efetuar a comunicação entre o Proxy e o Domain Controller via Kerberos. Primeiro, é necessário que o horário do servidor Linux e do Servidor Windows estejam sincronizados. Para isto, iremos utilizar um servidor NTP, seguindo os seguintes passos:

- Servidor Linux

# ntpdate br.pool.ntp.org

- Servidor Windows

C:\Winnt> net time /setsntp:br.pool.ntp.org C:\Winnt> net stop w32time & net start w32time

Em seguida, vamos iniciar a comunicação entre o Linux e o Domain Controller utilizando Kerberos.

# kinit administrador@TESTE

Será solicitada a senha do usuário “administrador”. Se tudo correu bem, você irá rodar o comando “klist” e o retorno será semelhante ao que obtivemos, conforme abaixo:

# kinit administrator@TESTE

Password for administrator@TESTE:

# klist
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: administrator@TESTE
Valid starting
Expires
Service principal
14/05/12 10:25:47 05/15/12 00:25:47 krbtgt/TESTE@TESTE
Kerberos 4 ticket cache: /tmp/tkt0
klist: You have no tickets cached

Em seguida, vamos editar o arquivo nsswitch.conf

# nano /etc/nsswitch.conf

E alterar as linhas: DE:

Example configuration of GNU Name Service Switch functionality.
# If you have the `glibc-doc-reference' and `info' packages installed, try: # `info libc "Name Service Switch"' for information about this file.
passwd: compat
group: compat
shadow: compat
hosts: files mdns4_minimal [NOTFOUND=return] dns mdns4
networks: files
protocols: db files
services: db files
ethers: db files
rpc: db files
netgroup: nis

PARA:

passwd: compat winbind
group: compat winbind
shadow: compat
hosts: files mdns4_minimal [NOTFOUND=return] dns mdns4
networks: files
protocols: db files
services: db files
ethers: db files
rpc: db files
netgroup: nis

Pronto! O ambiente está preparado para receber o SAMBA/Winbind e o SQUID.

Etapa 3: Instalação do SAMBA A instalação do SAMBA/Winbind é simples e pode ser feita via apt-get.

Então, vamos por a mão na massa:

# apt-get install samba winbind

Após rodarmos o comando acima, será aberta uma tela de configuração, onde é solicitado o nome do domínio, o uso de senhas encriptadas, que OBRIGATORIAMENTE tem que ser SIM e também é necessário que o samba crie o arquivo de senhas. Agora é necessário configurar o samba. Para isso, vamos fazer backup do arquivo original e depois vamos criar o nosso arquivo de configuração.

# mv /etc/samba/smb.conf /etc/samba/smb.original
# nano /etc/samba/smb.conf

O arquivo smb.conf deve conter OBRIGATORIAMENTE as linhas abaixo. Outras configurações podem ser feitas de acordo com a necessidade.

[global]
workgroup = dominio
security = ads
log file = /var/log/samba/%m.log
max log size = 50
dns proxy = no
password server = servidor.seu.dominio
realm = SEU.DOMINIO
idmap uid = 16777216-33554431
idmap gid = 16777216-33554431
template shell = /bin/bash
winbind use default domain = true
winbind enum users = yes
winbind enum groups = yes

Criado o arquivo de configuração, vamos reiniciar os serviços do Samba e do Winbind.

# /etc/init.d/samba stop
# /etc/init.d/winbind stop
# /etc/init.d/samba start
# /etc/init.d/winbind start

Obs.: Não esqueça de verificar os logs para saber se tudo iniciou corretamente. Agora vamos colocar a máquina linux no domínio Windows.

# net ads join –U administrator –S TESTE

Após digitar a senha, que será solicitada, o retorno deve ser semelhante ao retornado abaixo:

# net ads join -U administrator -S TESTE
administrator's password:
Using short domain name -- TESTE
Joined 'PROXY' to realm 'TESTE'

Pronto! A máquina que está rodando o LINUX já faz parte do Domínio Microsoft Agora vamos definir o usuário que irá ser utilizado pelo winbind e verificar se podemos listar usuários e grupos do AD (Recomendo a criação de uma conta de serviço específica com as permissões necessárias.)

 wbinfo --set-auth-user=srv-winbind

- Alterar a inicialização do Winbind para evitar problemas no winbind_privilegged Localizar o texto:

chgrp winbindd_priv /var/run/samba/winbindd_privileged/ || return 1

Alterar para:

chgrp proxy /var/run/samba/winbindd_privileged/ || return 1

- Reiniciando os serviços

# /etc/init.d/samba stop && /etc/init.d/samba start
# /etc/init.d/winbind stop && /etc/init.d/winbind start

- Verificando se o Winbind está comunicando com o RPC Server

# wbinfo -t

Saída Esperada: checking the trust secret via RPC calls succeeded

- Listando Usuários do AD

# wbinfo –u

- Listando os Grupos do AD

# wbinfo -g

Ótimo! Tudo okay, podemos dar seqüência na instalação do Squid!

Etapa 4: Realizar a instalação e configuração do servidor proxy squid

O squid 3.1.x pode ser instalado via apt-get, pois já possui suporte a NTLM nativo. Vamos ao que interessa:

- Efetuando o Download e a Instalação

# apt-get install squid3

- Efetuando bkp do arquivo de configuração original

# cd /etc/squid3

# mv squid.conf squid.original

- Limpando todas as linhas comentadas do squid.original e gerando o squid.conf

# egrep -v "^#|^$" squid.original > squid.conf

- Gerando o diretório de logs e liberando as permissões

# mkdir /var/log/squid3
# chown -R proxy.proxy /var/log/squid

Editando o arquivo squid.conf e colocando as linhas abaixo (As linhas em vermelho são as linhas utilizadas pela autenticação)

# nano /etc/squid/squid.conf
# /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 [email protected]
# 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

# comportamento para espaço em branco nas URLs
uri_whitespace allow

# faz a autenticacao
auth_param basic program /usr/lib/squid3/squid_ldap_auth -R -b "dc=teste,dc=br" -D "cn=usersquid,cn=Users,dc=teste,dc=br" -w "d4n4dinh46969" -f sAMAccountName=%s -h ipdoservidorldap
auth_param basic realm Digite suas credenciais:
auth_param basic credentialsttl 2 hours
# ACLs acl manager proto cache_object
acl localhost src 127.0.0.1/32 ::1
#acl all dst 0.0.0.0/0.0.0.0
acl to_localhost dst 127.0.0.0/8 0.0.0.0/32 ::1
acl SSL_ports port 443          # ssl
acl SSL_ports port 10000      # webmin
acl Safe_ports port 80-81      # http
acl Safe_ports port 84           # http_tce
acl Safe_ports port 90          # dvr foc
acl Safe_ports port 631        # CUPS
acl Safe_ports port 8090      # dvr
acl Safe_ports port 20-21     # ftp
acl Safe_ports port 443        # https
acl Safe_ports port 70          # gopher
acl Safe_ports port 210        # wais
acl Safe_ports port 9090       # openfire
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
# solicita a autenticacao
acl auth proxy_auth REQUIRED
#### Configurando ACLs customizadas ####
# dominios que nao necessitam de autenticacao
acl noauth_domain dstdomain -i "/etc/squid3/lists/noauth_domain"
# URLs que nao necessitam de autenticacao
acl noauth_url urlpath_regex -i "/etc/squid3/lists/noauth_url"
# maquinas da rede que nao necessitam de autenticacao
acl noauth_src src "/etc/squid3/lists/noauth_src"
# dominios liberados
acl allowed_domain dstdomain -i "/etc/squid3/lists/allowed_domain"
# URLs liberadas
acl allowed_url urlpath_regex -i "/etc/squid3/lists/allowed_url"
# extensoes negadas
acl denied_extension urlpath_regex -i "/etc/squid3/lists/denied_extension"
# nao permitir um mesmo login em mais de uma estacao
acl controle_login max_user_ip 1
http_access deny controle_login
# mensagem de erro customizada
deny_info ERR_SIMULT_USER controle_login
# ativando ACLs padrao
http_access allow manager localhost
http_access deny manager
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow localhost
# ativando ACLs personalizadas
http_access allow noauth_domain
http_access allow noauth_url
http_access allow noauth_src
http_access allow auth allowed_domain
http_access allow auth allowed_url
http_access deny !auth
http_access deny denied_extension
http_access allow auth
http_access deny all

Crie a pasta /etc/squid3/lists e dentro dela os arquivos de controle de acesso a sites, palavras e computadores de origem.

sudo mkdir /etc/squid3/lists sudo touch /etc/squid3/lists/noauth_domain sudo touch /etc/squid3/lists/noauth_url sudo touch /etc/squid3/lists/noauth_src sudo touch /etc/squid3/lists/allowed_domain sudo touch /etc/squid3/lists/allowed_url sudo touch /etc/squid3/lists/denied_extension

Inclua nos arquivos recém criadas as entradas que deseja permitir ou proibir, uma em cada linha.

Criando o cache e iniciando o Squid
# squid3 -z
# squid3 &
Depois de editar o seu squid.conf, não esqueça de recarregá-lo:
# squid3 –k reconfigure
Reiniciando:
# /etc/init.d/squid3 restart

Testes: Efetue a configuração do PROXY no navegador (Ex: Servidor Proxy: 192.168.0.1 Porta:3128) e tente acessar algum website.

Monitoramento: Monitorando o arquivo de log de acessos do squid com o commando tail –f e vemos que o acesso foi liberado utilizando o usuário dunha, que é o usuário logado na estação de trabalho.

# tail –f /var/log/squid/access.log

1172165029.325 756 192.168.0.10 TCP_MISS/200 9646 GET http://home.img.uol.com.br/0702/d/festadance.jpg bruno.mezenga DIRECT/200.221.7.37 text/plain

Bem, não sei se consegui ser claro, mas espero poder ao menos “dar um norte” pra quem está tentando fazer tal recurso rodar em seu ambiente de rede.

Referências: