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.645 ]

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

Squid3 + Ubuntu Lucid 10.04 + Kerberos Auth + AD

Squid3 com bloqueio HTTPS [que realmente funciona] - Versão 3.5.22

Squid + SSL

Configurar servidor proxy Squid (Ubuntu)

Controle de clientes e acessos no Squid

  
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




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner
Linux banner
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts