Squid Autenticando em Base OPENLDAP

De Fórum Debian Wiki


Índice de conteúdo

Introdução

Esse artigo ensina como configurar o Squid para autenticar em uma base OPENLDAP. O sistema operacional usado foi o Debian Etch, mas provavelmente esse artigo também possa ser aplicado em versões mais recentes do Debian.

Histório

Após utilizar várias bases de usuários e senhas, tive a necessidade de centralizá-las, como em um único servidor OPENLDAP. Desta maneira posso utilizar a mesma base de usuários e senhas cadastradas no OPENLDAP, no servidor proxy squid.

Depois de muito pesquisar na internet, encontrei vários manuais, artigos etc, ensinando a fazer o squid autenticado usando uma base OPENLDAP. Mas os mesmos sempre foram em sua grande maioria adaptados para se utilizar o squid autenticado usando uma base Active Directory. Houve a necesssidade de adaptá-los, porque estes manuais e artigos não funcionam com a dupla 'SQUID e OPENLDAP'.

Com muitos dias de trabalho e contando com a ajuda da comunidade Linux, inclusive com a ajuda de Alfredo Junior e Diogo Oliveira ambos indispensáveis para o meu sucesso desta integração.

Não irei abordar a instalação do OPENLDAP + SAMBA, mas indico este link http://wiki.sintectus.com/bin/view/GrupoLinux/InstalacaoLdapSamba, onde se explica de forma pratica, inclusive com script que automatiza o processo de instalação e configuração.

Irei abordar somente como instalar o squid e configurá-lo para se integrar com o OPENLDAP.

Conforme o link citado, e populando a base LDAP no idioma em português, a estrutura OPENLDAP, após terminada a configuração, ficará na forma abaixo.

dc=agrovale,dc=com,dc=br (5) 
ou=Computadores(1) 
ou=Grupos(11) 
ou=Idmap 
ou=Usuarios (4) 
sambaDomainName=agrovale.com.br

ou=Grupos e onde ficara os grupos em que o squid ira fazer a consulta para validação dos grupos, e ou=Usuarios e onde sera validado os usuários e senhas.

Abaixo irei demonstrar como ficaria a árvore de Grupos e Usuários, no caso dentro de ou=Grupos iremos ter que criar o cn=CTIN e o cn=CRHU, onde a cn=CTIN ira ter acesso a quase todos os sites , exceto os que sites tiverem dentro de sites_CTIN e as palavras dentro da palavras_bloqueio_ctin. Na cn=CRHU ira ter acesso somente a sites definidos no sites_crhu e negar as palavras que estiverem dentro de palavras_bloqueio_crhu.

Na ou=Usuarios iremos ter 2 usuários o uid=gilmar que pertencera no cn=CTIN e o usuário o uid=cabral que pertencera o cn=CRHU.

dc=agrovale,dc=com,dc=br (5) 
ou=Computadores (1) 
ou=Grupos (11)

cn=Administradores 
cn=Administradores do Dominio 
cn=Computadores do Dominio 
cn=Convidados do Dominio 
cn=CRHU <= Usuários neste grupo só poderam acessar somente sites_crhu 
cn=CTIN <=Usuários q poderão acessar tudo, exceto q estiver em sites_bloqueio_ctin 
cn=Duplicadores 
cn=Operadores de Backup 
cn=Operadores de Contas 
cn=Operadores de Impressao 
cn=Usuarios do Dominio

ou=Idmap 
ou=Usuarios (4) 
uid=gilmar_20601 
uid=cabral 
uid=nobody 
uid=root

Após definido a base ldap conforme acima iremos passar para instalação e configurado do Squid.

Baixando fontes do Squid e dependências

No Debian Etch, teremos que instalar o squid através dos fontes, pois por default o squid instalado através do apt-get não vem copilado com suporte aos módulos de autenticação no OPENLDAP.

Como root, entre no diretório /opt para baixar os fontes e digite:

apt-get source squid

Após os downloads dos fontes vamos baixar as dependências.

apt-get build-dep squid

Entrar no diretório em que os fontes foram baixado o squid-2.6.5 e copilar.

cd /opt/squid-2.6.5

Para copilar e instalar seguir os passos abaixo.

