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: 72.514 ]

Por: Junior Rocha em 11/08/2009


Configurando o MySQL



Abra um terminal como root e logue-se no seu servidor MySQL com os seguintes comandos:

mysql -u root -p

Será requisitado uma senha, que é a senha do seu servidor MySQL. Ser tudo der certo você estará logado no console do MYSQL, que é mais ou menos assim:

Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 521
Server version: 5.0.51a-24+lenny1 (Debian)

Type "help" or "\h" for help. Type "\c" to clear the buffer.

mysql>

Bom, se sua tela está assim parabéns, seu servidor MySQL está rodando e pronto para brincar conosco!

Para visualizar as bases criadas digite:

mysql> show databases;

Para selecioná-las, digite:

mysql> use nome_da_base;

Em nosso caso vamos criar uma base de dados com o nome de "Squid". Digite o seguinte comando:

mysql> create database Squid;

e dê um enter. A saída será esta:

Query OK, 1 row affected (0.01 sec).

Em seguida selecione a base que acabamos de criar para podermos trabalhar nela:

mysql> use Squid;

e dê um enter.

Criando as tabelas

Agora vamos criar a tabela que conterá as informações de nome, senha e status do nossos usuários do Squid. Se você analisar, nós podemos ter 3 situações de usuário no nosso servidor proxy: usuário existe, usuário não existe, usuário desabilitado. Quando usamos a autenticação ncsa_auth, para desabilitar um usuário adicionamos o caractere "#" para comentar a linha e ignorá-la, como estamos utilizando uma base dados, utilizaremos um número (0 ou 1) para determinar o status do usuário: 0 = desabilitado e 1 = habilitado.

Para criar a tabela, siga os procedimentos:

mysql> CREATE TABLE usuarios (
nome varchar(100) NOT NULL,
senha varchar(15) NOT NULL,
status tinyint(1) NOT NULL default "1",
PRIMARY KEY (NOME)
);


Se tudo ocorrer de maneira correta você terá a mensagem "Query OK...".

Para melhor entendimento, vamos às explicações: criamos uma tabela chamada usuários que contém três campos: nome, senha e status. O campo nome não pode ser em branco e você tem 100 caracteres para digitar, o campo senha também não pode ser em branco e você tem 15 caracteres livres e o campo status você tem a opção de colocar 0 ou 1 e por padrão a flag é zero.

Agora vamos inserir dois usuários para podermos efetuar os testes, ainda com sua base de dados selecionada, digite os seguintes comandos:

mysql> INSERT INTO usuarios VALUES ('vol1', encrypt('senha1'), 1);
mysql> INSERT INTO usuarios VALUES ('vol2', encrypt('senha2'), 0);

Observe que o usuário vol1 está habilitado, diferentemente do usuário vol2.

O parâmetro encrypt antes da senha significa que a sua senha estará devidamente criptografada, porém, isso não pede que suas senhas trafeguem na rede em texto plano base64.

Pronto! Nosso banco de dados está devidamente criado e configurado, agora iremos configurar o Squid para autenticar em nossa base de dados.

Criando o script

Dentro da pasta /usr/lib/squid você terá alguns arquivos executáveis, que nada mais são do que scripts dos métodos de autenticação existentes para seu Squid.

Procure algum script com o nome de mysqlt_auth. Se não tiver, crie-o. Se tiver, mova-o para um arquivo de backup. Partindo do pressuposto que você está criando o arquivo, edite e deixe-o com as seguintes linhas:

#!/usr/bin/php
<?
$link = mysqli_connect("localhost", "usuario_do_banco", "senha_do_banco");

if (!$link) {
   printf("Erro ao Conectar com o Banco de Dados: %s\n", mysqli_connect_error());
   die();
}

$selectdb = mysqli_select_db($link, "Squid");

if (!$selectdb) {
   printf("Erro ao Abrir o Banco de Dados: %s\n", mysqli_error($link));
   die();
}

while ( fscanf(STDIN, "%s %s", $nome, $senha) ) {
   $select = "SELECT nome, senha FROM usuarios WHERE nome = '".$nome."' AND status = 1";
   $Query = mysqli_query($link, $select);
   $nrRegistros = mysqli_num_rows($Query);
   $erro = true;

   while ( $Registro = mysqli_fetch_array($Query) ) {
      $erro = false;

      if ( crypt($senha, $Registro[senha]) ==    $Registro[senha] ) printf("OK\n");
      else printf("ERR\n");
   }
      if ($erro) printf("ERR\n");
}
?>

Certifique-se que todas as informações como nome, senha, nome do banco, senha e host correspondam as informações do seu servidor. A estrutura do script acima é bem objetiva: se os dados de localhost, senha e nome do banco estiverem corretos, você estará conectado a sua base. A seguir, ele selecionará a sua base, que colocamos com o nome de Squid. Por padrão ele lê o nome de usuário e senha digitados. A seguir, faz leitura de usuários que contenham seu status como "1" (habilitado).

Caso ocorra algum erro, o mesmo é retornado. Se encontrado algum usuário, continua a operação. Compara a encriptação da senha digitada com a senha digitada pelo usuário. Se houver algum erro de digitação de usuário/senha, aparece o erro e volta ao início.

Para finalizar, execute o comando como root:

# chmod +x mysqlt_auth

para tornar o arquivo um executável, no qual será iniciado posteriormente pelo processo do Squid.

Página anterior     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

Gerando e gerenciando relatórios mensais com o SARG

Squid com autenticação

Squid autenticando em Win2000/2003 com Debian Etch

Squid + SSL

Administrando Squid pelo browser, bloquear e liberar máquinas por IP, login, palavras

  
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: mcsba@hotmail.com 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




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts