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:
- Deverá ser utilizado o servidor de arquivos, que é um Windows 2003 Server, para acumular a função de servidor proxy;
- 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.
- 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:
- Utilizar o Windows para servidor proxy não era o ideal, mas existe uma versão do Squid para Windows que funciona muito bem.
- 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.
- 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:
- Ao iniciar o programa, receber os parâmetros;
- Criar um objeto de conexão ao banco de dados com os parâmetros recebidos;
- Iniciar um loop infinito, aguardando um usuário e senha;
- Receber, através da entrada padrão, a linha contendo usuário e senha;
- Separar o usuário e senha da linha padrão;
- Verificar se o usuário e senha estão em hexadecimal e decodificar;
- Verificar no banco e dados, se este usuário e senha são válidos;
- Retornar para a saída padrão o resultado da validação;
- 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.