Você está na página 1de 7

Autenticao Squid com base em Tabelas MySql

Um assunto muito recorrente, para quem trabalha com administrao de proxys, a necessidade de
se fazer autenticao dos usurios com base em uma determinada lista de acesso. Geralmente,
questo apenas de fazer a configurao correta do Squid, definir alguns arquivos texto com as
informaes e pronto. Porm, no caso de empresas grandes, desejvel que esta informao seja
reutilizada a partir de alguma j existente, geralmente em forma de dados em tabelas de um banco
de dados qualquer.
Utilizo em algumas empresas um script bem simples, que eu mesmo desenvolvi, para esta tarefa.
Qual no foi minha surpresa, ao saber que fazer isto uma dvida bastante buscada na Internet por
outras pessoas e, quase sempre, no resolvida. A maioria utiliza alguns projetos complicados, outros
j recomendam partir para alguma soluo mais rebuscada (e, talvez, at mais correta) como LDAP
e outros.
Porm, basta um script e uma ou outra configurao e a questo est resolvida. Decidi ento
compartilhar, aqui, o script que instalo nas mquinas que administro. Seu uso bem simples. Na
verdade, se voc pegar e simplesmente seguir os passos aqui descritos, vers que algo trivial.
Porm, para manter a qualidade dos artigos aqui publicados, este serve tambm como um tutorial
para que voc entenda um pouco mais do funcionamento dos mecanismos de autenticao do Squid.
Sobre este tutorial:
Baseado na distribuio Ubuntu 7.10 Server
Dificuldade de execuo: Fcil
Nivel de conhecimento: Avanado
Pr-requisitos
Conhecimentos bsicos sobre o proxy Squid
Conhecimentos bsicos sobre o banco de dados MySql
Entendimento prvio do que se pretende fazer
Servidor Linux j instalado e configurado
Banco de dados MySql e Squid j instalados e configurados
Para os apressados
Se voc no quer perder tempo com conceitos, ou s quer uma receita de bolo, aqui esto os
procedimentos, considerando a instalao do pacote php5-cli (desconsidere se j instalado):

$ sudo su -
Password: sua_senha
# cat << EOF > CriaBanco_AutenticaSquid.sql
CREATE DATABASE AutenticaSquid;
USE AutenticaSquid;
CREATE TABLE Usuarios (
nome varchar(255) NOT NULL,
senha varchar(255) NOT NULL,
ativo tinyint(1) NOT NULL default '1',
PRIMARY KEY (nome),
KEY nome (nome)
) COMMENT = 'AutenticaSquid - Usuarios';
INSERT INTO Usuarios VALUES ('usuario1', encrypt('senha1'), 1);
INSERT INTO Usuarios VALUES ('usuario2', encrypt(''), 0);
EOF
# mysql -u usuario_do_banco -p < CriaBanco_AutenticaSquid.sql
Password: senha_do_banco
# apt-get install php5-cli
# cd /usr/lib/squid

# cat << EOF > mysqlt_auth


#!/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, "AutenticaSquid");
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 ativo = 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");
}
?>
EOF

# vi /etc/squid/squid.conf
(...)
auth_param basic children 5
auth_param basic realm Descrio do seu servidor
auth_param basic credentialsttl 2 hour
auth_param basic program /usr/lib/squid/mysqlt_auth
(...)
acl usuarios proxy_auth "/etc/squid/usuarios"
http_access allow usuarios
http_access deny all
(...)
# cat << EOF > /etc/squid/usuarios
usuario1
usuario2
EOF
# /etc/init.d/squid restart
Com os comandos e procedimentos acima, voc j deve ter a configurao pronta e totalmente
funcional em seu servidor. Aogra vamos saber o porqu de cada comando e procedimento, e
aprofundarmos um pouco mais no assunto.
Preparando o ambiente
Para iniciar os trabalhos, vamos logo entrando como usurio root:

$ sudo su -
Password: sua_senha
#

O comando sudo velho conhecido, serve para rodar comandos com permisses administrativas. O
comando su - indica que queremos nos tornar root (e permanecer assim), carregando o seu profile
como se fosse um novo login.
No ser objeto deste tutorial a instalao do Squid e do MySql, pois estamos partindo do
pressuposto que estes j esto rodando, conforme os pr-requisitos citados anteriormente. Em
artigos futuros, talvez este assunto seja abordado. Portando, cheque se o seu proxy Squid j
funciona adequadamente, se os usurios conseguem navegar por ele, se voc j tem um banco de
dados MySql rodando, se a as tabelas esto criadas, enfim faa uma checagem geral.
Caso voc no as tenha, segue um script de exemplo para criao do banco em MySql, j com a
tabela e dois usurios de teste, sendo um desabilitado.

# cat << EOF > CriaBanco_AutenticaSquid.sql


