Ensinando seu servidor a ler emails e liberar acesso SSH

Esta solução baseia-se em um programa que recebe emails via console e os armazena em forma de arquivos de texto, um programa que envia emails via console e um script shell que trata os emails com base em algumas instruções pré-estabelecidas, sendo executado a cada 5 minutos.

[ Hits: 43.404 ]

Por: Kernel Panic em 14/11/2007 | Blog: http://nooooooooooooooo.com


Configurando o servidor para "LER" os emails



Agora vem a parte insana, colocar o servidor para interpretar os e-mails.

# vim /bin/cmdemail.sh

#!/bin/bash
# Script cmdemail.sh v 1.0
# Por Kernel Panic <kernelpanic@hush.com>
#
# Palavra chave que será checada no campo Assunto(Subject):
# Muita Atenção nesta etapa porque deverá ser exatamente
# igual para funcionar.
##################################################
MAGICSUBJECT="IN A WORLD NO FENCES WHO NEED GATES"
##################################################
# Local onde estão os e-mails recebidos

EMAILDIR="/home/usuário/.getmail"

# Caminho do iptables
IPTABLES="/usr/sbin/iptables"

# Interface externa (internet)
IFNET="eth1"

# Palavra que estará no corpo do e-mail para
# indicar o ip a ser liberado.
IPLIB="ABRIR"

# Arquivo de log
LOG="/home/usuario/.getmail/log"

# chama o programa Getmail para receber os e-mails
/usr/bin/getmail --quiet

# Inicio do Processamento
for i in $EMAILDIR/new/*;
do
        # Verifica os arquivos de e-mail em busca do Assunto "MAGICSUBJECT" para processar os comandos.
        if grep -qs "$MAGICSUBJECT" $i;

        # Apos encontrar o e-mail com o assunto "MAGICSUBJECT" inicia o processamento.
        then
        # Extrai o e-mail do remetente do campo "From"
                EMAILREM=$(cat $i | grep From: | sed -e 's/.\+<//' -e 's/>.*//')
        # Extrai o IP a ser liberado para acesso remoto
        # o corpo do e-mail devera conter ABRIR: 201.202.203.204
        # ou o que for definido na variável IPLIB.
        IP=$(cat $i | awk '/'$IPLIB':/ {print $2}' | egrep "(([0-9]{1,2}|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}(([0-9]{1,2}|1[0-9][0-9]|2[0-4][0-9]|25[0-5]))$" | tail -n 1)

                # Libera o ip para acessar via SSH
                sudo $IPTABLES -A INPUT -s $IP -i $IFNET -p tcp -m tcp --dport 22 -j ACCEPT

                # Log
                echo "cmdemail: IP: $IP | REMETENTE: $EMAILREM | Data: `date `" >> $LOG

                # Envia e-mail para o remetente
                echo -e "Comando efetuado com sucesso.\nIP $IP liberado para acesso" > $EMAILTMP/email.txt
                email -q -s "Comando Processado Com Sucesso" $EMAILREM < $EMAILDIR/tmp/email.txt

                # Move os e-mails já processados
                ARQ=$(basename $i)
                mv $i $EMAILDIR/cur/$ARQ.PROCESSADO

        # Todo arquivo de e-mail que não apresentar o Assunto "MAGICSUBJECT" sera movido.
        else
                if [ -f "$i" ]; then mv $i $EMAILDIR/tmp/$ARQ.RECUSADO ; fi
        fi
done

Importante: um usuário não conseguira executar o iptables, por isso é preciso adicionar a seguinte linha ao arquivo "sudoers":

# echo usuario ALL = NOPASSWD: /usr/sbin/iptables >> /etc/sudoers

Página anterior     Próxima página

Páginas do artigo
   1. Apresentação
   2. Configurando o servidor para receber emails (Getmail)
   3. Configurando o servidor para enviar emails (Email 2.5)
   4. Configurando o servidor para "LER" os emails
   5. Finalizando
Outros artigos deste autor
Nenhum artigo encontrado.
Leitura recomendada

Firewall Linux - Roteamento avançado usando iproute2 e iptables (load balance)

Firewall invisível com Proxy ARP

Firewall seguro com o IPTables

Criando cluster com o PFSense

Entendendo TCP/IP (Parte 5) - Portas TCP/UDP

  
Comentários
[1] Comentário enviado por thiagop em 14/11/2007 - 08:58h

Gostei da sua solução :)

Só fiquei preocupado em dar os direitos a todos os usuários a rodar o iptables no /etc/sudoers... mas dá-se um jeito ;)


Abraços e parabéns!

[2] Comentário enviado por kpanic em 14/11/2007 - 09:49h

Saudações...

Concordo com você, eu avaliei desta forma também, entretanto a idéia é rodar estas rotinas como um usuário específico e atribuir apenas a este usuário poder utilizar o iptables através do comando sudo sem que precise passar a senha do root.
Exemplo [ /etc/sudoers ]:

gasper ALL = NOPASSWD: /usr/sbin/iptables

Nesse exemplo somente o usuário gasper tem a permissão e apenas para executar o comando iptables sem que lhe seja solicitado senha.
Esse "ALL" confunde um pouco. =]

Abraços

Kernel Panic

[3] Comentário enviado por thiagop em 14/11/2007 - 09:51h

Epa, comi bola hahaha valeu pelo lembrete!

E agora acho que ninugém mais se confunde ;)

[4] Comentário enviado por dedraks em 14/11/2007 - 10:25h

Muito legal o seu tutorial.
Eu gostaria de dar umas dicas:

1) Seria bom enviar os emails de forma criptografada ao invés de texto plano.
2) Melhor, enviar os emails usando chaves criptográficas. Aí o servidor só aceitaria emails que vierem de fontes seguras.
3) Colocar no script de logout do bash, o comando pra fechar a porta 22 novamente. Desso modo, ao se desconectar do servidor, a porta é fechada automaticamente.

[5] Comentário enviado por elgio em 14/11/2007 - 10:53h

Bastante criativo

[6] Comentário enviado por elgio em 14/11/2007 - 10:58h

A, esqueci, porque mesmo que a solução por telepatia foi abandonada?
:-D

[7] Comentário enviado por y2h4ck em 14/11/2007 - 11:17h

Rapaz, sem querer desmerecer seu artigo mas vc dizia no começo
"queria uma forma segura e confiável de acessar o firewall"

Onde diabos vc acha que :
- Mandar emails para um firewall para liberar acesso é seguro
- Adicionar iptables no SUDOERS é seguro ?????


Rapaz, coisa de loco isso ... segurança -1 :P
A soluçao é bacana para vc aprender a fazer umas coisas bacanas,
mas nunca implementem um trosso desse em ambiente de produção !!

Quer uma forma segura e confiável de acesar o firewall ? Acesse via VPN :) com criptografia.
ehehe

[8] Comentário enviado por volcom em 14/11/2007 - 11:22h

Muiiiiiiiiiiiiiiito Bom!!!

Cara, impressionante heheheh, gostei muito mesmo e vou testar assim que possível :D

Abraço e Parabéns

[9] Comentário enviado por elgio em 14/11/2007 - 11:27h

y2h4ck: hehehehe
Eu não quiz ser tão direto ao ponto como tu, mas não posso deixar de registrar que fecho contigo no teu comentário!

[10] Comentário enviado por kpanic em 14/11/2007 - 14:08h

Saudações...

Agradeço a todos pelos comentários e sugestões.
Algumas reações considero normais para a maioria do administradores que assim como eu acreditam que: "A paranóia é nossa amiga".
Muito mais do que somente uma receita de bolo, a intenção foi passar a idéia de uma máquina linux realizando instruções recebidas por email.
Quanto a aspectos de segurança, é um debate tão amplo que não cabe tratar aqui, já que a proposta do artigo nunca não foi esta, entretanto prefiro crer que todo servidor é seguro, exceto os mal administrados.
Uma resposta genérica seria: Sim, existem muitas formas de melhorar e tornar isso mais seguro.
Cabe a cada um conhecer seu ambiente e decidir a te que ponto isso pode ou não ser implementado.

PS: Quer uma forma de deixar seu firewall seguro? tire os cabos de rede.
(não vale usar tempest) ;)

Abraços

Kernel Panic

[11] Comentário enviado por y2h4ck em 14/11/2007 - 15:00h

"entretanto prefiro crer que todo servidor é seguro, exceto os mal administrados."

Infelizmente ehueh até o dos bons administradores é inseguro =]

[12] Comentário enviado por eduka em 14/11/2007 - 16:06h

É uma idéia muito boa, mesmo.

Independentemente das questões acima citadas sobre segurança relativas a sudo ou criptografia dos emails, o que vale mesmo é o fato de a porta 22 não ficar disponível o tempo todo, ou seja, a questão é manter segurança por "default"

Creio que o mecanismo proposto é legal, pois é uma forma criativa e controlada de fazer uma abertura (vejam que somente os scripts no servidor é que tem a inteligência de fazer ou não fazer a abertura ).

Kernel Panic: esta idéia de ler email é legal, hein? Já fiz implementações de interpretar emails, mas sempre sendo eu um servidor SMTP (ex. qmail, procmail ), mas sua idéia é que o servidor é client de uma conta externa. Ótimo! parabéns...

[13] Comentário enviado por jalexandre em 06/03/2008 - 16:04h

Kernel Panic, a idéia a sem duvida nenhuma bem criativa, ponto para você.

Porém, se você fizer isso em lugares que seguem a BS7799, é bem provavél que tu seja mandado embora.

Uma forma interessante de fazer isso seria uma implementação de VPN + PortKnocking.

Parabéns pela criatividade. Sem dúvida, eu irei utilizar este método para algumas coisas que divertidas, como robozinhos de manutenção. =)

[ ] 's

[14] Comentário enviado por joaorubens em 01/03/2013 - 13:10h

da uma olhada no meu post e me fala se esqueci alguma coisa.
http://www.vivaolinux.com.br/topico/vivaolinux/Como-enviar-email-via-SSH

[15] Comentário enviado por GIRLinux em 19/03/2013 - 18:09h

Ola quando tento enviar um email me da o erro
Fatal smtp error 530 5.7.0 must issue a STARTTLS COMMAND FIRST

Conta : hotmail
Porta smtp

smtp_server = 'smtp.live.com'
smtp_port = '587'


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts