Respostas:
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/sshrc
com 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 sendemail
pacote ( 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.
~/.ssh/rc
portanto é bastante inútil como medida de segurança. A resposta de @adosaiguas pam_exec
é correta.
~/.ssh/rc
arquivos. Usar um método para todo o sistema baseado pam
é apenas mais confiável e seguro, porque só root
pode mexer com ele. Portanto, a resposta é: Os sshrd
métodos funcionam bem para sistemas de usuário único, mas o pam
método funciona de maneira confiável para todos os sistemas.
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 sshrc
método não funciona se o usuário tiver seu próprio ~/.ssh/rc
arquivo, explicarei como fazer isso pam_exec
como 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.sh
para 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 optional
para 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 .
/etc/ssh/login-notify.sh failed: exit code 13
logo após o login :(
UsePAM
definido yes
no seu sshd_config.
unconfined_u:object_r:bin_t:s0
. Então eu chmod +x /bin/login-notify.sh
e isso funciona.
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 monitrc
arquivo
Atualização: escreveu uma postagem de blog mais detalhada sobre isso
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
/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 date
comando${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 TEXT
linha é 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.
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
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 message
variá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
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 su
encontrar 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.com
para o seu domínio real. Você pode salvar o script em /root/login-alert.sh
algum 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/sshd
para 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.
Esse script /etc/ssh/sshrc
envia 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
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.
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
ssh -N
apenas com encaminhamento de porta.