quinta-feira, 21 de maio de 2009

Artigo - Squid com Autenticação manual facilitado por script

Neste artigo vamos instalar um script muito simples para manipular o squid em uma pequena rede. Este script nos ajudará de forma bem simples e objetiva fazer as tarefas mais comuns como adicionar/excluir usuário, definir a senha do usuário, adicionar e remover sites proibidos, permitidos e sites para o horário de almoço.

Primeiramente vamos instalar os pacotes

# apt-get update
# apt-get install squid squidview dialog

Edite seu squid.conf, comente a linha "http_access deny all" e insira as linhas abaixo ao final do arquivo( verifique o caminho do arquivo ncsa_auth da sua distribuição)

# vim /etc/squid/squid.conf
# -------------------------------------------------------------------------
auth_param basic program /usr/lib/squid/ncsa_auth /etc/squid/autenticacao
auth_param basic children 5
auth_param basic realm Digite seu usuário e senha

authenticate_ttl 1 minute
authenticate_ip_ttl 5 minutes

acl updates url_regex -i "/etc/squid/updates"
acl usuariosliberados proxy_auth "/etc/squid/usuariosliberados"
acl usuariosexcecao proxy_auth "/etc/squid/usuariosexcecao"
acl sitesproibidos url_regex -i "/etc/squid/sitesproibidos"
acl usuarioslimitados proxy_auth "/etc/squid/usuarioslimitados"
acl sitespermitidos url_regex -i "/etc/squid/sitespermitidos"
acl sitesalmoco url_regex -i "/etc/squid/almoco"
acl happyh time MTWHF 11:30-13:30

http_access allow updates !sitesproibidos
http_access allow usuarioslimitados happyh sitesalmoco !sitesproibidos
http_access allow usuarioslimitados sitespermitidos !sitesproibidos
http_access allow usuariosexcecao !sitesproibidos
http_access allow usuariosliberados
http_access deny all
#--------------------------------------------------------FIM----------------

Edite o arquivo squidadm e cole o script abaixo dentro dele

# vim /usr/local/bin/squidadm

# ---------------------------------------------------------------------------
#!/bin/bash
# Autor: Gelber de Arruda Junior juniorwinfor@yahoo.com.br
# Data: 15/05/2009
# Função do Script: Administrar squid com autenticação
#
# Este programa é um software livre que pode ser copiado e distribuído
# nos termos da Licença Pública Geral GNU (GNU General Public License -
# GPL) versão 2 da licença ou, a seu critério, qualquer versão posterior.
# Este programa foi criado na expectativa de ser útil, porém NÃO POSSUI
# NENHUMA GARANTIA, EXPRESSA, IMPLÍCITA OU DE ATENDIMENTO A ALGUMA
# DETERMINADA FINALIDADE.
Usuariosliberados=/etc/squid/usuariosliberados
Usuarioslimitados=/etc/squid/usuarioslimitados
Usuariosexcecao=/etc/squid/usuariosexcecao
Sitesperm=/etc/squid/sitespermitidos
Sitespro=/etc/squid/sitesproibidos
Sitesupdates=/etc/squid/updates
Siteshappy=/etc/squid/almoco
Arqusu=/etc/squid/cadusuarios
Arqsenhas=/etc/squid/autenticacao
Listusu="$Arqusu"
TMPFILE1=/tmp/tmp1
TMPFILE2=/tmp/tmp2
TMPFILE3=/tmp/tmp3
TMPFILE4=/tmp/tmp4

Squidmenu() {
while : ; do
resposta=
resposta=$( dialog --stdout \
--title 'Administração de Navegação' \
--ok-label 'OK' \
--cancel-label 'Voltar' \
--menu 'Opções:' 0 0 0 1 'Exibir Listagem' 2 'Manipular Usuários' 3 'Sites de Updates' 4 'Sites Liberados' \
5 'Sites Bloqueados' 6 'Sites Almoço' 7 'SquidView' 9 'Aplicar' )
[ $? -ne 0 ] && break
case "$resposta" in
1) Mostrarlistagem ;;
2) titulo="Usuários"
listusu=$Arqusu
Manipusu ;;
3) titulo=Sites_de_Updates
listsite=$Sitesupdates
Manipsites ;;
4) titulo="Sites_Permitidos"
listsite=$Sitesperm
Manipsites ;;
5) titulo="Sites_Bloqueados"
listsite=$Sitespro
Manipsites ;;
6) titulo="Sites_Almoço"
listsite=$Siteshappy
Manipsites ;;
7) squidview ;;
9) Aplicalist ;;
0) break ;;
esac
done
}

Manipusu() {
while : ; do
[ -s "$listusu" ] || echo "usuario|limitado|senha" >> $listusu
resposta3=$( \
dialog --stdout \
--title ''$titulo'' \
--ok-label 'Adicionar' \
--extra-button \
--extra-label 'Editar' \
--cancel-label 'Voltar' \
--menu '' 0 60 0 \
$(for lnusu in `cat $listusu`; do
nmusu=`echo $lnusu | awk -F "|" '{print $1}'`
catusu=`echo $lnusu | awk -F "|" '{print $2}'`
echo "$nmusu $catusu"
done))
bt="$?"
case "$bt" in
0) usuadicionando=$( dialog --stdout \
--title 'Adicionar Usuários' \
--ok-label 'Adicionar' \
--cancel-label 'Cancelar' \
--inputbox 'Digite o novo usuário a ser adicionado:' \
0 0 )
if [ -z "$usuadicionando" ]; then
sleep 0
else
senhaadicionando=$( dialog --stdout \
--title 'Senha:' \
--ok-label 'OK' \
--cancel-label 'Cancelar' \
--inputbox 'Digite uma senha para o novo usuário:' \
0 0 )
if [ -z "$senhaadicionando" ]; then
sleep 0
else
echo "$usuadicionando|Limitado|$senhaadicionando" >> $listusu
fi
fi
;;
1) break ;;
3) resposta2=
resposta2=$( dialog --stdout \
--title 'Editar Usuário' \
--ok-label 'OK' \
--cancel-label 'Voltar' \
--menu 'Selecione uma opção para o Usuário '$resposta3'' 0 0 0 1 'Definir Senha' 2 'Definir Categoria' \
3 'Excluir' )
if [ $? -ne 0 ]; then
sleep 0
else
case "$resposta2" in
1) senhaeditando=$( dialog --stdout \
--title 'Senha:' \
--ok-label 'OK' \
--cancel-label 'Cancelar' \
--inputbox 'Digite uma senha para o usuário '$resposta3':' \
0 0 "$senhausu" )
if [ -z "$senhaeditando" ]; then
sleep 0
else
[ -e $TMPFILE1 ] && rm $TMPFILE1
for lnusu in `cat $listusu`; do
nmusu=`echo $lnusu | awk -F "|" '{print $1}'`
catusu=`echo $lnusu | awk -F "|" '{print $2}'`
senhausu=`echo $lnusu | awk -F "|" '{print $3}'`
if [ "$nmusu" = "$resposta3" ]; then
echo "$nmusu|$catusu|$senhaeditando" >> $TMPFILE1
else
echo $lnusu >> $TMPFILE1
fi
done
senhausu=
mv $TMPFILE1 $listusu
fi ;;
2) Defcategusu ;;
3) [ -e $TMPFILE4 ] && rm $TMPFILE4
dialog \
--title 'Confirma exclusão?' \
--yesno "Tem certeza que deseja excluir o usuário "$resposta3"?
" 0 0
if [ "$?" -ne 0 ]; then
sleep 0
else
egrep -v "$resposta3" $Arqusu > $TMPFILE4
mv $TMPFILE4 $Arqusu
fi
;;
esac
fi
;;
esac
done
}

Mostrarlistagem() {
echo " Usuário | Categoria | Senha |" > $TMPFILE3
echo " | | |" >> $TMPFILE3
for cli in `cat $Arqusu`; do
echo $cli | awk -F "|" '{printf"%15s | %13s | %14s |\n" ,$1,$2,$3}' >> $TMPFILE3
done
echo "" >> $TMPFILE3
dialog \
--title 'Listagem de Usuários' \
--textbox $TMPFILE3 \
0 0
}


Defcategusu() {
[ -s "$listusu" ] || echo "usuario|senha" >> $listusu
resposta4=
resposta4=$( dialog --stdout \
--title 'Categoria de Usuário' \
--ok-label 'OK' \
--cancel-label 'Sair' \
--menu 'Selecione uma categoria para o usuário '$resposta3'' 0 0 0 1 'Limitado' \
2 'Exceção' 3 'Liberado' )
[ $? -ne 0 ] && break
[ -e $TMPFILE2 ] && rm $TMPFILE2
for lnusucad in `cat $Arqusu`; do
senhausu=`echo "$lnusucad" | awk -F "|" '{print $3}'`
catcli=`echo "$lnusucad" | awk -F "|" '{print $2}'`
clinome=`echo "$lnusucad" | awk -F "|" '{print $1}'`
if [ "$clinome" = "$resposta3" ]; then
[ "$resposta4" = "1" ] && echo "$clinome|Limitado|$senhausu" >> $TMPFILE2
[ "$resposta4" = "2" ] && echo "$clinome|Exceção|$senhausu" >> $TMPFILE2
[ "$resposta4" = "3" ] && echo "$clinome|Liberado|$senhausu" >> $TMPFILE2
else
echo "$lnusucad" >> $TMPFILE2
fi
done
mv $TMPFILE2 $Arqusu
}