CREATE DATABASE AutenticaSquid;
USE AutenticaSquid;
CREATE TABLE Usuarios (
nome varchar(255) NOT NULL,
senha varchar(255) NOT NULL,
ativo tinyint(1) NOT NULL default '1',
PRIMARY KEY (nome),
KEY nome (nome)
) COMMENT = 'AutenticaSquid - Usuarios';
INSERT INTO Usuarios VALUES ('usuario1', encrypt('senha1'), 1);
INSERT INTO Usuarios VALUES ('usuario2', encrypt(''), 0);
EOF
# mysql -u usuario_do_banco -p < CriaBanco_AutenticaSquid.sql
Password: senha_do_banco
Obtendo e Instalando
O script escrito em PHP, ento necessitamos a instalao dos pacotes referentes ao interpretador
por linha de comando desta linguagem de script, que pode ser feita da seguinte forma:

# apt-get install php5-cli


Feita a instalao, entramos no diretrio referente aos mecanismos de autenticao do Squid (no
Ubuntu Server, /usr/lib/squid):

# cd /usr/lib/squid
Neste diretrio, h um programa e/ou script para cada mecanismo de autenticao instalado. O
funcionamento simples, o Squid chama o executvel deste diretrio, passa atravs da entrada
padro o nome e a senha que o usurio digitou, recebendo de volta OK ou ERR conforme o
caso.
Iremos criar um novo arquivo, definindo o seu contedo, chamado mysqlt_auth (ser o nome de
nosso programa de autenticao). Pode copiar e colar o cdigo abaixo, alterando os valores
necessrios para se adaptar ao seu banco de dados:

# cat << EOF > mysqlt_auth


#!/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, "AutenticaSquid");
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 ativo = 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");
}
?>
EOF

O funcionamento do script simples:


Conecta ao MySql
Seleciona o banco de dados criado
L da entrada padro o nome e senha do usurio
Pesquisa na tabela Usuarios por usuarios ativos (ativo=1) que contenham aquele nome
Assume que houve erro.
Se foi encontrado um registro, assume que no houve erro.
Compara a encriptao da senha digitada se confere com a senha criptografada armazenada.
Caso sejam iguais, mostra OK.
Caso sejam diferentes, mostra ERR.
Caso tenha havido erro, mostra ERR.
Recomea a leitura da entrada padro.
Configurando o Servio
Para que o Squid enxergue o novo esquema de autenticao, necessrio que faamos a devida
alterao em seu arquivo de configurao. Edite o arquivo /etc/squid/squid.conf e verifique que h
uma diretiva que aponta para o programa de autenticao, bastando ento alter-lo:

# vi /etc/squid/squid.conf
(...)
auth_param basic children 5
auth_param basic realm Descrio do seu servidor
auth_param basic credentialsttl 2 hour
auth_param basic program /usr/lib/squid/mysqlt_auth
(...)
Para cofigurar as ACLs, voc faz da mesma forma como faria a autenticao da forma normal.
Para fins de exemplo, aqui est um conjunto de ACLs que deixa um usurio navegar e barra todos
os outros acessos:

# vi /etc/squid/squid.conf
(...)
acl usuarios proxy_auth "/etc/squid/usuarios"
http_access allow usuarios
http_access deny all
(...)
# cat << EOF > /etc/squid/usuarios
usuario1
usuario2
EOF
#
Veja que, devido simplicidade de nosso script, ainda precisamos de um arquivo auxiliar ( no
caso, /etc/squid/usuarios ) contendo o nome de todos os usurios cadastrados. Desta forma, ele ir
buscar a senha e se est ativo ou no no MySql, mas ainda necessrio inserir aqui o seu nome.
Terminada a configurao do Squid, devemos reinicializar o Squid:

# /etc/init.d/squid restart
Outras ACLs e configuraes podem ser feitas, em conjunto com as aqui mostradas, bastando voc
alterar o arquivo de configurao conforme desejado.
Testando e Utilizando
Para verificar se o Squid carregou o script corretamente, use o seguinte comando para visualizar se
ele est rodando:

# ps aux | grep mysqlt_auth


proxy 5821 0.0 0.9 22408 4708 ? Ss 06:37 0:00 /usr/bin/php
/usr/lib/squid/mysqlt_auth
proxy 5822 0.0 0.9 22412 4704 ? Ss 06:37 0:00 /usr/bin/php
/usr/lib/squid/mysqlt_auth
proxy 5823 0.0 0.8 22408 4540 ? Ss 06:37 0:00 /usr/bin/php
/usr/lib/squid/mysqlt_auth
proxy 5824 0.0 0.8 22408 4540 ? Ss 06:37 0:00 /usr/bin/php
/usr/lib/squid/mysqlt_auth
proxy 5825 0.0 0.8 22408 4540 ? Ss 06:37 0:00 /usr/bin/php
/usr/lib/squid/mysqlt_auth
root 30390 0.0 0.1 2972 748 pts/0 R+ 20:35 0:00 grep mysqlt_auth
#
Veja que h 5 instncias do Script servindo ao Squid.
Se no houver nenhuma instncia, basta checar o arquivo /var/log/squid/cache.log atrs de
mensagens de erro. Em uma situao normal, ele deve mostrar o seguinte:

