Como configuro um alerta de email quando um login ssh é bem-sucedido?


56

Alguém tem um script bash que enviará um email ou notificará alguém no caso de um login bem-sucedido em um servidor ssh? Quero ser notificado se alguém fizer login na minha caixa pessoal.

Estou usando o Ubuntu 12.04 executando o xfce

Respostas:


46

Aviso: de acordo com os comentários, isso não funcionará se o usuário criar um arquivo chamado ~/.ssh/rc. *

Modifique ou crie /etc/ssh/sshrccom o seguinte conteúdo:

ip=`echo $SSH_CONNECTION | cut -d " " -f 1`

logger -t ssh-wrapper $USER login from $ip
echo "User $USER just logged in from $ip" | sendemail -q -u "SSH Login" -f "Originator <from@address.com>" -t "Your Name <your.email@domain.com>" -s smtp.server.com &

Isso efetivamente o notificará por e-mail sempre que alguém efetuar login através do SSH, e o login será registrado no syslog.

Nota: Você precisará do sendemailpacote ( sudo apt-get install sendemail) para que a notificação por email funcione.

Nota: funciona com encaminhamento de porta, mas com a opção -N não.


Isso também funciona se o cliente não solicitar um TTY? Por exemplo, ssh -Napenas com encaminhamento de porta.
precisa saber é

isso também funciona quando estamos usando o gmail como servidor smtp?
User155073

Isso precisa de um aviso : isso não funciona se o usuário criar um arquivo chamado, ~/.ssh/rcportanto é bastante inútil como medida de segurança. A resposta de @adosaiguas pam_execé correta.
Fritz

2
@ mchid: Se você considerar a pergunta "Quero ser notificado se alguém fizer login na minha caixa pessoal". , isso pode ser aceitável. Se você tiver apenas uma conta de usuário. Caso contrário, você deve fazer isso para todas as contas, incluindo todas as contas recém-adicionadas. E, idealmente, certifique-se de que os usuários não possam modificar ou excluir seus ~/.ssh/rcarquivos. Usar um método para todo o sistema baseado pamé apenas mais confiável e seguro, porque só rootpode mexer com ele. Portanto, a resposta é: Os sshrdmétodos funcionam bem para sistemas de usuário único, mas o pammétodo funciona de maneira confiável para todos os sistemas.
Fritz

70

Aviso: Como sempre, quando você altera a configuração de logon, deixe uma sessão ssh de backup aberta em segundo plano e teste o logon em um novo terminal.

Como o sshrcmétodo não funciona se o usuário tiver seu próprio ~/.ssh/rcarquivo, explicarei como fazer isso pam_execcomo sugerido por @adosaiguas. O bom é que isso também pode ser facilmente adaptado a tipos de login que não sejam ssh(como logins locais ou mesmo todos os logons), conectando-os a um arquivo diferente /etc/pam.d/.

Primeiro, você precisa poder enviar e-mails a partir da linha de comando. Há outras perguntas sobre isso. Em um servidor de correio, é provavelmente mais fácil de instalar mailx(que provavelmente já está instalado de qualquer maneira).

Então você precisa de um arquivo de script executável login-notify.sh(eu o coloquei /etc/ssh/por exemplo) com o seguinte conteúdo. Você pode alterar as variáveis ​​para alterar o assunto e o conteúdo da notificação por email. Não se esqueça de executar chmod +x login-notify.shpara torná-lo executável.

#!/bin/sh

# Change these two lines:
sender="sender-address@example.com"
recepient="notify-address@example.org"

if [ "$PAM_TYPE" != "close_session" ]; then
    host="`hostname`"
    subject="SSH Login: $PAM_USER from $PAM_RHOST on $host"
    # Message to send, e.g. the current environment variables.
    message="`env`"
    echo "$message" | mailx -r "$sender" -s "$subject" "$recepient"
fi

Depois disso, você pode adicionar a seguinte linha a /etc/pam.d/sshd:

session optional pam_exec.so seteuid /path/to/login-notify.sh