Aplicalist() {
echo "NenhumNomePodeSerCompatívelcomEssaLinha93453489347" > $Usuariosliberados
echo "NenhumNomePodeSerCompatívelcomEssaLinha93453489347" > $Usuarioslimitados
echo "NenhumNomePodeSerCompatívelcomEssaLinha93453489347" > $Usuariosexcecao
[ -e $Arqsenhas ] && rm $Arqsenhas
touch $Arqsenhas
for linecli in `cat $Arqusu`; do
senhausu=`echo "$linecli" | awk -F "|" '{print $3}'`
catcli=`echo "$linecli" | awk -F "|" '{print $2}'`
clinome=`echo "$linecli" | awk -F "|" '{print $1}'`
[ "$catcli" = "Liberado" ] && echo "$clinome" >> $Usuariosliberados
[ "$catcli" = "Limitado" ] && echo "$clinome" >> $Usuarioslimitados
[ "$catcli" = "Exceção" ] && echo "$clinome" >> $Usuariosexcecao
param=
[ -s "$Arqsenhas" ] || param="-c"
htpasswd -b $param $Arqsenhas $clinome $senhausu
clear
done
squid -k reconfigure
}

Manipsites() {
[ -s "$listsite" ] || echo "www.sitecadastrado.com" >> $listsite
catt=
while : ; do
resposta3=$( \
dialog --stdout \
--title ''$titulo'' \
--ok-label 'Adicionar' \
--extra-button \
--extra-label 'Remover' \
--cancel-label 'Voltar' \
--menu '' 30 70 27 \
$(for st in `cat $listsite`; do
mostrar=`echo $st | awk -F "|" '{print $1}'`
catt=`echo $st | awk -F "|" '{print $2}'`
[ -z "$catt" ] && catt="-"
echo "$mostrar" "$catt"
done))
bt="$?"
case "$bt" in
0) siteadding=$( dialog --stdout \
--title 'Adicionar Site' \
--ok-label 'Adicionar' \
--cancel-label 'Cancelar' \
--inputbox 'Digite o novo site a ser adicionado:' \
0 0 )
if [ -z "$siteadding" ]; then
sleep 0
else
echo $siteadding >> $listsite
fi
;;
1) break ;;
3) dialog \
--title 'Confirma exclusão?' \
--yesno "Tem certeza que deseja excluir o site "$resposta3"?
" 0 0
if [ "$?" -ne 0 ]; then
sleep 0
else
egrep -v "$resposta3" $listsite > $TMPFILE4
mv $TMPFILE4 $listsite
fi
;;
esac
done
}

Squidmenu
# ----------------------------------------FIM-------------------------------------

Dê permissão de executável para o script

# chmod +x /usr/local/bin/squidadm

Chame o script e entre em todas as opções começando da 1 até a 9 para que ele crie todos os arquivos necessários para o squid iniciar e inicie o squid.

# squid &

Este script em conjunto com as configurações no squid.conf trabalha da seguinte forma:

- Trabalha com 4 lista de sites
Proibidos - Sites proibidos a todos exceto usuários liberados
Permitidos - Sites permitidos a todos exceto sem autenticação
Almoço - Sites permitidos aos usuários limitados no horário de almoço
Updates - Sites liberados sem autenticação para atualizar sistema e antivirus e fazer alguns acessos java a bancos

- Trabalha com 4 tipos(categorias) de usuários
Sem autenticação(não loga como usuário) - Somente tem acesso a lista de sites updates
Usuarios limitados - Tem acesso aos sites permitidos durante o tempo todo e acesso aos sites permitidos + sites almoço durante o horário de almoço
Usuários exceção - Tem acesso a todos os sites exceto os sites proibidos
Usuário liberados - Tem acesso a todos os sites

- Em "manipular usuários" você pode
Adicionar usuários
Editar mudando a senha ou o tipo (categoria)
Excluir o usuário

Para uma melhor compreensão veja a planilha abaixo.

Não se esqueça de colocar o proxy configurado manualmente nas estações que irão passar pelo proxy. Uma boa dica para que os usuários não retirem essa configuração burlando o proxy é colocar a seguinte linha no script de firewall:

iptables -t nat -A PREROUTING -i eth1 -p tcp -d ! 200.201.174.207 --dport 80 -j REDIRECT --to-port 3128

Bom proveito!!!

3 comentários:

  1. Não funcionou, fiz tudo e no final ele faz isso:
    root@astiefw:/etc/squid# squid &
    2009/10/01 19:12:23| aclParseAclLine: WARNING: empty ACL: acl updates url_regex -i "/etc/squid/updates"
    2009/10/01 19:12:23| aclParseAclLine: WARNING: empty ACL: acl sitesproibidos url_regex -i "/etc/squid/sitesproibidos"
    2009/10/01 19:12:23| aclParseAclLine: WARNING: empty ACL: acl sitespermitidos url_regex -i "/etc/squid/sitespermitidos"
    2009/10/01 19:12:23| aclParseAclLine: WARNING: empty ACL: acl sitesalmoco url_regex -i "/etc/squid/almoco"
    [1] 4425

    ResponderExcluir
  2. Consegui fazer rodar mas ta dando problema na autenticação do usuario. Eu abro o navegador ele pede usuario e senha, mas ele não autentica. Sabe me dizer porque? Agradeço desde já.

    ResponderExcluir
  3. tenta um "chmod 777 /etc/squid/autenticacao"(ou arquivo definido por vc)

    qualquer coisa posta o log do squid pra gente ter uma ideia melhor do que está acontecendo.

    ResponderExcluir