Sie sind auf Seite 1von 5

Autenticando usurios do Squid em um banco de dados MySQL

junior.rocha
11/08/2009
Quando surge a necessidade de incrementar nossos servios, a utilizao de um banco de dados
para centralizar informaes extremamente vlida. Neste artigo veremos como implementar a
autenticao de usurios do Squid em uma tabela no banco de dados MySQL.
Por: Jnior Rocha
[ Hits: 33065 ]
Conceito: 10.0 + quero dar nota ao artigo
Denuncie + Favoritos Verso para impressora Indicar para um amigo Enviar artigo
Cenrio e necessidades
Como administrador, gosto de tudo bem organizado e o mais simplificado possvel, principalmente para
manuteno e integrao com o usurio. Bem, sabemos que a necessidade de disponibilizar um controle
"amigvel" para que gerentes e chefes de produo "controlem" as pginas e gerenciem os usurios
extremamente grande. Alm de termos um novo mtodo de autenticao do MySQL, podemos no futuro criar
algumas pginas em PHP para interagir com o banco de dados e efetuar algumas alteraes 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 tambm os seus usurios, e
posteriormente suas listas de sites bloqueados e liberados todos em um banco MySQL.

Esta soluo com MySQL visa a robustez e a integridade dos dados. Outra soluo alternativa a autenticao 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 hbridos.

Por padro a autenticao do Squid ncsa_auth. Um arquivo criado com o comando "htpasswd -cb arquivo
usurio senha" j pode ser utilizado para autenticar usurios do Squid com o mdulo nsca_auth, encontrado em
/usr/lib/squid (Distribuies Debian Like). Porm, vamos mudar um pouco isso e comear a autenticar em uma
base do MySQL.
O que foi utilizado para efetuar este artigo?
Foi utilizada a distribuio Debian Lenny, atualizada e com os pacotes do MySQL j instalados e do PHP tambm.
Mas j que voc no tem nada instalado e no 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

Aps a instalao dos pacotes acima, vamos configurar o MySQL e o Squid e termos um novo mtodo de
autenticao no nosso servidor proxy.

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 parabns, 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 sada 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 informaes de nome, senha e status do nossos usurios do Squid.
Se voc analisar, ns podemos ter 3 situaes de usurio no nosso servidor proxy: usurio existe, usurio no
existe, usurio desabilitado. Quando usamos a autenticao ncsa_auth, para desabilitar um usurio adicionamos
o caractere "#" para comentar a linha e ignor-la, como estamos utilizando uma base dados, utilizaremos um
nmero (0 ou 1) para determinar o status do usurio: 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 explicaes: criamos uma tabela chamada usurios que contm trs
campos: nome, senha e status. O campo nome no pode ser em branco e voc tem 100 caracteres para digitar,
o campo senha tambm no pode ser em branco e voc tem 15 caracteres livres e o campo status voc tem a
opo de colocar 0 ou 1 e por padro a flag zero.

Agora vamos inserir dois usurios 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 usurio vol1 est habilitado, diferentemente do usurio vol2.

O parmetro encrypt antes da senha significa que a sua senha estar devidamente criptografada, porm, isso
no 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 executveis, que nada mais so do que scripts dos
mtodos de autenticao existentes para seu Squid.

Procure algum script com o nome de mysqlt_auth. Se no 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 informaes como nome, senha, nome do banco, senha e host correspondam as
informaes 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 padro ele l o nome de usurio e senha digitados. A seguir, faz leitura de
usurios que contenham seu status como "1" (habilitado).

Caso ocorra algum erro, o mesmo retornado. Se encontrado algum usurio, continua a operao. Compara a
encriptao da senha digitada com a senha digitada pelo usurio. Se houver algum erro de digitao de
usurio/senha, aparece o erro e volta ao incio.

Para finalizar, execute o comando como root:

# chmod +x mysqlt_auth

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

Configurando o Squid
Copie o seu squid.conf funcional para um backup e vamos trabalhar em um arquivo novo para uma melhor
compreenso. A parte do squid.conf que ser comentada ser relativo somente a autenticao com MySQL, no
ser abordado a criao de ACLs, o restante dos parmetros de configurao voc pode entender lendo outros
artigos aqui mesmo no VOL.

Considerando que sua rede seja 193.189.0.0, seu servidor esteja com o IP 193.189.0.254 e a porta que o Squid
est rodando 3129, vamos s configuraes.

Copie o seu .conf antigo par um backup:

# cp squid.conf squid.bkp

e crie um novo squid.conf:

# touch squid.conf

Editando o squid.conf com "vi" ou "nano", insira as linhas abaixo:
# [ Configurao de Portas e Nomes ]
http_port 193.189.0.254:3129
icp_port 3130
visible_hostname liesch-proxy
hierarchy_stoplist cgi-bin ?
acl QUERY urlpath_regex cgi-bin \?
cache_dir ufs /var/spool/squid 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/squid/access.log
error_directory /usr/share/squid/errors/Portuguese

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


# [ Autenticao de Usurios ]
auth_param basic program /usr/lib/squid/mysqlt_auth
auth_param basic children 5
auth_param basic realm VOL Proxy - Digite o Usurio 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 193.189.0.0/24
acl usuarios proxy_auth /etc/squid/usuarios

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

Repare na mudana do ncsa_auth como padro de autenticao e no lugar do ncsa foi inserido o mysqlt_auth.
Observe tambm que ainda temos que utilizar um outro arquivo para ser referncia de usurios, um arquivo
simples dentro do /etc/squid com o nome de usurios. Para cri-lo, digite apenas "touch usuarios" dentro de
/etc/squid e coloque neste arquivo os usurios cadastrados no seu banco de dados. Dentro do arquivo deve
conter apenas isto:
vol1
vol2

Nada mais.

Observe que foram adicionadas ACLs bsicas no fim do .conf que apenas permitem a navegao dos usurios
autenticados e negam qualquer outro tipo de acesso.

Aps feita as configuraes, salve o arquivo e reinicie o Squid com o comando:

# /etc/init.d/squid restart

Testes, consideraes e observaes
Aps reiniciar o Squid, verifique se o processo do mysql_auth est em execuo com o comando:

$ ps aux | grep mysqlt_auth

A sada deste comando deve ter no mnimo 5 linhas, o que indica que est tudo "OK" com o seu novo mtodo de
autenticao.

Obviamente a autenticao de usurios demora um pouco mais, devido a consulta no banco de dados. Se voc
tem uma empresa que necessita desta soluo para cerca de 50 usurios ou mais e seu proxy est no mesmo
computador que o banco de dados, certifique-se que haja recursos de hardware suficientes para atender as
necessidades do seu ambiente.

Vale lembrar que esta soluo se adqua queles que pretendem desenvolver solues personalizadas em
pginas PHP para gerenciar seu ambiente. Se voc tem um servidor com 10 usurios e tem o controle absoluto
do servidor, no h necessidade tcnica para esta soluo, a no ser claro, por finalidades educativas e de
aprendizado.

Quem sabe em um prximo artigo integraremos ao banco de dados s blacklists do Squid para incrementarmos
nossa soluo.

Um abrao a todos.

Das könnte Ihnen auch gefallen