Gateway autenticado com Apache, Iptables e CGI em shell

Procurando uma solução que fosse ao mesmo tempo simples de ser implementada e de grande eficiência comparados aos gateways mais sofisticados que empregam bancos de dados e etc, cheguei a esta solução ideal para ser usada em provedores wireless ou a cabo. Ela ainda está em desenvolvimento e dada a sua enorme simplicidade de seu conceito pode servir de base para projetos mais elaborados.

[ Hits: 86.064 ]

Por: Carlos Affonso Henriques. em 27/07/2007


O script CGI de autenticação



Primeiramente criamos um arquivo denominado mac_accept4.cgi, o 4 é apenas uma convenção minha par cada modificação que inseri no script. Crie-o em seu diretório cgi-bin, que em meu caso é o default /var/www/cgi-bin.

Este arquivo pertencerá ao root e deverá ter o SUID habilitado para que o apache o execute com privilégios de root.

Então altere suas permissões:

# chmod 4775 mac_accept4.cgi

Não se esqueçam de criar um link simbólico para ele no nosso DocumentRoot:

# ln -sf /var/www/cgi-bin /mnt/sda6/httpd/cgi-bin

ATENÇÃO! Após o início de nosso script CGI "#!/bin/bash" dê um LF "ou enter" e digite "echo" na linha seguinte, pois o apache não irá executá-lo se isso não for feito.

#!/bin/bash

echo
echo "<html> <head> <title>Gateway Autenticado</title><meta http-equiv="Content-Type" content="text/html charset=iso-8859-1"></head> <body bgcolor="#FFFFCC">"
echo "<p><font face="Arial, Helvetica, sans-serif"><strong>Sistema de Gateway Autenticado 1.02</strong><br>"
var=$(sed -n 'p')
nome=$(sed -n '/login=/{/&/tc;:a;/&/!{N;ba;};:c;s/.*login=//;s/&.*$//;p;}' <(echo $var) | tr 'A-Z' 'a-z')
senha=$(sed -n '/senha=/{/&/tc;:a;/&/!{N;ba;};:c;s/.*senha=//;s/&.*$//;p;}' <(echo $var))
ipclient=`sudo /usr/sbin/iptables -L FORWARD | fgrep $REMOTE_ADDR | cut -f12 -d" "`
macclient=`fgrep $nome /var/www/cgi-bin/.users | cut -f4 -d,`
maccheck=`sudo arping -c1 -D $REMOTE_ADDR | fgrep [ | cut -f2 -d"[" | cut -f1 -d"]"`
clientcheck=`fgrep $nome,$senha,$REMOTE_ADDR,$maccheck /var/www/cgi-bin/.users`

mrk=$(bc <<< "obase = 16 ; `echo $REMOTE_ADDR | cut -f3 -d.`" | tr [A-F] [a-f])
echo "=========================================<br>"
echo "$REMOTE_ADDR - 0x$mrk<br>"

if [ $clientcheck ];then
    echo "$clientcheck CONFERE<br>"
    else
    echo "$clientcheck NÃO CONFERE<br>"
    echo "Saindo..<br>"
    exit
fi

if [ $ipclient ];then
sudo /usr/sbin/iptables -D INPUT -s $REMOTE_ADDR -m mac --mac-source $macclient -j ACCEPT | sudo /usr/sbin/iptables -D FORWARD -s $REMOTE_ADDR -m mac --mac-source $macclient -j ACCEPT
    echo "Autenticação Cancelada<br>"
    else
sudo /usr/sbin/iptables -I INPUT -s $REMOTE_ADDR -m mac --mac-source $macclient -j ACCEPT | sudo /usr/sbin/iptables -I FORWARD -s $REMOTE_ADDR -m mac --mac-source $macclient -j ACCEPT
    echo "Autenticado com sucesso!<br>"
fi
/bin/kill -9 $PPID
echo </boby>
echo </html>

Observem que o script atua como um "toggle", ou seja, ele faz a operação inversa quando é executado uma segunda vez. Isso tem a finalidade de evitar que hajam autenticações simultâneas. Se o cliente "esperto" der seu login e senha para um amigo que clone o IP e MAC do hardware do cliente, ele será autenticado, porém irá desfazer a autenticação antes estabelecida.

