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/