# cat /var/log/squid/cache.log | grep helperOpenServers


2008/12/31 23:37:09| helperOpenServers: Starting 5 'mysqlt_auth'
processes
Para verificar a autenticao dos usurios em si, rode o script manualmente:

# /usr/lib/squid/mysqlt_auth
usuario1 senha1
OK
usuario2 senha2
ERR
<ctrl+d>
#
Como se v, executando o comando e digitando o usurio e a senha a cada linha, separados por
espao, ele informa se tem acesso ou no. O CTRL+D indica fim de arquivo, e o comando
encerrado.
Dicas finais
Os caminhos, comandos e procedimentos aqui indicados, tomam como base o Ubuntu 7.10
Server. Porm, pode ser utilizado com pequenas adaptaes para Ubuntu 6.06 LTS Server,
outras verses, e at mesmo outras distribuies.
Voc pode escrever uma pgina Web, em PHP ou outra linguagem dinmica, que consulta as
informaes do banco, e gerencia os usurios, com troca de senhas, etc. Inclusive, utilizo
uma soluo assim que eu mesmo desenvolvi.
Lembre-se que aqui foi mostrado como fazer autenticao com informaes de tabelas no
Squid. Voc deve saber trabalhar com proxys, autenticao, e todas as suas complicaes
(no funcionar com proxy transparente, configurao no browser, etc).

Observaes e comentrios:

===

Funciona com proxy transparente ?

Edson,

No, no funciona. Conforme dito no final do artigo: Voc deve saber trabalhar com
proxys, autenticao, e todas as suas complicaes (no funcionar com proxy
transparente, configurao no browser, etc).

Qualquer tipo de autenticao do Squid, seja ela com tabelas MySql, seja com usurios
do SO, enfim, qualquer tipo, o esquema de autenticao utilizado pelo proxy no
funciona com proxy transparente. Pode usar os dois ao mesmo tempo, no mesmo
servio e servidor, mas um usurio que esteja navegando e seja redirecionado de forma
transparente para este proxy, no poder fazer autenticao.

Isto ocorre da forma como o protocolo de autenticao funciona. Ele responde com
Headers HTTP especiais para o navegador, que se encarrega de pedir ao usurio sua
senha. Quando trabalhando em modo transparente, o navegador no entende estes
cabealhos, e ento ignora-os.

Espero poder t-lo ajudado.

===

O nico problema que eu vejo utilizando essa soluo que os dados da autenticao trafegam na
rede em texto plano, apenas usando base64. Qualquer pessoa rodando sniffer na sua rede pode
capturar as senhas digitadas pelos usurios, e se voc usar as senhas para mais sistemas alm de
autenticao do squid, isso pode ser um grande problema. Para resolver isso recomendaria usar
digest, porm pode ser que voc tenha que guardar as senhas de modo diferente em sua base de
dados. D uma pesquisada nisso.
===
Realmente, elas trafegam usando texto plano. Se estivessem somente armazenadas em arquivos de
texto, ou no Sistema Operacional (shadow), que o que quase todo mundo usa, ainda assim
trafegariam pela rede em texto plano. A idia foi mostrar o esquema de autenticao pegando dados
de outra fonte, no caso uma tabela no MySql.
Mas a sua recomendao no apenas est correta, como irei escrever um novo artigo, desta vez
usando outro esquema para trfego das senhas na rede. Muito obrigado pela sua sugesto, e
obrigado por visitar nosso site. http://www.ubuntero.com.br/?p=516#more-516
===
Marco, muito legal esse teu trabalho, testei e funcionou direitinho, o meu sistema um freebsd, ser
que vo teria um squela parecido para acl e logs do squid no mysql tambm ? dai ficaria tuno no
bd.
===
Steven, obrigado por ler e mais ainda por experimentar a soluo na prtica. Existem algumas
implementaes para colocar os logs em MySql, irei precisar fazer algo parecido para um cliente
em que surgiu somente agora esta necessidade. Assim que terminar, colocarei aqui os passos. Sobre
ACLs, no, no conheo forma de fazer ele ler do MySql, mas trabalho da seguinte forma: tenho
uma pgina PHP que manipula as tabelas em banco, e, a cada insero, atualizao ou remoo, ele
gera um evento para um script que atualiza os arquivos texto do Squid. uma RTA Recurso
Tcnico Alternativo (popular gambiarra), mas que funciona.
===
Poxa vida, um otimo tutorial, estava terminando minha 4 semana de busca por proxy autenticado e
ai achei esse, uma pena que eu uso proxy transparente, vou pensar uma forma de autenticar os
usuarios
trata-se de uma rede aberta, com proxy transparente (squid) com cache e relatorios (sarg), alguns
bloqueios, diversos perfis , cada um com n usuarios e cada perfil com suas regras e velocidade de
acesso a minha obra prima
quando terminar tudo vou postar aki
===
huahau to doido atraz disso mais com suporte a MD5, na minha tabela de usurios as senhas esto
em MD5, no consigo fazer funcionar =s