Autenticando usuários do Squid em um banco de dados MySQL

Quando surge a necessidade de incrementar nossos serviços, a utilização de um banco de dados para centralizar informações é extremamente válida. Neste artigo veremos como implementar a autenticação de usuários do Squid em uma tabela no banco de dados MySQL.

[ Hits: 69.532 ]

Por: Junior Rocha em 11/08/2009


Cenário e necessidades



Como administrador, gosto de tudo bem organizado e o mais simplificado possível, principalmente para manutenção e integração com o usuário. Bem, sabemos que a necessidade de disponibilizar um controle "amigável" para que gerentes e chefes de produção "controlem" as páginas e gerenciem os usuários é extremamente grande. Além de termos um novo método de autenticação do MySQL, podemos no futuro criar algumas páginas em PHP para interagir com o banco de dados e efetuar algumas alterações via WEB.

Sem contar que tendo um banco de dados, o backup pode ser mais simplificado e objetivo. Se você tem o MSN-proxy configurado, logs do Squid direcionados para o MySQL, agora você pode ter também os seus usuários, e posteriormente suas listas de sites bloqueados e liberados todos em um banco MySQL.

Esta solução com MySQL visa a robustez e a integridade dos dados. Outra solução alternativa a autenticação em banco de dados seria LDAP com Fedora DS, Server LDAP pré-configurado ou quem sabe até mesmo no AD da Microsoft, muitas vezes por termos ambientes corporativos híbridos.

Por padrão a autenticação do Squid é ncsa_auth. Um arquivo criado com o comando "htpasswd -cb arquivo usuário senha" já pode ser utilizado para autenticar usuários do Squid com o módulo nsca_auth, encontrado em /usr/lib/squid (Distribuições Debian Like). Porém, vamos mudar um pouco isso e começar a autenticar em uma base do MySQL.

O que foi utilizado para efetuar este artigo?

Foi utilizada a distribuição Debian Lenny, atualizada e com os pacotes do MySQL já instalados e do PHP também. Mas já que você não tem nada instalado e não sabe como proceder, esses comandos devem resolver:

# apt-get install mysql-server-5.0 mysql-client-5.0 libmysqlclient15-dev php5-cli php5-mysql php5-common squid

Após a instalação dos pacotes acima, vamos configurar o MySQL e o Squid e termos um novo método de autenticação no nosso servidor proxy.

    Próxima página

Páginas do artigo
   1. Cenário e necessidades
   2. Configurando o MySQL
   3. Configurando o Squid
   4. Testes, considerações e observações
Outros artigos deste autor

Administrando usuários do Squid via web como o Admuser

Executando comandos DML em base de dados MySQL através do Eclipse PHP (Bônus: Temas e Fontes no Eclipse)

Leitura recomendada

Squid com autenticação básica + Gerador de relatórios Sarg - Instalação e configuração

Administrando usuários do Squid via web como o Admuser

Otimização Servidores Linux para Cache usando Squid

Squid autenticando em base Active Directory

Squid + proxy transparente + autentificação + SSL

  
Comentários
[1] Comentário enviado por ramos1986 em 11/08/2009 - 11:25h

Parabéns pelo artigo.

[2] Comentário enviado por junior em 11/08/2009 - 13:50h

Obrigado amigo! Espero que esta solução lhe seja útil.

[3] Comentário enviado por andrefreire em 12/08/2009 - 08:08h

Parabéns pelo artigo, mas gostaria de saber se ao invés de basic a autenticação não poderia ser ntlm ?

[4] Comentário enviado por junior em 12/08/2009 - 13:26h

Olá André, funciona com ntlm sim, basta compilar o ntlm na instalação do squid e depois alterar o parâmetro de autenticação de basic para ntlm.

Um abraço.

[5] Comentário enviado por info24hs em 13/08/2009 - 09:40h

Funciona com proxy transparent?

[6] Comentário enviado por junior em 13/08/2009 - 11:42h

Olá amigo, se você utiliza o proxy.pac ou wpad.dat infelizmente esta solução por ser autenticada, não funciona com proxy transparente.
Até agora, nunca vi Squid autenticado funcionar com proxy transparente.
=/

[7] Comentário enviado por aazevedo1984 em 19/08/2009 - 13:23h

Como faria p/ criar grupos de acesso, por exemplo: o grupo adm tem acesso a tudo e o grupo users somente a alguns sites pre-determinados?

[8] Comentário enviado por junior em 19/08/2009 - 13:44h

Olá amigo, aazevedo.

O que você quer pode ser feito sem problemas, este é um tema que abordarei em um próximo artigo, que já está quase saindo do forno.

Um abraço!

[9] Comentário enviado por mcsba em 24/08/2009 - 10:31h

Caro, Junior Rocha.
Quando tento executar o wpad.dat acontece o seguinte erro:
Fatal error: Call to undefined function: mysqli_connect() in /usr/lib/squid/mysqlt_auth on line 3


Tem idéia do pode ter acontecido?

[10] Comentário enviado por junior em 24/08/2009 - 13:37h

Olá amigo, verifique a seguinte linha do seu arquivo: $link = mysqli_connect("localhost", "usuario_do_banco", "senha_do_banco");

O que pode estar acontecendo é que as "variáveis" localhost, usuario_do_banco e senha_do_banco não estão definidas corretamente.
Dê uma olhada, salve o arquivo e reinicie o squid, e me dê um feedback dos testes.
Um abraço

[11] Comentário enviado por mcsba em 24/08/2009 - 18:11h

Caro, Junior.

Fiz os testes que você me pediu e continuou apresentando mesmo erro.

Fatal error: Call to undefined function: mysqli_connect() in /usr/lib/squid/mysqlt_auth on line 3

Se puder me ajudar: [email protected] ou pelo skype: mcsba78

Desde já agradeço.

[12] Comentário enviado por junior em 11/09/2009 - 16:19h

Olá amigos, só para dar um "up" no artigo, o problema do amigo Márcio já foi resolvido.
O Márcio me informou via Skype, que o problema era com uma biblioteca do MySQL.

Fica a dica: Certifiquem-se de que todos os pacotes estão devidamente instalados antes de colocar a solução em prática.

Um abraço!

[13] Comentário enviado por magnolinux em 29/09/2009 - 12:40h

Very good ....

show de bola;;

[14] Comentário enviado por calraiden em 05/05/2010 - 16:33h

Não fufa.. recomendo lerem : http://wiki.squid-cache.org/ConfigExamples/Authenticate/Mysql

[15] Comentário enviado por junior em 05/05/2010 - 19:15h

Onde que não funciona amigo?
Fiz e funcionou, tenho em ambiente de produção.
Se você tiver alguma dúvida, poste os erros ou algo assim que poderemos ajudar.

[16] Comentário enviado por eduardo_jst em 28/07/2010 - 18:40h

Boa noite junior, por favor atraves do seu artigo, como eu crio outras acl por grupos e usuarios, por exemplo grupo diretoria ter acesso total e demais grupos acessos restritos apenas a sites de trabalhos, ou por exemplo o usuario joao do grupo adm q tenha acessos previlediados a certos sites, sendo q ele é do mesmo grupo q maria e não acessa....isso é possivel, ando pesquisando, mas não achei nada parecido.

Agradeço se puder me ajudar.

[17] Comentário enviado por patrese em 26/08/2011 - 11:24h

Olá Junior sei que faz um tempo que colocou esse artigo.
Bom implementei ficou legalzinho só que tenho uma duvida que apanhei um pouquinho e ainda não consegui fazer =/
no arquivo mysqlt_auth eu gostaria de colocar um redirecionamento para uma outra pagina quando o usuario digitasse uma senha ex: senha = 123 vai para uma pagina que criei para troca de senha.

se voce já fez isso será que poderia compartilhar ou dar alguma luz, Obrigado desde já

[18] Comentário enviado por junior em 26/08/2011 - 11:48h

