Monitora todas as tentativas de login

6

Algumas semanas atrás, achei que seria uma boa idéia escrever um script para me enviar um email sempre que algum usuário fizesse login no meu servidor.

Então eu vim com um script em perfeito funcionamento notifyLogin.sh , então decidi chamá-lo do script .bash_login de cada usuário.

Mas descobri que alguém poderia fazer login no meu servidor usando a opção ssh -t para selecionar um shell disponível. Por exemplo:

ssh user@myserver -t sh

Dessa forma, .bash_login não é executado, nem /etc/profile .

Existe alguma maneira de chamar notifyLogin.sh independente do tipo de shell no log in? (Deve sempre funcionar)

    
por Pablo Francisco Pérez Hidalgo 10.07.2014 / 19:12

5 respostas

11

Não reinvente a roda, deixe rsyslog fazer tudo por você. Ele tem a capacidade de enviar e-mails quando os padrões são correspondidos nas mensagens do syslog antes que eles atinjam um arquivo.

Defina seu endereço de e-mail e servidor SMTP da seguinte maneira e coloque-o no seu /etc/rsyslog.conf ou solte-o em /etc/rsyslog.d/ e reinicie o rsyslog

$ModLoad ommail
$ActionMailSMTPServer localhost
$ActionMailFrom [email protected]
$ActionMailTo [email protected]
$template mailSubject,"Login Alert on %hostname%"
$template mailBody,"\n\n%msg%"
$ActionMailSubject mailSubject
$ActionExecOnlyOnceEveryInterval 1
# the if ... then ... mailBody mus be on one line!
if $msg contains 'session opened for user' then :ommail:;mailBody

Isso disparará um e-mail quando rsyslog corresponder à string session opened for user em uma mensagem.

Você pode procurar em /var/log/auth.log as mensagens de sshd para ver o que mais pode usar como padrões.

Fonte: rsyslog ommail

    
por 10.07.2014 / 23:35
2

Primeiro, você não deve confiar no perfil do usuário, porque ele pode alterá-lo. Se é realmente o seu servidor, você poderia:

  • teste para entradas em auth.log, utmp ou periodicamente (ou acionado por inotify)
  • escreva um wrapper para /bin/login , que faz suas coisas e, em seguida, executa o /bin/login real. (Não tenho certeza se, por exemplo, o ssh executa /bin/login , mas espero que sim.) Mas não posso recomendar isso - é muito perigoso.
por 10.07.2014 / 19:36
0
/var/log/auth.log

Acompanhe as tentativas para o seu sistema

cat /var/log/auth.log grep sshd.\*Failed 

isso pode fazer com que o grep falhe, também os timestamps estão disponíveis para que você possa ajustá-lo ao seu script, também talvez com

tail -f /var/log/auth.log 

você pode rastrear a entrada o tempo todo e fazer algum regexp.

    
por 10.07.2014 / 19:37
0

Eu sei que isso é antigo, mas eu escrevi algo para monitorar conexões / tentativas ssh bem sucedidas e com falha. Bem como IPs proibidos se você estiver usando o sshguard. Eu escrevi em Python e em Ruby. Ele irá enviar e-mail quando alguém se conecta com sucesso via ssh, quando alguém recebe a senha ssh errado ou quando alguém é banido devido a muitas tentativas falhadas. Espero que isso ajude alguém no futuro a pesquisar esse problema e encontrar meu código!

Implementação em Python:

https://github.com/amboxer21/SSHMonitorPy

Implementação do Ruby:

https://github.com/amboxer21/SSHMonitor

Para o script python, escrevi um script bash para monitorar o processo. Ele verifica se está sendo executado a cada minuto por meio da tarefa cron do usuário root. Se não estiver em execução, inicia outro processo.



Script de bash:

/home/anthony/.ssh/is_sshm_running.sh

#!/bin/bash

if [[ 'ps aux | egrep --color -i "root.*[0-9]*:[0-9]* sudo /usr/bin/python /usr/bin/SSHMonitor.py" | wc -l' < 1 ]]; then
  sudo /usr/bin/python /usr/bin/SSHMonitor.py -e "[email protected]" -p "password" &
fi

if [[ 'ps aux | egrep --color -i "root.*[0-9]*:[0-9]* sudo /usr/bin/python /usr/bin/SSHMonitor.py" | wc -l' > 1 ]]; then
  sudo kill -9 'ps aux | egrep --color -i "root.*[0-9]*:[0-9]* sudo /usr/bin/python /usr/bin/SSHMonitor.py" | awk '{print $2}'';
fi

O que é chamado por esta tarefa cron raiz a cada minuto:

[anthony@ghost ImageCapturePy]$ sudo crontab -l
[sudo] password for anthony: 
* * * * * /bin/bash /home/anthony/.ssh/is_sshm_running.sh
    
por 06.04.2017 / 20:08
0

Eu gosto da solução do @creek de cima, mas com uma pequena alteração:

if $msg contains 'session opened for user' then :ommail:;mailBody'

para

if $msg contains 'sshd:session' then :ommail:;mailBody'

Se você simplesmente usar "sessão aberta para o usuário", receberá uma mensagem toda vez que seus cronjobs dispararem. Pelo menos para mim, só quero monitorar o SSH. Você pode ajustar a condição acima para atender a qualquer outra necessidade.

    
por 03.11.2017 / 13:18