./configure --prefix=/usr/local --sysconfdir=/etc/squid --localstatedir=/var/log/squid/ --libexecdir=/usr/local/squid/libexec --mandir=/usr/share/man

Para Instalar digite:

make all 
make install  

Com o squid instalado, basta apenas copilar o modulo squid_ldap_auth, que e o responsável por fazer o squid validar a consulta de senhas na base ldap, então para isto copile e copie o modulo conforme abaixo para o local correto.

cd /opt/squid-2.6.5//helpers/basic_auth/LDAP 
make 
cp squid_ldap_auth /usr/local/squid/libexec/ 

Com o modulo de validação de usuário instalado e copiado para local onde fica as bibliotecas do squid, o próximo passo e copilar o modulo responsável pela validação do grupo na base ldap, e para isto:

cd /opt/squid-2.6.5/helpers/external_acl/ldap_group 
make 
cp squid_ldap_group /usr/local/squid/libexec/ 

Configurando o squid

Este são os parâmetros básicos que o arquivo squid.conf no diretório /etc/squid terá ter para consegui rodar e autenticar no servidor OPENLDAP. O arquivo /etc/squid/squid.conf

# IP e porta do servidor squid 
http_port 192.168.1.2:3128 

# Memoria para ser utilizada pelo squid 
cache_mem 256 MB 
   
# Tamanho e localização do cache do squid 
cache_dir ufs /var/spool/squid 10000 16 256 
   
# Localização dos logs do squid 
access_log /var/log/squid/access.log squid 
   
# Pid gerado para que o script dentro /etc/init.d/squid inicialize e pare o squid. 
pid_filename /var/run/squid.pid 
  
# Linha responsável por validar a senha na base ldap. 
auth_param basic program /usr/local/squid/libexec/squid_ldap_auth -R -b "dc=agrovale,dc=com,dc=br" -D "cn=root,dc=agrovale,dc=com,dc=br" -w "senha_root_ldap" -f uid=%s -h IP_SERVIDOR_OPENLDAP 
   
# Número de processos filhos que o programa de autenticação poderá conter. 
auth_param basic children 5 
   
# Mensagem que ira aparecer na tela de autenticação do navegador. 
auth_param basic realm - ACESSO INTERNET - CTIN AGROVALE 
   
# Especifica por quanto tempo o Squid irá assumir que uma autenticação bem sucedida # # continuará válida. 
auth_param basic credentialsttl 1 hours 
   
# Libera rede para acesso a navegação pelo squid 
acl all src 192.168.1.0/255.255.255.0 
   
# Valida a pesquisa no grupo na base ldap 
external_acl_type ldap_group %LOGIN /usr/local/squid/libexec/squid_ldap_group -R -b "dc=agrovale,dc=com,dc=br" -D "cn=root,dc=agrovale,dc=com,dc=br" -w "senha" -f "(&(cn=%g)(memberuid=%u))" -h IP_SERVIDOR_LDAP 
   
# ACLs responsável por validar os grupos 
# Esta acl abaixo e o mesmo CN= que esta definido no OPENLDAP 
acl acl_CTIN external ldap_group CTIN 
acl sites_proibido_ctin url_regex -i "/etc/squid/sites/sites_proibido_ctin" 
acl palavras_ctin url_regex -i "/etc/squid/sites/palavras_proibido_ctin" 
   
# ACLs responsável por validar os grupos 
# Esta acl abaixo e o mesmo CN= que esta definido no OPENLDAP 
acl acl_CRHU external ldap_group CRHU 
acl sites_crhu url_regex -i "/etc/squid/sites/sites_crhu" 
acl sites_proibido url_regex -i "/etc/squid/sites/sites_proibido_crhu" 
   
# Aceita as acls e recusa outras 
# Usuarios no GRUPO CTIN, ira acessar acessar tudo exceto os que tiver nas palavras_CTIN e sites proibido_CTIN 
http_access allow acl_CTIN !palavras_proibido_ctin !sites_proibido_ctin 
 
# Usuários no CRHU poderá acessar somente o esta definido no sites_crhu e negar o que estiver em sites_proibido 
http_access allow acl_CRHU sites_crhu !sites_proibido_crhu 
http_access deny all 

Depois de configurado o squid.conf, teremos que criar 1 diretório chamado sites dentro de /etc/squid. No diretório sites ira ter os seguinte arquivos: sites_proibido_ctin, palavras_proibodo_ctin, sites_crhu e sites_proibido_crhu.

No arquivo /etc/squid/sistes/sites_proibido_ctin iremos definir alguns sites que o usuário gilmar ira não poderá acessar, exemplo:

.charges.com.br/* 
.gmail.com/* 

Dentro do arquivo /etc/squid/sites/palavras_proibido_ctin iremos definir algumas palavras que o usuário gilmar não poderá pesquisar na internet.

hotmail 
batepapo 
<pre>
Agora sera definido as regras de acesso para o usuário cabral que acessar somente os sites definidos dentro do /etc/squid/sistes/sites_crhu: 
<pre>
.agrovale.com.br/* 
.uol.com.br/* 
.google.com/* 
.globo.com/* 

Em /etc/squid/sistes/sites_proibido_crhu sera definido os sites que o usuário cabral não poderá acessar, exemplo: mesmo que o esteja definido que o usuário poder acessar o site da uol, porem dentro de uol não poderá acessar a o link de cartões uol.

cartoes.uol.com.br/* 
jogos.uol.com.br/* 
redeglobo.globo.com/*

Inicializando squid e criando script de inicialização

Para inicializar o squid basta utilizar o comando

/usr/bin/squid -d1

Porém para criar um script de inicialização do serviço dentro de /etc/init.d/squid basta copiar as linhas abaixo e salvar no diretório /etc/init.d/

#! /bin/sh 
# squid Startup script for the SQUID HTTP proxy-cache. 
# Version: @(#)squid.rc 2.20 01-Oct-2001 miquels@cistron.nl 
   
NAME=squid 
DAEMON=/usr/bin/squid 
LIB=/usr/lib/squid 
PIDFILE=/var/run/$NAME.pid 
SQUID_ARGS="-D -sYC" 
   
[ ! -f /etc/default/squid ] || . /etc/default/squid 
   
PATH=/bin:/usr/bin:/sbin:/usr/sbin 
   
[ -x $DAEMON ] || exit 0 
     
grepconf () { 
   
w=" " # space tab 
   
sq=/etc/squid/squid.conf 
   
# sed is cool. 
   
res=`sed -ne ' 
   
s/^'$1'['"$w"']\+\([^'"$w"']\+\).*$/\1/p; 
   
t end; 
   
d; 
   
:end q' < $sq` 
   
[ -n "$res" ] || res=$2 
  
echo "$res" 
   
} 
   
     
   
grepconf2 () { 
   
w=" " # space tab 
   
sq=/etc/squid/$NAME.conf 
   
# sed is cool. 
   
res=`sed -ne ' 
   
s/^'$1'['"$w"']\+[^'"$w"']\+['"$w"']\+\([^'"$w"']\+\).*$/\1/p; 
   
t end; 
   
d; 
   
:end q' < $sq` 
   
[ -n "$res" ] || res=$2 
   
echo "$res" 
   
} 
   
     
   
# Try to increase the # of filedescriptors we can open. 
   
     
   
maxfds () { 
   
[ -n "$SQUID_MAXFD" ] || return 
   
[ -f /proc/sys/fs/file-max ] || return 0 
   
[ $SQUID_MAXFD -le 4096 ] || SQUID_MAXFD=4096 
   
global_file_max=`cat /proc/sys/fs/file-max` 
  
minimal_file_max=$(($SQUID_MAXFD + 4096)) 
   
if [ "$global_file_max" -lt $minimal_file_max ] 
   
then 
   
echo $minimal_file_max > /proc/sys/fs/file-max 
   
fi 
   
ulimit -n $SQUID_MAXFD 
   
} 
   
     
   
fixperms () { 
   
   dir=$1 
   
   usr=$2 
   
   grp=$3 
   
     
   
   currusr=`/usr/bin/stat -c '%U' $dir` 
   
   currgrp=`/usr/bin/stat -c '%G' $dir` 
   
     
   
   if [ $currusr != $usr ] 
   
   then 
   
   chown $usr $dir -R 
   
   fi 
   
     
   
   if [ $currgrp != $grp ] 
   
   then 
   
   chgrp $grp $dir -R 
   
   fi 
   
     
   
   } 
   
     
   
   start () { 
   
   cdr=`grepconf2 cache_dir /var/spool/$NAME` 
   
   usr=`grepconf cache_effective_user proxy` 
   
   grp=`grepconf cache_effective_group proxy` 
   
     
   
   case "$cdr" in 
   
   [0-9]*) 
   
   echo "squid: squid.conf contains 2.2.5 syntax - not starting!" >&2 
   
   exit 1 
   
   ;; 
   
   esac 
    
   
    
   # Create spool dirs if they don't exist. 
   
     
   
   if [ -d "$cdr" -a ! -d "$cdr/00" ] 
   
   then 
   
   echo "Creating squid spool directory structure" 
   
   /usr/sbin/squid -z 
   
   fi 
   
     
   
   if [ "$CHUID" = "" ]; then 
   
   CHUID=root 
   
   fi 
   
     
   
   maxfds 
   
   umask 027 
   
   cd $cdr 
   
   start-stop-daemon --quiet --start \ 
   
   --pidfile $PIDFILE \ 
   
   --chuid $CHUID \ 
   
   --exec $DAEMON -- $SQUID_ARGS < /dev/null 
   
   sleep 1 
   
   } 
   
  
   
   stop () { 
   
   PID=`cat $PIDFILE 2>/dev/null` 
   
   start-stop-daemon --stop --quiet --pidfile $PIDFILE --exec $DAEMON 
   
     
   
   # Now we have to wait until squid has _really_ stopped. 
   
     
   
   sleep 2 
   
   if test -n "$PID" && kill -0 $PID 2>/dev/null 
   
   then 
   
   echo -n "(waiting..." 
   
   cnt=0 
   
   while kill -0 $PID 2>/dev/null 
   
   do 
   
   cnt=`expr $cnt + 1` 
   
   if [ $cnt -gt 60 ] 
   
   then 
   
   # 
   
   # Waited 120 seconds now. Fail. 
   
   # 
   
   echo -n "failed)" 
   
   if [ "$1" = verbose ] ; then 
   
   echo "." 
   
   else 
   
   echo -n " " 
   
   fi 
   
   return 
   
   fi 
   
   sleep 2 
   
   echo -n "." 
   
   done 
   
   echo -n "done)" 
   
   if [ "$1" = verbose ] ; then 
   
   echo " $NAME." 
   
   else 
   
   echo -n " " 
   
   fi 
   
   else 
   
   [ "$1" = verbose ] && echo "$NAME." 
   
   fi 
   
   } 
   
   case "$1" in 
   
   start) 
   
   echo -n "Starting proxy server: " 
   
   start 
   
   echo "$NAME." 
   
   ;; 
   
   stop) 
   
   echo -n "Stopping proxy server: " 
   
   stop verbose 
   
   ;; 
   
   reload|force-reload) 
   
   echo -n "Reloading $NAME configuration files..." 
   
   start-stop-daemon --stop --signal 1 \ 
   
   --pidfile $PIDFILE --quiet --exec $DAEMON 
   
   echo "done." 
   
   ;; 
   
   restart) 
   
   echo -n "Restarting proxy server: " 
   
   stop 
   
   start 
   
   echo "$NAME." 
   
   ;; 
   
   *) 
   
   echo "Usage: /etc/init.d/$NAME {start|stop|reload|force-reload|restart}" 
   
   exit 3 
   
   ;; 
   
   esac 
   
   exit 0

Elaboração:

  Gilmar Jacinto Cabral (gilmarjcabral@gmail.com)

Revisão e Publicação:

  Rodrigo Braga Prado (rodrigo@quati.com.br)

Participação e Agradecimentos:

  Alfredo Junior (aljr@lbr.com.br) 
  Diogo Oliveira (diogo.dno@gmail.com)

Referências

  http://www.rhbr.com.br/modules.php?name=News&file=article&sid=908 
  http://www.vivaolinux.com.br/artigo/Squid-autenticando-em-base-Active-Directory/?pagina=2 
  http://www.linuxman.pro.br/squid/
Ferramentas pessoais