Integrar o SQUID com um banco de dados MySQL e efetuar a autenticação dos usuários baseando-se em usuário/senha/IP/MAC por meio da external_acl, irei abordar desde a instalação até os testes.
mysql> CREATE DATABASE `SQUIDTESTE` ;
mysql> CREATE TABLE `SQUIDTESTE`.`Proxy_Users` (
`ID` INT NOT NULL AUTO_INCREMENT ,
`USUARIO` VARCHAR( 100 ) NOT NULL ,
`SENHA` VARCHAR( 200 ) NOT NULL ,
`IP` VARCHAR( 100 ) NOT NULL ,
`MAC` VARCHAR( 100 ) NOT NULL ,
`ATIVO` INT( 1 ) NOT NULL ,
PRIMARY KEY ( `ID` )
) ENGINE = MYISAM ;
Criando o mysql_auth:
# touch /usr/local/squid3.2/lib/mysql_auth
# chown proxy.proxy /usr/local/squid3.2/lib/mysql_auth
# vim /usr/local/squid3.2/lib/mysql_auth
#!/usr/bin/php
<?
$link = mysqli_connect("localhost", "USUARIO", "SQUIDTESTE123");
if (!$link) {
printf("Erro ao conectar com o banco de dados: %s\n", mysqli_connect_error());
die();
}
$selectdb = mysqli_select_db($link, "SQUIDTESTE");
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 * FROM `Proxy_Users` WHERE `USUARIO` LIKE \''.$nome.'\';';
$Query = mysqli_query($link, $select);
$nrRegistros = mysqli_num_rows($Query);
$erro = true;
while ( $Registro = mysqli_fetch_array($Query) ) {
$erro = false;
if ( md5($senha) == $Registro['SENHA'] ) printf("OK\n");
else printf("ERR\n");
}
if ($erro) printf("ERR\n");
}
?>
Criando o autenticador de IP e MAC:
# touch /usr/local/squid3.2/etc/SRCMACAUTH.sh
# chown proxy.proxy /usr/local/squid3.2/etc/SRCMACAUTH.sh
# vim /usr/local/squid3.2/etc/SRCMACAUTH.sh
#!/bin/bash
while read user src mac
do
if [ `echo "SELECT SRC FROM Proxy_Users WHERE USUARIO LIKE '"$user"' AND SRC LIKE '"$src"' AND MAC LIKE '"$mac"'" |mysql SQUIDTESTE -u USUARIO -pSENHASQL|grep -v "ATIVO\|SRC"` ]
then
echo OK
else
echo ERR
fi
done
Criando o arquivo para adicionar novos usuários -- criausuario.php:
$db = mysql_connect("localhost","USUARIO","SENHADOBANCO")or die("ERRO de conexao com servico");
$select = mysql_select_db("SQUIDTESTE")or die("ERRO de conexao com banco");
[5] Comentário enviado por m4tri_x em 06/02/2011 - 23:16h
Boa noite,
Rogerio, vou dar uma analisada mas acredito que foi um erro meu na hora de escrever o código, de qualquer forma eu confirmo e depois posto aqui.
Fabio, valeu cara ;D sumido... hehe
Obernan, siga os passos novamente, depois de baixar execute a linha para compilar, caso dê algum erro poste aqui as ultimas linhas...
[6] Comentário enviado por jeferson em 10/02/2011 - 16:31h
Boa tarde pessoal,
tenho uma dúvida, é possível implementar essa autenticação com um proxy transparente, se não for possível, como posso fazer para que nenhum usuário mais experto remova a configuração de proxy do navegador. Gostaria de ter autenticação e impossibilitar que qualquer usuário consiga navegar sem passar pelo proxy.
[7] Comentário enviado por visudnetwork em 10/02/2011 - 16:38h
Boa tarde,
Jeferson, até onde eu sei não é possivel, para essa situação utilizamos o PDC, pode ser feito com o SAMBA4 e administrado pelo console da m$ ou então fazer tudo pelo Windows mesmo.
Utilizando a opção para definição do Proxy e desativando a alteração do mesmo, você pode dividir por departamentos as GPO's sendo assim estabelecendo diversos tipos de permissão diferente.
Hoje em dia tem que saber explorar o melhor de cada solução....
[8] Comentário enviado por jeferson em 10/02/2011 - 17:05h
Olá visudnetwork, olha, desculpe minha ignorância, mas não entendi muito bem a sua explicação. Eu gostaria de usar algum tipo de autenticação no proxy, ter um controle de permissões a sites para acessar, tipos de arquivos para downloads e ter a garantia que nenhum usuário navegará sem passar pelo firewall e o proxy. Fazer uma política com muito recursos para auditorias.
[9] Comentário enviado por visudnetwork em 11/02/2011 - 12:41h
Olá Jeferson, q nda cara, acho que eu não soube explicar direito, vamos lá. você falou sobre a questão dos usuarios retirarem o proxy do navegador no caso de não haver o transparent proxy.
Eu falei que para resolver essa situação você pode fazer um servidor de dominio, dê uma boa lida nos artigos relacionados a esse assunto aqui no VOL, creio que para fazer transparent proxy você tenha que abrir mão da autenticação, porém no caso de haver a necessidade de pedir autenticação você pode optar por utilizar duas soluções diferentes, o proxy em linux e o servidor de dominio.
A finalidade do servidor de dominio é restringir o acesso a configurações locais, ou seja, o usuario liga a maquina porém não consegue efetuar nenhuma alteração nas configurações do internet explorer, dessa forma você especifica que deverá ficar configurado o proxy no navegador e que o usuario não terá permissão de desfazer essa configuração.
Acho que agora consegui explicar um pouco melhor... Sobre a questão do dominio, dê uma boa lida aqui no VOL, tem como fazer com o SAMBA também.
[10] Comentário enviado por jeferson em 16/02/2011 - 09:04h
Visudnetwork, valeu mesmo, consegui entender bem, é essa solução que procuro, obrigatoriedade na autenticação e impossibilitar o usuário de remover as configurações de proxy, vou ler os artigos e tentar implementar. Novamente agradeço.
[11] Comentário enviado por R.S.P Andre em 25/03/2011 - 21:54h
Boa Noite.
cara estou tendo um erro com o SRCMACAUTH.sh.
Quando faço o teste com o mesmo recebo o seguinte erro:"ERROR 1054 (42S22) at line 1: Unknown column 'SRC' in 'field list'"
O que será que pode estar acontecendo??
Aqui esta meu SRCMACAUTH.sh
#!/bin/bash
while read user src mac
do
if [ `echo "SELECT SRC FROM Proxy_users WHERE USUARIO LIKE '"$user"' AND SRC LIKE '"$src"' AND MAC LIKE '"$mac"'" |mysql SQUIDTESTE -u USUARIO -pSENHASQL|grep -v "ATIVO\|SRC"` ]
then
echo OK
else
echo ERR
fi
done
..
Sob o Proxy_users o meu esta assim mesmo..
Desde já agradeço..
Um grande abraço e obrigado pela sua contribuição aqui no VOL..
[12] Comentário enviado por jrutke em 26/04/2011 - 14:38h
R.S.P Andre
Eu sei que já faz um tempo que postou sua dúvida, e creio que já a deve ter solucionado, porém outros deverão ter o mesmo problema, então postarei a solução.
Esse erro é causado devido à não haver o campo SRC na tabela Proxy_users, esse campo se refere ao ip digitado na autenticação. Então para solucionar, basta trocar os SRC por IP, e o seu problema estará solucionado.
[13] Comentário enviado por R.S.P Andre em 26/04/2011 - 19:47h
Cara valeu mesmo.
Por incrivel q pareça eu ainda estava cm essa duvida.
por motivos alheios eu acabei por deixando esse tuto pra tentar depois..
e como obtive sua resposta vo recomeça-lo.
[14] Comentário enviado por m4tri_x em 26/04/2011 - 21:18h
Olá, pessoal, me desculpem não ter respondido as perguntas, confeço que li porém estava adiando para responder quando estivesse mais tranquilo, estou desenvolvendo meu TCC que é relacionado com esse artigo que postei, em breve disponibilizarei um projeto para gerenciamento do squid com essas funcionalidades, de forma que apenas instalando com poucos comandos seja possivel controlar por uma interface web.
Espero que gostem, assim que tiver algo eu posto...
user senha
PHP Warning: mysqli_num_rows() expects parameter 1 to be mysqli_result, boolean given in /usr/local/squid3.2/lib/mysql_auth on line 17
PHP Warning: mysqli_fetch_array() expects parameter 1 to be mysqli_result, boolean given in /usr/local/squid3.2/lib/mysql_auth on line 19
ERR
Meu mysql_auth está abaixo:
#!/usr/bin/php
<?
$link = mysqli_connect("localhost", "adm", "senha");
if (!$link) {
printf("Erro ao conectar com o banco de dados: %s\n", mysqli_connect_error());
die();
}
$selectdb = mysqli_select_db($link, "SQUIDTESTE");
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 * FROM `Proxy_Users` WHERE `USUARIO` LIKE \''.$nome.'\";';
$Query = mysqli_query($link, $select);
$nrRegistros = mysqli_num_rows($Query);
$erro = true;
while ( $Registro = mysqli_fetch_array($Query) ) {
$erro = false;
if ( md5($senha) == $Registro['SENHA'] ) printf("OK\n");
else printf("ERR\n");
}
if ($erro) printf("ERR\n");
}
?>
[16] Comentário enviado por angkor em 31/10/2011 - 10:49h
Prezados bom dia,
Show de bola esse material, mas tenho uma dúvida.
Seria possivel usar essa solução para que o squid faça essa busca na base de dados do servidor de e-mail que está em outra maquina? Dessa forma a autenticação seria baseada no usuário (conta de e-mail) e senha (senha do e-mail).
[17] Comentário enviado por m4tri_x em 01/11/2011 - 08:27h
Bom dia angkor, da para fazer sim, basta apontar o servidor de destino da conexão mysql, usuário e senha, localizar na table que possui o usuario/senha. Você terá que fazer algumas adaptações no script e tratar os resultados, nada demais.
Estou desenvolvendo uma versão em php para gerenciamento de servidores com diversos recursos, estou meio sem tempo para efetuar as modificações para ficar da forma como vc precisa porém caso você queira ir alterando, vai postando os erros que agente tenta te ajudar.
[19] Comentário enviado por angkor em 03/11/2011 - 14:47h
Bom galela, vou dar o feedback,
Tenho um servidor de e-mail interno rodando ubuntu que faz relay, dei as devidas permissões na base de dados, especificamente na tabela onde ficam armazenados as contas, depois fui em outra maquina da rede e só adaptei o script mysql_auth acima para minha realidade e funcionou beleza, na verdade tive alguns Warning mas ele sempre me retornava o OK ou ERR.
Agora tenho alguns desafio, o primeiro é fazer esse script funcionar no pfsense e o segundo é fazer o squid que está rodando nesse pfsense autenticar com esse script.
[20] Comentário enviado por SPH em 09/02/2012 - 10:36h
Aí parabens pelo tutto.
Mas eu fui seguir ele e recebi um erro como entendo pouco de shell script estou me batendo um monte. Segue o erro se puder dar uma força.
erro recebido na fase de teste de autenticação.
ao executar o comando :
#/usr/local/squid3.2/etc/SRCMACAUTH.sh
usuario 192.168.x.x oo:oo:oo:oo:oo
/usr/local/squid3/etc/SRCMACAUTH.sh: line 4: [: 192.168.x.x: esperado operador binário
ERR
mexi um monte no script mas não funfa.
[22] Comentário enviado por jorgerabello em 13/10/2015 - 18:35h
Boa tarde m4tri_x, em primeiro lugar parabéns pela iniciativa e excelente tutorial, segui o tutorial mas na hora de autenticar apenas aparece uma tela em branco.
Eu consigo a partir do servidor proxy linux e do cliente executar ping nos sites mas não abre a janela para autenticar.
O squid.conf e base de dados estão identicos aos do tutorial.
OBS: o arquivo mysqlt_auth não entrou em execução (acho que é isso) mas por que ?