Para fins de teste, o módulo é incluído como optional, para que você ainda possa efetuar login se a execução falhar. Depois de garantir que funcione, você pode alterar optionalpara required. Então o login não será possível, a menos que a execução do seu script de gancho seja bem-sucedida (se é isso que você deseja).

Para aqueles que precisam de uma explicação sobre o que é o PAM e como ele funciona, aqui está uma ótima .


11
Ele diz: /etc/ssh/login-notify.sh failed: exit code 13logo após o login :(
FelikZ

3
Obrigado, funciona muito bem. Apenas certifique-se de ter UsePAMdefinido yesno seu sshd_config.
Nicolas BADIA

2
Apenas uma nota para mim ou para outras pessoas que são novas no Selinux. Eu recebi um erro de permissão quando o pam_exec executou o script. Mais tarde, descobri que estava incorretamente rotulado para o Selinux. Clonei o script em / bin /, que será automaticamente rotulado como unconfined_u:object_r:bin_t:s0. Então eu chmod +x /bin/login-notify.she isso funciona.
precisa saber é o seguinte

3
/etc/pam.d/login <- para tty logins
Fernando André

2
@ 4wk_ Obrigado pela dica. Substituí-o por um link para o Internet Archive, por isso deve funcionar novamente agora.
Fritz

9

Temos usado o monit para monitorar processos em nossas caixas Linux. O monit também pode alertar por e-mails sobre logins bem-sucedidos no ssh. Nossa configuração monit se parece com isso

 check file ssh_logins with path /var/log/auth.log  
     # Ignore login's from whitelist ip addresses
     ignore match "100.100.100.1"    
     # Else, alert
     if match "Accepted publickey" then alert

Nota: A configuração do servidor de e-mail, o formato de e-mail etc. deve ser definido no monitrcarquivo

Atualização: escreveu uma postagem de blog mais detalhada sobre isso


7

Coloque o seguinte em /etc/profile:

if [ -n "$SSH_CLIENT" ]; then 
    TEXT="$(date): ssh login to ${USER}@$(hostname -f)" 
    TEXT="$TEXT from $(echo $SSH_CLIENT|awk '{print $1}')" 
    echo $TEXT|mail -s "ssh login" you@your.domain 
fi

Como o script funciona

/etc/profileé executado a cada login (para usuários do shell bash). A instrução if só retornará true se o usuário tiver efetuado login via ssh, o que, por sua vez, fará com que o bloco de código recuado seja executado.

Em seguida, criamos o texto da mensagem:

  • $(date)será substituído pela saída do datecomando
  • ${USER} será substituído pelo nome de login do usuário
  • $(hostname -f) será substituído pelo nome completo do host do sistema que está sendo conectado

A segunda TEXTlinha é adicionada à primeira, fornecendo o endereço IP do sistema do qual o usuário está efetuando login. Por fim, o texto gerado é enviado em um email para o seu endereço.

Resumo O Linux, por padrão, registra todos os logins do sistema, por ssh ou não, nos arquivos de log do sistema, mas às vezes - particularmente para um sistema que raramente é acessado via ssh - uma notificação rápida e suja pode ser útil.


2

Nesta outra pergunta, você provavelmente tem o que está procurando. Basicamente, você pode adicionar uma chamada ao comando mail no script que é executado quando um usuário efetua login via ssh: /etc/pam.d/sshd


2

Eu peguei algumas das excelentes respostas desse tópico e criei algo que é mais ou menos copiado e colado. Ele usa o Mailgun para enviar os e-mails, para que você não tenha problemas com a configuração do STMP. Você só precisa de uma chave da API Mailgun e um domínio de envio.

No login SSH, o script enviará detalhes do login (usuário, nome do host, endereço IP e todas as variáveis ​​de ambiente atuais) para um endereço de email. É fácil adicionar outros parâmetros que você deseja enviar personalizando a messagevariável.

#!/bin/sh

# this script is triggered on SSH login and sends an email with details of the login
# such as user, IP, hostname, and environment variables

# script should be placed somewhere on the server, eg /etc/ssh
# to trigger on SSH login, put this line in /etc/pam.d/sshd:
#   session optional pam_exec.so seteuid /etc/ssh/snippet-for-sending-emails-on-SSH-login-using-PAM.sh

# Script settings
MAILGUN_API_KEY=
MAILGUN_DOMAIN=
SENDER_NAME=
SENDER_EMAIL_ADDRESS=
RECIPIENT_EMAIL_ADDRESS=

if [ "$PAM_TYPE" != "close_session" ]; then
    host=$(hostname)
    ip=$(dig +short myip.opendns.com @resolver1.opendns.com) # gets public IP
    # Message to send, e.g. the current environment variables.
    subject="SSH login - user:$USER pam-host:$PAM_RHOST host:$host ip:$ip" \
    message=$(env)
    curl -s --user '$MAILGUN_API_KEY' \
        https://api.mailgun.net/v3/$MAILGUN_DOMAIN/messages \
        -F from='$SENDER_NAME <$SENDER_EMAIL_ADDRESS>' \
        -F to=$RECIPIENT_EMAIL_ADDRESS \
        -F subject="$subject" \
        -F text="${subject} ${message}"
fi

Esta é a melhor resposta na minha opinião. É simples e não requer o envio de um e-mail da máquina, que certamente acabará na pasta de spam, a menos que esteja configurado corretamente.
JayD3e

2

Adaptação para Mailgun da resposta @Fritz

Depois de postar, notei que o @pacharanero também escreve sobre mailgun, mas não entendo o que eles estão fazendo com o dig, por isso vou postar minha solução também.

Se você estiver em uma VM que não possui SMTP, pode ser necessário usar algo como mailgun, sendgrid ou algo semelhante. Isso funcionou para mim no Google Cloud.

Um risco dessa abordagem é que um invasor possa receber suas credenciais de envio de emails de saída, se puderem, sudo suencontrar o script ou você deixar o script para enviar legíveis por email. O mailgun possui uma lista branca de ip que você deve configurar, mas isso é imperfeito para este caso de uso específico, obviamente.

Este script deve funcionar com o mailgun após você mudar mydomain.compara o seu domínio real. Você pode salvar o script em /root/login-alert.shalgum local mais obscuro.

#!/bin/bash
if [ "$PAM_TYPE" != "close_session" ]; then
    APK='api:your-mailgun-api-key-goes-here' 
    FROM='Login Alert <mailgun@mg.mydomain.com>'
    TO='me@mydomain.com'  
    SUBJECT="Login: $PAM_USER @ mydomain.com from $PAM_RHOST"
    DATE=$(date)
    TEXT="At $DATE a login occurred for $PAM_USER on mydomain.com from $PAM_RHOST"
    curl -s --user $APK \
     https://api.mailgun.net/v3/mg.mydomain.com/messages \
     -F from="$FROM" \
     -F to="$TO" \
     -F subject="$SUBJECT" \
     -F text="$TEXT"
fi

Depois disso, você pode seguir a resposta do @Fritz para alterar /etc/pam.d/sshdpara incluir:

session optional pam_exec.so seteuid /root/login-alert.sh

Observo que isso funciona sem permissões de leitura para usuários que chegam ( chmod 700 /root/login-alert.sh), portanto, os usuários que chegam não precisam ter acesso de leitura ao script.


1

Esse script /etc/ssh/sshrcenvia um email e adiciona um log ao criador de logs do sistema. É feita uma diferença (para que você possa desativá-la, se quiser) entre sua sub-rede pessoal e a Internet (requer sudo apt-get install mailutils).

SUBNET="192.168.0"

IP=`echo $SSH_CONNECTION | cut -d " " -f 1`
CURRENT_SUBNET="$(echo $IP|cut -d'.' -f1-3)"
if [ "$CURRENT_SUBNET" = "$SUBNET" ]; then
        msg="This message comes from same subnet! User $USER just logged in from $IP"
        echo $msg|mail -s "$msg" root
else
        msg="This message comes from different subnet! User $USER just logged in from $IP"
        echo $msg|mail -s "$msg" root
fi

logger -t ssh-wrapper $USER login from $IP

1

Estou usando o swatchdog do pacote swatch para monitorar todas as linhas que contenham a frase " falha " (sem distinção entre maiúsculas e minúsculas) em /var/log/auth.log . Eu o configurei para executá-lo como um serviço systemd simples.

apt install swatch

Crie um arquivo de configuração /etc/swatch/swatch-auth-log.conf com a raiz do proprietário, permissão 644 -

watchfor /fail/i
  pipe /usr/local/sbin/sendmail -t auth.log@xxx.com

O "/ fail / i" é uma expressão regular, com o "i" indicando que não diferencia maiúsculas de minúsculas. (Meu sendmail é um script que envia tudo para um endereço fixo via mailgun , para que o endereço realmente não importe).

Crie um arquivo de serviço systemd /etc/systemd/system/swatch-auth-log.service com a raiz do proprietário, permissão 644 -

[Unit]
Description=monitor /var/log/auth.log, send fail notices by mail

[Service]
ExecStart=/usr/bin/swatchdog -c /etc/swatch/swatch-auth-log.conf -t /var/log/auth.log

[Install]
#WantedBy=multi-user.target
WantedBy=pre-network.target

Em seguida, ative, inicie e visualize o status do serviço -

sudo systemctl enable swatch-auth-log.service
sudo systemctl start swatch-auth-log.service
sudo systemctl status swatch-auth-log.service

Um exemplo de um relatório de status bem-sucedido -

 swatch-auth-log.service - monitor /var/log/auth.log, send fail notices by mail
   Loaded: loaded (/etc/systemd/system/swatch-auth-log.service; enabled; vendor preset: enabled)
   Active: active (running) since Thu 2019-01-31 21:41:52 PST; 17min ago
 Main PID: 27945 (swatchdog)
    Tasks: 3 (limit: 4915)
   CGroup: /system.slice/swatch-auth-log.service
           ├─27945 /usr/bin/perl /usr/bin/swatchdog -c /etc/swatch/swatch-auth-log.conf -t /var/log/auth.log
           ├─27947 /usr/bin/perl /.swatchdog_script.27945
           └─27949 /usr/bin/tail -n 0 -F /var/log/auth.log

Jan 31 21:41:52 ub18 systemd[1]: Started monitor /var/log/auth.log, send fail notices by mail.
Jan 31 21:41:52 ub18 swatchdog[27945]: *** swatchdog version 3.2.4 (pid:27945) started at Thu Jan 31 21:41:52 PST 2019

O serviço será iniciado automaticamente na inicialização e monitorado pelo systemd .


Discussão

Originalmente, usei uma solução pam semelhante à anterior, mas em /etc/pam.d/common-auth não sshd . Isso foi para pegar ssh, sudo e logins. Mas depois de uma atualização, todas as minhas senhas pararam de funcionar, mesmo depois de alterar as senhas no modo de recuperação. Eventualmente, mudei o /etc/pam.d/common-auth para o original e as senhas voltaram a funcionar. Aqui está uma descrição na placa UNIX e Linux do Stack Exchange

Eu decidi que seria mais seguro não tocar difícil entender as configurações de segurança. E tudo está nos arquivos de log de qualquer maneira.


0

Na verdade, eu apenas modifiquei a resposta @SirCharlo

ip=`echo $SSH_CONNECTION | cut -d " " -f 1`

logger -t ssh-wrapper $USER login from $ip
echo "User $USER just logged in from $ip" | mail -s "SSH Login" "who to <who-to@youremail.com>" &

Isso funciona nos servidores 14.04, 16.04 e Centos 6.5.x que eu configurei, tenho certeza que você precisa garantir que o mta esteja configurado, mas, uma vez feito isso, isso funciona muito bem. Próxima etapa alertas twilio

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.