@patrese: Olá amigo, tudo bom? Primeiramente fico feliz que tenha consiguido implementar a autenticação. Agora sobre a sua dúvida: Sinceramente, redirecionar direto no mysql_auth desconheço alguma solução. O que você poderia fazer, é criar uma página simples em php, usando $sessions, para pegar o usuário logado e mostrar uma página para ele trocar a senha. Fora isso, diretamente pelo mysql_auth, infelizmente não sei como fazer.

[19] Comentário enviado por thiagosc em 21/08/2012 - 08:49h

Artigo excelente. Porém não se aplica mais a versão lenny, pelo que vi não tem esses pacotes mais no repositório.

[20] Comentário enviado por marcos1968 em 06/10/2012 - 09:48h

OI PESSOAL EU USEI ESTE SCRIPT SÓ QUE ELE NÃO FECHA O PROCESSO DE CONEXÃO COM O BANCO DE DADOS.
SE ALGUEM SOUBER COMO POSTE,POIS JA TESTEI mysql_close(); E ATÉ AGORA NADA PRECISO ESTAR MATANDO OS PROCESSOS NA MÃO.

[21] Comentário enviado por leorocco em 09/05/2013 - 19:18h

Pessoal, como vão? Primeiro queria agradecer pelo artigo, muito bom! Era o que eu procurava.. Porém, aqui tá meio estranho... Estou testando num servidor Debian e um cliente Windows 7, ambos no VirtualBox. No servidor, aparentemente tudo certo! No cliente, está navegando e tudo mais.. inclusive passando por bloqueios. Só que nao aparece nenhuma janela para eu me autenticar. Ele navega direto. O que pode ser? Segue squid.conf. Abraço!

http_port 3128
visible_hostname debian-server2

cache_mem 64 MB
maximum_object_size_in_memory 64 KB
maximum_object_size 512 MB
minimum_object_size 0 KB
cache_swap_low 90
cache_swap_high 95
cache_dir ufs /var/spool/squid 2048 16 256
cache_access_log /var/log/squid/access.log
refresh_pattern ^ftp: 15 20% 2280
refresh_pattern ^gopher: 15 0% 2280
refresh_pattern . 15 20% 2280

# [ Autenticação de Usuários ]
auth_param basic program /usr/lib/squid/mysqlt_auth
auth_param basic children 5
auth_param basic realm VOL Proxy - Digite o Usuário e a Senha:
auth_param basic credentialsttl 1 hours
auth_param basic casesensitive off

acl all src 0.0.0.0/0.0.0.0
acl manager proto cache_object
acl localhost src 127.0.0.1/255.255.255.255
acl SSL_ports port 443 563
acl Safe_ports port 21 80 443 563 70 210 280 488 59 777 901 1025-65535
acl purge method PURGE
acl CONNECT method CONNECT

http_access allow manager localhost
http_access deny manager
http_access allow purge localhost
http_access deny purge
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports

acl bloqueados url_regex -i "/etc/squid/bloqueados"
http_access deny bloqueados


acl redelocal src 10.1.1.0/24
http_access allow localhost
http_access allow redelocal

http_access deny all


PS.: Estou usando wpad. Influencia? Preciso colocar alguma coisa no wpad.dat?

---------------

Pessoal, foi mal. Primeira vez que estou colocando o squid autenticado, smp usei transparente... Faltou uma ACL aí :PP

[22] Comentário enviado por junior em 13/05/2013 - 10:08h

@leorocco: Você redirecionou o tráfego da porta 80 para 3128 no iptables?

Tente usar sem o WPAD primeiro, colocando o proxy na mão e vê se funciona.

[23] Comentário enviado por victormredes em 27/01/2014 - 13:47h

Fala Junior! blz?

Utilizo Ubuntu + Squid3

Estou com um problema, quando vou navegar aparece essa mensagem:

ERROR

The requested URL could not be retrieved

The following error was encountered while trying to retrieve the URL: /

URL inválida

Some aspect of the requested URL is incorrect.

Some possible problems are:

Protocolo de acesso incorreto ou faltando (deve ser http:// ou similar)

Faltou o hostname

Illegal double-escape in the URL-Path

Hostname com caracter inválido; não são permitidos underscores.

Your cache administrator is webmaster.


Generated Mon, 27 Jan 2014 15:19:14 GMT by liesch-proxy (squid/3.1.19)





Quando ativo a opção "transparent"
Aparece essa mensagem:

ACESSO NEGADO

Por motivos de segurança, o sistema não permitiu o acesso ao link: http://www.fvr.edu.br/

Proibido o Acesso.

Access control configuration prevents your request from being allowed at this time. Please contact your service provider if you feel this is incorrect.

Your cache administrator is webmaster.


meu squid.conf:

# [Configuração de Portas e Nomes ]
http_port 3128
icp_port 3130
visible_hostname liesch-proxy
hierarchy_stoplist cgi-bin ?
acl QUERY urlpath_regex cgi-bin \?
cache_dir ufs /var/spool/squid3 256 20 384
cache_mem 128 MB

# [ Melhoramento do Sistema e Cache ]
maximum_object_size 1024 MB
minimum_object_size 10 KB
cache_swap_low 50
cache_swap_high 90
cache_access_log /var/log/squid3/access.log
error_directory /usr/share/squid3/errors/Portuguese

refresh_pattern ^ftp: 1440 20% 10080
refresh_pattern ^gopher: 1440 0% 1440
refresh_pattern . 0 20% 4320

# [ Autenticação de Usuários ]
auth_param basic program /usr/lib/squid3/mysqlt_auth
auth_param basic children 5
auth_param basic realm VOL Proxy - Digite o Usuário e a Senha:
auth_param basic credentialsttl 1 hours
auth_param basic casesensitive off

# [ Controle de Acessos ]
#acl all src 0.0.0.0/0.0.0.0
delay_pools 1
delay_class 1 2
delay_parameters 1 194688/194688 39768/39768
delay_access 1 allow all
acl manager proto cache_object
#acl localhost src 127.0.0.1/255.255.255.255
acl to_localhost dst 127.0.0.0/8

# [ Controle de Acessos - Safe Ports ]
acl Safe_ports port 21
acl Safe_ports port 70
acl Safe_ports port 80
acl Safe_ports port 210
acl Safe_ports port 280
acl Safe_ports port 443
acl Safe_ports port 488
acl Safe_ports port 591
acl Safe_ports port 631
acl Safe_ports port 873
acl Safe_ports port 1025

# [ Controle de Acessos - SSL Ports ]
acl SSL_ports port 443 563
acl SSL_ports port 873
acl purge method PURGE
acl CONNECT method CONNECT
no_cache deny QUERY

# [ Controle de Acessos - Http Access ]
#http_access allow manager localhost
http_access deny manager
#http_access allow purge localhost
http_access deny purge
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
#http_access allow localhost
http_access deny to_localhost

# [ ACLs Personalizadas ]
acl rede_interna src 10.0.0.0/21
acl usuarios proxy_auth /etc/squid3/usuarios

# * Acessos Finais *
http_access allow usuarios
http_access deny all
http_access deny !rede_interna
http_access allow rede_interna



[24] Comentário enviado por appolo em 13/03/2014 - 12:41h

Gostei. Muito bom.

Mas eu tenho um problema. Se eu já tiver uma lista de mais de 500 usuários já cadastrados e criptografados em NCSA usando o htpasswd.

Pergunto, tenho como aproveitar esse cadastro para o MySQL?

Obrigado.

[25] Comentário enviado por pauloedson em 08/08/2017 - 13:45h

JUNIOR,

em primeiro lugar, parabéns pela iniciativa de compartilhar o conhecimento, pois tbm estou querendo colocar tal ideia em produção.

pois bem, o seu louvável artigo diz o seguinte.: "Dentro da pasta /usr/lib/squid você terá alguns arquivos executáveis [...]". no meu debian 9, esta mesma pasta possui três tipos de arquivos.:

01. a maioria são do TIPO biblioteca compartilhada;
02. arquivos do TIPO script perl; e,
03. arquivos do TIPO script shell.

portanto, quando vc sugere criar um arquivo de nome "mysqlt_auth", caso não exista dentro da pasta, por sinal, o meu caso, ele sera de que tipo?!


Contribuir com comentário