Página anterior     Próxima página

Páginas do artigo
   1. Preparando o Apache
   2. Configurando o SSL no Apache
   3. A topologia da rede
   4. O firewall
   5. A página de autenticação
   6. O arquivo de contas
   7. O script CGI de autenticação
   8. O script para desfazer a autenticação
   9. A tabela ARP estática
   10. O controle de banda
   11. Notas e agradecimentos
Outros artigos deste autor

SSH Connection With non-NIST Russian Cipher and Distro for Military Use

Docker: Uma abordagem didática para tempos obscuros

Sistema de arquivos criptografado

O que é ForceCommand

Debian sem Systemd

Leitura recomendada

VPN com FreeS/WAN

Jogando pesado na segurança de seu SSH

Elevação de privilégios locais

Exploração de Falhas em Servidores FTP

Não precisamos de antivírus, eles sim

  
Comentários
[1] Comentário enviado por removido em 27/07/2007 - 15:57h

Olá Amigo,

Bom, para deixar seu artigo ainda mais rico eu gostaria de dar uma opinião! No caso de um hijack bem feito (roubo de seção), quando o cliente cai e em seguida entra o hijack seu arping vai consultar ele tranqüilamente! Concorda!? Espero que sim, pois eu já fiz testes com isso e infelizmente da certo! A solução é simples, ao invés de fazer o servidor consultar quem está de pé ou não, o que dependendo do número de estações tem um tempo elevado, eu sugiro mudar para o comando at. Como já uso o servidor Radius, foi fácil, no comando AT eu agendo uma verificação pra saber se o IP tal é do fulano de tal conectado no radius, aí sim, se não for a regra dele é derrubada! Pra substituir o uso do radius, pode-se pensar em cookie, por exemplo!

T+

[2] Comentário enviado por capitainkurn em 27/07/2007 - 17:50h

Boa! nem havia me ocorrido o at.

Quando elaborei aquele while de arping, pensei em coloca-los isoladamente rodando sob um shell filho do mac_accept4.cgi que seria chamado em background, mas esbarrei em um problema... não entendí ainda o por que de não conseguir rodar um loop em um shell filho a partir de um CGI, mas é uma coisa que estou bolando e a sua idéia do at foi grande.
Obrigado pela dica, e espero que tenha gostado do artigo.

[3] Comentário enviado por fabiorvs em 22/04/2008 - 19:07h

Ola tem como fazer a autenticação só por usuário, sem o MAC e ip, pois trabalho em uma faculdade e preciso cadastrar todos os alunos.

[4] Comentário enviado por capitainkurn em 23/04/2008 - 10:03h

É mais fácil ainda, a única razão para eu atrelar o ip ao mac address é o controle de banda, pois provedores em geral possuem planos de velocidade diferentes e se não houver vínculo entre o IP e o login e senha o usuário poderia configurar um IP manualmente e usar uma velocidade maior do que a contratada.

[5] Comentário enviado por cleibson em 03/05/2009 - 22:57h

Como o cliente será diretionado para autenticação, sendo que não há nenhuma regra redirecionando sua navegação para a porta 443 obrigando-o a autenticar antes de navegar

[6] Comentário enviado por removido em 06/05/2010 - 09:29h

òtima dica para o combate de ataques do TIPO MITM, originados por arpspoof.

[7] Comentário enviado por douglassironi em 28/06/2011 - 18:38h

Sobre a questão de atrelar MAC, podemos fazer isso com PHP, no momento que o cliente se cadastra e cria seu usuario e senha, podemos tranquilamente pegar o MAC dele com a função, abaixo tem um link explicando como fazer.

http://scriptbrasil.com.br/forum/index.php?showtopic=70543

No momento que o usuario/cliente se cadastrar, pode ser gerado o arquivo do DHCP atrelando um ip para o mac capturado.

Recomendo ultilizar um banco de dados para salvar as informações dos clientes/usuarios.
O freeradius tem as tabelas prontas em vários tipos de BD.

Qualquer duvida, estou a disposição.
contato@douglassironi.com


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts