Squid - Autenticação e controle de acesso a base de dados Firebird

Neste artigo apresento a criação de módulo de autenticação e controle de acesso para o Squid, acessando uma base de dados Firebird. Esta necessidade surgiu na empresa em que trabalho, e como não encontrei nada existente na Internet, a solução foi criar um pequeno módulo utilizando o Lazarus.

[ Hits: 23.853 ]

Por: Renato Félix de Almeida em 28/11/2012


Introdução



Na empresa em que trabalho a Internet era totalmente liberada para os usuários. Como tudo o que é completamente liberado, acaba virando bagunça. Com o tempo, começaram a acontecer alguns abusos por parte dos usuários.

A Internet, que tinha um link de 10 MB, começou a ficar lenta, a produtividade dos funcionários começou a cair, pois eles só ficavam no Facebook, a rede estava infestada de vírus, ou seja, era necessário tomar algum tipo de providência.

Apresentei para a diretoria da empresa uma solução, de certa forma até simples, que seria a instalação de um servidor proxy, normalmente o Squid, onde cada usuário teria sua senha de acesso, e a partir desta senha, ele teria a permissão de acessar apenas determinadas páginas.

A solução foi, até de forma rápida, aprovada pela diretoria da empresa, mas eles passaram alguns requisitos que complicaram um pouco a situação.

Os requisitos eram os seguintes:
  1. Deverá ser utilizado o servidor de arquivos, que é um Windows 2003 Server, para acumular a função de servidor proxy;
  2. O login e senha dos usuários para acesso à Internet deverá ser a mesma senha do sistema, e deverá ser atualizada em tempo real, ou seja, se o usuário atualizar a senha no sistema, ela deverá ser atualizada no servidor proxy automaticamente. O sistema utiliza uma base de dados Firebird 2.5.
  3. As páginas liberadas e bloqueadas deverão ser definidas pelos gerentes de cada setor. Deverá ser criada uma interface simples e amigável onde o gestor irá definir quais páginas poderão ou não serem acessadas. Assim que definidas as permissões de acesso, devem ser atualizadas em tempo real.

Ao analisar os requisitos, a coisa ficou um pouco complicada:
  1. Utilizar o Windows para servidor proxy não era o ideal, mas existe uma versão do Squid para Windows que funciona muito bem.
  2. Pesquisei muito na Internet e não achei nada pronto e que rodasse em Windows para fazer os usuários do Squid logarem no banco de dados Firebird. Cheguei à conclusão de que seria necessário a criação de um módulo para o Squid com este fim.
  3. A criação do front-end não é muito complicada, mas pensei na possibilidade de armazenar as permissões também no banco do sistema para facilitar o controle. Decidi também criar um módulo para este fim.

Como disse anteriormente, a solução foi desenvolvida baseada em um servidor Windows 2003, mas utilizei para desenvolvimento, apenas software livre, exceto o Borland Delphi 7 e todos os programas utilizados também rodam no GNU/Linux.

Como este site é voltado para GNU/Linux, escrevi este artigo baseado numa máquina virtual com o Debian 6, o que facilitará o acompanhamento por parte dos leitores.

O Borland Delphi 7 foi substituído pelo Lazarus.

A solução apresentada foi desenvolvida por mim utilizando software livre, por isso, estou publicando aqui para que possa ser útil a outras pessoas. Gostaria apenas que, caso alguém venha utilizar, mantenha os créditos do autor original.

Se for encontrados erros no módulo desenvolvido, todos podem contribuir fazendo melhorias.

Um pouco de teoria

Esta página é para quem gosta de teoria. Vou explicar aqui o funcionamento do nosso módulo.

Para a autenticação, o Squid sempre utiliza um programa externo. Este programa é definido no squid.conf. Lá, também são definidos alguns parâmetros importantes. O programa de autenticação é iniciado junto com o Squid e fica em memória durante toda a execução.

Ao iniciar o Squid, o módulo de autenticação é aberto e recebe os parâmetros definidos no "squid.conf". No nosso caso, estes parâmetros irão definir o servidor, caminho, usuário, senha e comando SQL do banco de dados.

Depois que o módulo estiver carregado, ele ficará aguardando que algum usuário tente autenticar no Squid. Quando o usuário informa o nome de usuário e senha, o Squid envia para o módulo, através da entrada padrão, uma linha com usuário e senha separados por um espaço em branco, semelhante a linha abaixo:
usuario   senha


Caso o usuário ou senha tenha um espaço em branco (ou outro caractere especial), ele será enviado no formato hexadecimal, conforme exemplo:
jose%20antonio   minha%20senha


