{"id":24,"date":"2010-07-08T15:19:48","date_gmt":"2010-07-08T18:19:48","guid":{"rendered":"http:\/\/blog.digavoip.com.br\/2010\/07\/08\/autenticacao-squid-com-base-em-tabelas-mysql\/"},"modified":"2010-07-08T15:21:44","modified_gmt":"2010-07-08T18:21:44","slug":"autenticacao-squid-com-base-em-tabelas-mysql","status":"publish","type":"post","link":"https:\/\/blog.abratel.com.br\/?p=24","title":{"rendered":"Autentica\u00e7\u00e3o Squid com base em Tabelas MySql"},"content":{"rendered":"<p>Um assunto muito recorrente, para quem trabalha com administra\u00e7\u00e3o de proxy\u2019s, \u00e9 a necessidade de se fazer autentica\u00e7\u00e3o dos usu\u00e1rios com base em uma determinada lista de acesso. Geralmente, \u00e9 quest\u00e3o apenas de fazer a configura\u00e7\u00e3o correta do Squid, definir alguns arquivos texto com as informa\u00e7\u00f5es e pronto. Por\u00e9m, no caso de empresas grandes, \u00e9 desej\u00e1vel que esta informa\u00e7\u00e3o seja reutilizada a partir de alguma j\u00e1 existente, geralmente em forma de dados em tabelas de um banco de dados qualquer.<\/p>\n<p>Utilizo em algumas empresas um script bem simples, que eu mesmo desenvolvi, para esta tarefa. Qual n\u00e3o foi minha surpresa, ao saber que fazer isto \u00e9 uma d\u00favida bastante buscada na Internet por outras pessoas e, quase sempre, n\u00e3o resolvida. A maioria utiliza alguns projetos complicados, outros j\u00e1 recomendam partir para alguma solu\u00e7\u00e3o mais rebuscada (e, talvez, at\u00e9 mais correta) como LDAP e outros.<\/p>\n<p>Por\u00e9m, basta um script e uma ou outra configura\u00e7\u00e3o e a quest\u00e3o est\u00e1 resolvida. Decidi ent\u00e3o compartilhar, aqui, o script que instalo nas m\u00e1quinas que administro. Seu uso \u00e9 bem simples. Na verdade, se voc\u00ea pegar e simplesmente seguir os passos aqui descritos, ver\u00e1s que \u00e9 algo trivial. Por\u00e9m, para manter a qualidade dos artigos aqui publicados, este serve tamb\u00e9m como um tutorial para que voc\u00ea entenda um pouco mais do funcionamento dos mecanismos de autentica\u00e7\u00e3o do Squid.<\/p>\n<p>Sobre este tutorial:<\/p>\n<p>\u25a0Baseado na distribui\u00e7\u00e3o Ubuntu 7.10 Server<br \/>\n\u25a0Dificuldade de execu\u00e7\u00e3o: F\u00e1cil<br \/>\n\u25a0Nivel de conhecimento: Avan\u00e7ado<br \/>\nPr\u00e9-requisitos <\/p>\n<p>\u25a0Conhecimentos b\u00e1sicos sobre o proxy Squid<br \/>\n\u25a0Conhecimentos b\u00e1sicos sobre o banco de dados MySql<br \/>\n\u25a0Entendimento pr\u00e9vio do que se pretende fazer<br \/>\n\u25a0Servidor Linux j\u00e1 instalado e configurado<br \/>\n\u25a0Banco de dados MySql e Squid j\u00e1 instalados e configurados<\/p>\n<p>Para os apressados<br \/>\nSe voc\u00ea n\u00e3o quer \u201cperder tempo\u201d com conceitos, ou s\u00f3 quer uma \u201creceita de bolo\u201d, aqui est\u00e3o os procedimentos, considerando a instala\u00e7\u00e3o do pacote php5-cli (desconsidere se j\u00e1 instalado):<\/p>\n<p>$ sudo su &#8211;<br \/>\nPassword: sua_senha<br \/>\n# cat << EOF > CriaBanco_AutenticaSquid.sql<br \/>\nCREATE DATABASE AutenticaSquid;<br \/>\nUSE AutenticaSquid;<br \/>\nCREATE TABLE Usuarios (<br \/>\nnome varchar(255) NOT NULL,<br \/>\nsenha varchar(255) NOT NULL,<br \/>\nativo tinyint(1) NOT NULL default &#8216;1&#8217;,<br \/>\nPRIMARY KEY (nome),<br \/>\nKEY nome (nome)<br \/>\n) COMMENT = &#8216;AutenticaSquid &#8211; Usuarios&#8217;;<br \/>\nINSERT INTO Usuarios VALUES (&#8216;usuario1&#8217;, encrypt(&#8216;senha1&#8217;), 1);<br \/>\nINSERT INTO Usuarios VALUES (&#8216;usuario2&#8217;, encrypt(&#8221;), 0);<br \/>\nEOF<br \/>\n# mysql -u usuario_do_banco -p < CriaBanco_AutenticaSquid.sql\nPassword: senha_do_banco\n# apt-get install php5-cli\n# cd \/usr\/lib\/squid\n\n\n# cat << EOF > mysqlt_auth<\/p>\n<p>#!\/usr\/bin\/php<br \/>\n<?\n        $link = mysqli_connect(\"localhost\", \"usuario_do_banco\", \"senha_do_banco\");\n        if (!$link) {\n                printf(\"Erro ao conectar com o banco de dados: %s\\n\", mysqli_connect_error());\n                die();\n        }\n        $selectdb = mysqli_select_db($link, \"AutenticaSquid\");\n        if (!$selectdb) {\n                printf(\"Erro ao abrir o banco de dados: %s\\n\", mysqli_error($link));\n                die();\n        }\n        while ( fscanf(STDIN, \"%s %s\", $nome, $senha) ) {\n                $select = \"SELECT nome, senha FROM Usuarios WHERE nome = '\".$nome.\"' AND ativo = 1\";\n                $Query = mysqli_query($link, $select);\n                $nrRegistros = mysqli_num_rows($Query);\n                $erro = true;\n                while ( $Registro = mysqli_fetch_array($Query) ) {\n                        $erro = false;\n                        if ( crypt($senha, $Registro[senha]) == $Registro[senha] ) printf(\"OK\\n\");\n                        else printf(\"ERR\\n\");\n                }\n                if ($erro) printf(\"ERR\\n\");\n        }\n?><br \/>\nEOF<\/p>\n<p># vi \/etc\/squid\/squid.conf<br \/>\n(&#8230;)<br \/>\nauth_param basic children 5<br \/>\nauth_param basic realm Descri\u00e7\u00e3o do seu servidor<br \/>\nauth_param basic credentialsttl 2 hour<br \/>\nauth_param basic program \/usr\/lib\/squid\/mysqlt_auth<br \/>\n(&#8230;)<br \/>\nacl usuarios proxy_auth &#8220;\/etc\/squid\/usuarios&#8221;<br \/>\nhttp_access allow usuarios<br \/>\nhttp_access deny all<br \/>\n(&#8230;)<br \/>\n# cat << EOF > \/etc\/squid\/usuarios<br \/>\nusuario1<br \/>\nusuario2<br \/>\nEOF<br \/>\n# \/etc\/init.d\/squid restart<\/p>\n<p>Com os comandos e procedimentos acima, voc\u00ea j\u00e1 deve ter a configura\u00e7\u00e3o pronta e totalmente funcional em seu servidor. Aogra vamos saber o porqu\u00ea de cada comando e procedimento, e aprofundarmos um pouco mais no assunto.<\/p>\n<p>Preparando o ambiente<\/p>\n<p>Para iniciar os trabalhos, vamos logo entrando como usu\u00e1rio \u201croot\u201d:<\/p>\n<p>$ sudo su &#8211;<br \/>\nPassword: sua_senha<br \/>\n#<\/p>\n<p>O comando sudo \u00e9 velho conhecido, serve para rodar comandos com permiss\u00f5es administrativas. O comando \u201csu -\u201d indica que queremos nos tornar root (e permanecer assim), carregando o seu profile como se fosse um novo login.<\/p>\n<p>N\u00e3o ser\u00e1 objeto deste tutorial a instala\u00e7\u00e3o do Squid e do MySql, pois estamos partindo do pressuposto que estes j\u00e1 est\u00e3o rodando, conforme os pr\u00e9-requisitos citados anteriormente. Em artigos futuros, talvez este assunto seja abordado. Portando, cheque se o seu proxy Squid j\u00e1 funciona adequadamente, se os usu\u00e1rios conseguem navegar por ele, se voc\u00ea j\u00e1 tem um banco de dados MySql rodando, se a as tabelas est\u00e3o criadas, enfim\u2026 fa\u00e7a uma checagem geral.<\/p>\n<p>Caso voc\u00ea n\u00e3o as tenha, segue um script de exemplo para cria\u00e7\u00e3o do banco em MySql, j\u00e1 com a tabela e dois usu\u00e1rios de teste, sendo um desabilitado.<\/p>\n<p># cat << EOF > CriaBanco_AutenticaSquid.sql<br \/>\nCREATE DATABASE AutenticaSquid;<br \/>\nUSE AutenticaSquid;<br \/>\nCREATE TABLE Usuarios (<br \/>\nnome varchar(255) NOT NULL,<br \/>\nsenha varchar(255) NOT NULL,<br \/>\nativo tinyint(1) NOT NULL default &#8216;1&#8217;,<br \/>\nPRIMARY KEY (nome),<br \/>\nKEY nome (nome)<br \/>\n) COMMENT = &#8216;AutenticaSquid &#8211; Usuarios&#8217;;<br \/>\nINSERT INTO Usuarios VALUES (&#8216;usuario1&#8217;, encrypt(&#8216;senha1&#8217;), 1);<br \/>\nINSERT INTO Usuarios VALUES (&#8216;usuario2&#8217;, encrypt(&#8221;), 0);<br \/>\nEOF<br \/>\n# mysql -u usuario_do_banco -p < CriaBanco_AutenticaSquid.sql\nPassword: senha_do_banco\n\n\nObtendo e Instalando\n\nO script \u00e9 escrito em PHP, ent\u00e3o necessitamos a instala\u00e7\u00e3o dos pacotes referentes ao interpretador por linha de comando desta linguagem de script, que pode ser feita da seguinte forma:\n\n\n# apt-get install php5-cli\n\n\nFeita a instala\u00e7\u00e3o, entramos no diret\u00f3rio referente aos mecanismos de autentica\u00e7\u00e3o do Squid (no Ubuntu Server, \u201c\/usr\/lib\/squid\u201d):\n\n\n# cd \/usr\/lib\/squid\n\n\nNeste diret\u00f3rio, h\u00e1 um programa e\/ou script para cada mecanismo de autentica\u00e7\u00e3o instalado. O funcionamento \u00e9 simples, o Squid chama o execut\u00e1vel deste diret\u00f3rio, passa atrav\u00e9s da entrada padr\u00e3o o nome e a senha que o usu\u00e1rio digitou, recebendo de volta \u201cOK\u201d ou \u201cERR\u201d conforme o caso.\n\nIremos criar um novo arquivo, definindo o seu conte\u00fado, chamado \u201cmysqlt_auth\u201d (ser\u00e1 o nome de nosso programa de autentica\u00e7\u00e3o). Pode copiar e colar o c\u00f3digo abaixo, alterando os valores necess\u00e1rios para se adaptar ao seu banco de dados:\n\n\n# cat << EOF > mysqlt_auth<\/p>\n<p>#!\/usr\/bin\/php<br \/>\n<?\n        $link = mysqli_connect(\"localhost\", \"usuario_do_banco\", \"senha_do_banco\");\n        if (!$link) {\n                printf(\"Erro ao conectar com o banco de dados: %s\\n\", mysqli_connect_error());\n                die();\n        }\n        $selectdb = mysqli_select_db($link, \"AutenticaSquid\");\n        if (!$selectdb) {\n                printf(\"Erro ao abrir o banco de dados: %s\\n\", mysqli_error($link));\n                die();\n        }\n        while ( fscanf(STDIN, \"%s %s\", $nome, $senha) ) {\n                $select = \"SELECT nome, senha FROM Usuarios WHERE nome = '\".$nome.\"' AND ativo = 1\";\n                $Query = mysqli_query($link, $select);\n                $nrRegistros = mysqli_num_rows($Query);\n                $erro = true;\n                while ( $Registro = mysqli_fetch_array($Query) ) {\n                        $erro = false;\n                        if ( crypt($senha, $Registro[senha]) == $Registro[senha] ) printf(\"OK\\n\");\n                        else printf(\"ERR\\n\");\n                }\n                if ($erro) printf(\"ERR\\n\");\n        }\n?><br \/>\nEOF<\/p>\n<p>O funcionamento do script \u00e9 simples:<\/p>\n<p>\u25a0Conecta ao MySql<br \/>\n\u25a0Seleciona o banco de dados criado<br \/>\n\u25a0L\u00ea da entrada padr\u00e3o o nome e senha do usu\u00e1rio<br \/>\n\u25a0Pesquisa na tabela Usuarios por usuarios ativos (ativo=1) que contenham aquele nome<br \/>\n\u25a0Assume que houve erro.<br \/>\n\u25a0Se foi encontrado um registro, assume que n\u00e3o houve erro.<br \/>\n\u25a0Compara a encripta\u00e7\u00e3o da senha digitada se confere com a senha criptografada armazenada.<br \/>\n\u25a0Caso sejam iguais, mostra OK.<br \/>\n\u25a0Caso sejam diferentes, mostra ERR.<br \/>\n\u25a0Caso tenha havido erro, mostra ERR.<br \/>\n\u25a0Recome\u00e7a a leitura da entrada padr\u00e3o.<br \/>\nConfigurando o Servi\u00e7o<\/p>\n<p>Para que o Squid \u201cenxergue\u201d o novo esquema de autentica\u00e7\u00e3o, \u00e9 necess\u00e1rio que fa\u00e7amos a devida altera\u00e7\u00e3o em seu arquivo de configura\u00e7\u00e3o. Edite o arquivo \/etc\/squid\/squid.conf e verifique que h\u00e1 uma diretiva que \u201caponta\u201d para o programa de autentica\u00e7\u00e3o, bastando ent\u00e3o alter\u00e1-lo:<\/p>\n<p># vi \/etc\/squid\/squid.conf<br \/>\n(&#8230;)<br \/>\nauth_param basic children 5<br \/>\nauth_param basic realm Descri\u00e7\u00e3o do seu servidor<br \/>\nauth_param basic credentialsttl 2 hour<br \/>\nauth_param basic program \/usr\/lib\/squid\/mysqlt_auth<br \/>\n(&#8230;)<\/p>\n<p>Para cofigurar as ACL\u2019s, voc\u00ea faz da mesma forma como faria a autentica\u00e7\u00e3o da forma \u201cnormal\u201d. Para fins de exemplo, aqui est\u00e1 um conjunto de ACL\u2019s que deixa um usu\u00e1rio navegar e barra todos os outros acessos:<\/p>\n<p># vi \/etc\/squid\/squid.conf<br \/>\n(&#8230;)<br \/>\nacl usuarios proxy_auth &#8220;\/etc\/squid\/usuarios&#8221;<br \/>\nhttp_access allow usuarios<br \/>\nhttp_access deny all<br \/>\n(&#8230;)<br \/>\n# cat << EOF > \/etc\/squid\/usuarios<br \/>\nusuario1<br \/>\nusuario2<br \/>\nEOF<br \/>\n#<\/p>\n<p>Veja que, devido \u00e0 simplicidade de nosso script, ainda precisamos de um arquivo auxiliar ( no caso, \/etc\/squid\/usuarios ) contendo o nome de todos os usu\u00e1rios cadastrados. Desta forma, ele ir\u00e1 buscar a senha e se est\u00e1 ativo ou n\u00e3o no MySql, mas ainda \u00e9 necess\u00e1rio inserir aqui o seu nome.<\/p>\n<p>Terminada a configura\u00e7\u00e3o do Squid, devemos reinicializar o Squid:<\/p>\n<p># \/etc\/init.d\/squid restart<\/p>\n<p>Outras ACL\u2019s e configura\u00e7\u00f5es podem ser feitas, em conjunto com as aqui mostradas, bastando voc\u00ea alterar o arquivo de configura\u00e7\u00e3o conforme desejado.<\/p>\n<p>Testando e Utilizando<\/p>\n<p>Para verificar se o Squid carregou o script corretamente, use o seguinte comando para visualizar se ele est\u00e1 rodando:<\/p>\n<p># ps aux | grep mysqlt_auth<br \/>\nproxy 5821 0.0 0.9 22408 4708 ? Ss 06:37 0:00 \/usr\/bin\/php \/usr\/lib\/squid\/mysqlt_auth<br \/>\nproxy 5822 0.0 0.9 22412 4704 ? Ss 06:37 0:00 \/usr\/bin\/php \/usr\/lib\/squid\/mysqlt_auth<br \/>\nproxy 5823 0.0 0.8 22408 4540 ? Ss 06:37 0:00 \/usr\/bin\/php \/usr\/lib\/squid\/mysqlt_auth<br \/>\nproxy 5824 0.0 0.8 22408 4540 ? Ss 06:37 0:00 \/usr\/bin\/php \/usr\/lib\/squid\/mysqlt_auth<br \/>\nproxy 5825 0.0 0.8 22408 4540 ? Ss 06:37 0:00 \/usr\/bin\/php \/usr\/lib\/squid\/mysqlt_auth<br \/>\nroot 30390 0.0 0.1 2972 748 pts\/0 R+ 20:35 0:00 grep mysqlt_auth<br \/>\n#<\/p>\n<p>Veja que h\u00e1 5 inst\u00e2ncias do Script servindo ao Squid.<br \/>\nSe n\u00e3o houver nenhuma inst\u00e2ncia, basta checar o arquivo \/var\/log\/squid\/cache.log atr\u00e1s de mensagens de erro. Em uma situa\u00e7\u00e3o normal, ele deve mostrar o seguinte:<\/p>\n<p># cat \/var\/log\/squid\/cache.log | grep helperOpenServers<br \/>\n2008\/12\/31 23:37:09| helperOpenServers: Starting 5 &#8216;mysqlt_auth&#8217; processes<\/p>\n<p>Para verificar a autentica\u00e7\u00e3o dos usu\u00e1rios em si, rode o script manualmente:<\/p>\n<p># \/usr\/lib\/squid\/mysqlt_auth<br \/>\nusuario1 senha1<br \/>\nOK<br \/>\nusuario2 senha2<br \/>\nERR<br \/>\n<ctrl+d><br \/>\n#<\/p>\n<p>Como se v\u00ea, executando o comando e digitando o usu\u00e1rio e a senha a cada linha, separados por espa\u00e7o, ele informa se tem acesso ou n\u00e3o. O CTRL+D indica fim de arquivo, e o comando \u00e9 encerrado.<\/p>\n<p>Dicas finais<\/p>\n<p>\u25a0Os caminhos, comandos e procedimentos aqui indicados, tomam como base o Ubuntu 7.10 Server. Por\u00e9m, pode ser utilizado com pequenas adapta\u00e7\u00f5es para Ubuntu 6.06 LTS Server, outras vers\u00f5es, e at\u00e9 mesmo outras distribui\u00e7\u00f5es.<br \/>\n\u25a0Voc\u00ea pode escrever uma p\u00e1gina Web, em PHP ou outra linguagem din\u00e2mica, que consulta as informa\u00e7\u00f5es do banco, e gerencia os usu\u00e1rios, com troca de senhas, etc. Inclusive, utilizo uma solu\u00e7\u00e3o assim que eu mesmo desenvolvi.<br \/>\n\u25a0Lembre-se que aqui foi mostrado como fazer autentica\u00e7\u00e3o com informa\u00e7\u00f5es de tabelas no Squid. Voc\u00ea deve saber trabalhar com proxy\u2019s, autentica\u00e7\u00e3o, e todas as suas complica\u00e7\u00f5es (n\u00e3o funcionar com proxy transparente, configura\u00e7\u00e3o no browser, etc).<br \/>\nBoth comments and pings are currently closed. <\/p>\n","protected":false},"excerpt":{"rendered":"<p>Um assunto muito recorrente, para quem trabalha com administra\u00e7\u00e3o de proxy\u2019s, \u00e9 a necessidade de se fazer autentica\u00e7\u00e3o dos usu\u00e1rios com base em uma determinada lista de acesso. Geralmente, \u00e9 quest\u00e3o apenas de fazer a configura\u00e7\u00e3o correta do Squid, definir alguns arquivos texto com as&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[2],"tags":[],"_links":{"self":[{"href":"https:\/\/blog.abratel.com.br\/index.php?rest_route=\/wp\/v2\/posts\/24"}],"collection":[{"href":"https:\/\/blog.abratel.com.br\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.abratel.com.br\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.abratel.com.br\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.abratel.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=24"}],"version-history":[{"count":0,"href":"https:\/\/blog.abratel.com.br\/index.php?rest_route=\/wp\/v2\/posts\/24\/revisions"}],"wp:attachment":[{"href":"https:\/\/blog.abratel.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=24"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.abratel.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=24"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.abratel.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=24"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}