O programa irá receber estes parâmetros, verificar se o usuário tem permissão e retornar na saída padrão:
  • OK - Caso o usuário e senha sejam válidos.
  • ERR - Caso o usuário e senha sejam inválidos.

Depois disso ele irá aguardar que um novo usuário e senha sejam informados. Este processo ocorre de forma indefinida, até que o Squid seja encerrado. Quando o Squid estiver sendo encerrado, ele enviará uma linha em branco para o programa.

Então, para que possamos fazer a autenticação no Firebird através do Squid, devemos fazer o seguinte:
  1. Ao iniciar o programa, receber os parâmetros;
  2. Criar um objeto de conexão ao banco de dados com os parâmetros recebidos;
  3. Iniciar um loop infinito, aguardando um usuário e senha;
  4. Receber, através da entrada padrão, a linha contendo usuário e senha;
  5. Separar o usuário e senha da linha padrão;
  6. Verificar se o usuário e senha estão em hexadecimal e decodificar;
  7. Verificar no banco e dados, se este usuário e senha são válidos;
  8. Retornar para a saída padrão o resultado da validação;
  9. Voltar para o passo 4.

O módulo para verificação de permissão é bem semelhante ao módulo de autenticação. No caso do nosso artigo, foi criado apenas um módulo que consegue autenticar e verificar o acesso apenas mudando algumas configurações no "squid.conf".

Este módulo permite a utilização em qualquer Squid, bastando definir algumas configurações no "squid.conf". Vou disponibilizar o módulo compilado para facilitar a instalação para os usuários, mas está disponível também o código fonte completo para compilar no Lazarus.

    Próxima página

Páginas do artigo
   1. Introdução
   2. Pré-requisitos
   3. Código fonte e compilação
   4. Alterando o squid.conf
   5. Arquivos e considerações finais
Outros artigos deste autor

Se o Linux é tão melhor que o Windows e é de graça, por que a maioria dos usuários ainda usa Windows?

Regras de ouro ao instalar o Linux em empresas

Leitura recomendada

Gerando relatórios no Sarg com nome da máquina/usuário ao invés do IP

Squid com autenticação básica + Gerador de relatórios Sarg - Instalação e configuração

Firewall + Proxy autenticado + Apache (Centos 5.5 32/64 bits)

Squid e firewall em 5 minutos

Controlando acesso às páginas do Apache na rede interna

  
Comentários
[1] Comentário enviado por wiskley em 05/04/2013 - 20:50h

Ola tudo Bem?
muito bom o seu tutorial porem encontrei problemas ao compilar o programa para o windows 2003, qualquer nome de usuario que eu digito da ERR. Fiz todas as modificações necessarias para colocar ele no windows 2003. pode dar uma ajuda?

[2] Comentário enviado por cruzeirense em 05/04/2013 - 22:40h

Prezado Wiskley,


Você fez o teste na linha de comando para saber se o módulo estava funcionando?

Tente utilizar essa sql:
select 1 from rdb$database where :a=1 or :b=1 or 1=1

Ela irá aceitar qualquer combinação de usuário e senha.
Se começar a retornar ok é porque o problema é no seu banco de dados ou consulta sql.
Neste caso verifique se os usuários estão cadastrados corretamente.

Se mesmo assim continuar dano err, poste o seu squid.conf para eu dar uma olhada.

()s

Renato

[3] Comentário enviado por wiskley em 05/04/2013 - 22:50h

Quando eu compilo o programa no lazarus (para windows) ele gera um arquivo de 947Kb porem tb da um erro "project1.lpr(98,23) Warning: Variable "parametros" does not seem to be initialized" , ai quando digito para teste admin admin o programinha da um erro de sql mas so acontece quando coloco o admin o user da ERR , usei o mesmo BD no Debian e funcionou normalmente so que o computador usa o windows 2003, quanto ao meu squid.conf esta igualzinho ao seu. Obrigado pela ajuda mesmo:

edit: Abaixo o link das imagens
http://profandre.org/imagens/erro%201.png
http://profandre.org/imagens/erro%202.png

[4] Comentário enviado por cruzeirense em 06/04/2013 - 06:41h

Prezado Wiskley,

Nas suas imagens reparei um erro nos caminhos dos arquivos.

Observe que os caminhos de arquivos no windows utilizam a barra invertida "\" e não a barra comum "/" como no linux.
faça o teste com o seguinte comando:
fb.exe "127.0.0.1;c:\dksoft\dados.fdb;sysdba;masterkey;select 1 from usuario where usuario=:usuario and senha=:senha;2;c:\tmp\fb_auth.log"

Se o teste der ok, você vai ter que fazer uma modificação para incluir a linha no squid.conf, visto que para o squid a barra invertida "\" é caracter de escape. Então você vai ter que colocar duas barras invertidas "\\". Fica dessa forma:

fb.exe "127.0.0.1;c:\\dksoft\\dados.fdb;sysdba;masterkey;select 1 from usuario where usuario=:usuario and senha=:senha;2;c:\\tmp\\fb_auth.log"

Tenta aí e posta o resultado...

()s

Renato

[5] Comentário enviado por cruzeirense em 06/04/2013 - 06:52h


[3] Comentário enviado por wiskley em 05/04/2013 - 22:50h:

Quando eu compilo o programa no lazarus (para windows) ele gera um arquivo de 947Kb porem tb da um erro "project1.lpr(98,23) Warning: Variable "parametros" does not seem to be initialized" , ai quando digito para teste admin admin o programinha da um erro de sql mas so acontece quando coloco o admin o user da ERR , usei o mesmo BD no Debian e funcionou normalmente so que o computador usa o windows 2003, quanto ao meu squid.conf esta igualzinho ao seu. Obrigado pela ajuda mesmo:

edit: Abaixo o link das imagens
http://profandre.org/imagens/erro%201.png
http://profandre.org/imagens/erro%202.png


Quanto a isso aí pode ignorar, a variável é inicializada em tempo de execução.

[6] Comentário enviado por wiskley em 06/04/2013 - 16:21h

Prezado Renato

Ja tinha pensado nisto tambem e ja havia trocado as barras porem continua o mesmo erro das imagens muito estranho isso. baixei outro Lazarus e tambem deu o mesmo problema, continuo tentando ate ver se consigo resolver o problema.
O log Auth.log esta retornando o seguinte:
--
127.0.0.1;c:\\dksoft\\dados.fdb;sysdba;masterkey;select 1 from usuario where usuario=:usuario and senha=:senha;2;c:\\tmp\\fb_auth.log
user user
Retornou ERR
--
se eu dou um admin admin ela da o erro de sql da imagem, achei que poderia ser o bd porem o bd esta funcionando normal testei com o ibexpert



[4] Comentário enviado por cruzeirense em 06/04/2013 - 06:41h:

Prezado Wiskley,

Nas suas imagens reparei um erro nos caminhos dos arquivos.

Observe que os caminhos de arquivos no windows utilizam a barra invertida "\" e não a barra comum "/" como no linux.
faça o teste com o seguinte comando:
fb.exe "127.0.0.1;c:\dksoft\dados.fdb;sysdba;masterkey;select 1 from usuario where usuario=:usuario and senha=:senha;2;c:\tmp\fb_auth.log"

Se o teste der ok, você vai ter que fazer uma modificação para incluir a linha no squid.conf, visto que para o squid a barra invertida "\" é caracter de escape. Então você vai ter que colocar duas barras invertidas "\\". Fica dessa forma:

fb.exe "127.0.0.1;c:\\dksoft\\dados.fdb;sysdba;masterkey;select 1 from usuario where usuario=:usuario and senha=:senha;2;c:\\tmp\\fb_auth.log"

Tenta aí e posta o resultado...

()s

Renato



[7] Comentário enviado por cruzeirense em 08/04/2013 - 16:19h

Prezado wiskley,

Você chegou a analisar o arquivo e log?

[8] Comentário enviado por wiskley em 08/04/2013 - 17:56h

127.0.0.1;c:\\dksoft\\dados.fdb;sysdba;masterkey;select 1 from usuario where usuario=:usuario and senha=:senha;2;c:\\tmp\\fb_auth.log
user user
Retornou ERR

so tem isso no log pelo que vi esta normal a linha de comando

[9] Comentário enviado por wiskley em 09/04/2013 - 23:20h

Prezado Renato pensei que o problema seria o Windows 2003 porem andei testando ele no windows xp, Windows 7 e tambem não funcionou a unica coisa que gera no log e a propria linha de execução do squid. achei estranho isso. comentei com minha professora ela disse que nao é normal que logicamente teria que funcionar. Estranho rsrsrsr

[10] Comentário enviado por cbsistem em 08/02/2015 - 12:12h

Renato ficou Fantastico. Compilei em Delphi XE 6 e rodei em um Windows 2008 Server, versao Squid 2.71.

Meus MuitosBens pra vc.



Contribuir com comentário




Patrocínio

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

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts