ssh 로그인에 성공했을 때 이메일 알림을 설정하려면 어떻게합니까?


56

ssh 서버에 성공적으로 로그인 한 경우 누군가에게 전자 메일을 보내거나 알리는 bash 스크립트가 있습니까? 누군가 내 개인 상자에 로그인하면 알림을 받고 싶습니다.

xfce를 실행하는 Ubuntu 12.04를 사용하고 있습니다.

답변:


46

경고 : 의견에 따르면 사용자가 ~/.ssh/rc. * 라는 파일을 만들면 작동하지 않습니다 . *

/etc/ssh/sshrc다음 내용으로 수정하거나 작성 하십시오.

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 &

이것은 누군가 누군가 SSH를 통해 로그인 할 때마다 이메일로 효과적으로 통지하며, 로그인은 syslog에 기록됩니다.

참고 : 이메일 알림이 작동 하려면 sendemail패키지 ( sudo apt-get install sendemail) 가 필요합니다 .

참고 : 포트 전달에서는 작동하지만 -N 옵션에서는 작동하지 않습니다.


클라이언트가 TTY를 요청하지 않은 경우에도 작동합니까? 예 ssh -N를 들어 포트 전달 만 가능합니다.
gertvdijk

smtp 서버로 gmail을 사용할 때도 작동합니까?
user155073

이것은 경고 가 필요합니다 : 사용자가 파일을 만들면 작동하지 않으므로 ~/.ssh/rc보안 수단으로 쓸모가 없습니다. @adosaiguas의 대답 pam_exec은 정답 입니다.
프리츠

2
@mchid : "개인 상자에 로그인 한 경우 알림을 받고 싶습니다." 다음이 허용합니다. 사용자 계정이 하나만있는 경우 그렇지 않으면 새로 추가 된 모든 계정을 포함한 모든 계정에 대해 수행해야 합니다. 이상적으로는 사용자가 ~/.ssh/rc파일을 수정하거나 삭제할 수 없도록해야 합니다. 시스템 전체를 기반으로 한 방법을 사용하는 pam것은 더 root혼란스럽고 안전 합니다. 그 대답은 다음과 같습니다.이 sshrd방법은 단일 사용자 시스템에서는 pam작동 하지만 모든 시스템에서 안정적으로 작동 합니다.
Fritz

70

경고 : 로그인 구성을 변경할 때 항상 백업 ssh 세션을 백그라운드에서 열어두고 새 터미널에서 로그인을 테스트하십시오.

때문에 sshrc사용자가 자신의 경우 방법이 작동하지 않는 ~/.ssh/rc파일을, 나는이 작업을 수행하는 방법을 설명 할 것이다 pam_exec@adosaiguas 제안한다. 좋은 점은 ssh에서 다른 파일에 연결하여 로컬 로그인 또는 모든 로그인과 같은 다른 로그인 유형에도 쉽게 적용 할 수 있다는 것입니다 /etc/pam.d/.

먼저 명령 행에서 메일을 보낼 수 있어야합니다. 이것에 대한 다른 질문이 있습니다. 메일 서버에서 설치 mailx하는 것이 가장 쉽습니다 (아마도 이미 설치되어 있음).

그런 다음 다음 내용이 포함 된 실행 가능한 스크립트 파일 login-notify.sh( /etc/ssh/예 : 파일)이 필요합니다 . 이메일 알림의 제목과 내용을 변경하기 위해 변수를 변경할 수 있습니다. chmod +x login-notify.sh실행 가능 하도록 실행 하는 것을 잊지 마십시오 .

#!/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

일단 그런 다음에 다음 줄을 추가 할 수 있습니다 /etc/pam.d/sshd.

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

테스트 목적으로 모듈이로 포함되어 optional있으므로 실행에 실패한 경우에도 로그인 할 수 있습니다. 당신이 작동하는지 확인 만든 후에는 변경할 수 있습니다 optionalrequired. 그러면 후크 스크립트가 성공적으로 실행되지 않으면 로그인 할 수 없습니다 (원하는 경우).

PAM이 무엇이며 어떻게 작동하는지에 대한 설명이 필요한 사람들에게는 여기에 매우 좋은 것이 있습니다.


1
그것은 말한다 : /etc/ssh/login-notify.sh failed: exit code 13바로 로그인 :( 후
FelikZ

3
고마워요, 잘 작동합니다. sshd_config에서 UsePAM설정 했는지 확인하십시오 yes.
Nicolas BADIA

2
나 자신이나 Selinux를 처음 접하는 사람들에게만 참고하십시오. pam_exec가 스크립트를 실행할 때 권한 오류가 발생했습니다. 나중에 나는 그것이 Selinux로 잘못 분류되었다는 것을 알았다. 스크립트를 / bin /에 복제했는데 자동으로로 표시됩니다 unconfined_u:object_r:bin_t:s0. 그런 다음 나는 chmod +x /bin/login-notify.sh작동합니다.
RedGiant

3
/etc/pam.d/login 파일 <- 청각 장애 로그인에 대한
페르난도 안드레

2
@ 4wk_ 힌트를 주셔서 감사합니다. 인터넷 아카이브에 대한 링크로 교체 했으므로 이제 다시 작동해야합니다.
프리츠

9

우리는 리눅스 박스에서 프로세스를 모니터링하기 위해 monit 을 사용 하고 있습니다. monit 은 ssh를 통한 성공적인 로그인에 대해 이메일로 경고 할 수도 있습니다. 우리 MONIT의 설정은 다음과 같습니다

 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

참고 : 메일 서버 구성, 이메일 형식 등은 monitrc파일 로 설정해야합니다.

업데이트 : 이것에 대한 자세한 블로그 게시물 을 작성했습니다


7

다음을 넣습니다 /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모든 로그인 (bash 쉘 사용자의 경우)마다 실행됩니다. if 문은 사용자가 ssh를 통해 로그인 한 경우에만 true를 반환하며, 이로 인해 들여 쓰기 된 코드 블록이 실행됩니다.

그런 다음 메시지의 텍스트를 작성합니다.

  • $(date)date명령 의 출력으로 대체됩니다
  • ${USER} 사용자의 로그인 이름으로 대체됩니다
  • $(hostname -f) 로그인 한 시스템의 전체 호스트 이름으로 대체됩니다.

두 번째 TEXT줄은 첫 번째 줄에 추가되어이 사용자가 로그인 한 시스템의 IP 주소를 제공합니다. 마지막으로, 생성 된 텍스트는 이메일로 귀하의 주소로 전송됩니다.

요약 리눅스는 기본적으로 시스템 로그 파일에 ssh에 상관없이 모든 시스템 로그인을 기록하지만 때로는 ssh를 통해 거의 액세스하지 않는 시스템에 대해서는 빠르고 더러운 알림이 유용 할 수 있습니다.


2

이 다른 질문에서 당신은 아마 당신이 찾고있는 것을 가지고 있습니다. 기본적으로 사용자가 ssh를 통해 로그인 할 때 실행되는 스크립트에서 mail 명령 에 대한 호출을 추가 할 수 있습니다 . /etc/pam.d/sshd


2

이 스레드에서 훌륭한 답변을 얻었고 복사하거나 붙여 넣을 수있는 무언가를 만들었습니다. Mailgun을 사용하여 이메일을 보내므로 STMP 설정과 관련된 문제를 피할 수 있습니다. Mailgun API 키와 전송 도메인 만 있으면됩니다.

SSH 로그인시 스크립트는 로그인 세부 정보 (사용자, 호스트 이름, IP 주소 및 모든 현재 환경 변수)를 전자 메일 주소로 보냅니다. 변수를 사용자 정의하여 보내려는 다른 매개 변수를 쉽게 추가 할 수 있습니다 message.

#!/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

이것은 내 의견으로는 가장 좋은 대답입니다. 간단하고 컴퓨터에서 전자 메일을 보낼 필요가 없습니다. 제대로 구성하지 않으면 스팸 폴더에있게됩니다.
JayD3e

2

@ 프리츠 답변의 메일 건 적응

게시 후 @pacharanero도 mailgun에 대해 글을 썼지 만 발굴 작업을 이해하지 못하므로 솔루션을 게시 할 것입니다.

SMTP가없는 VM에있는 경우 mailgun, sendgrid 등과 같은 것을 사용해야합니다. 이것은 Google Cloud에서 저에게 효과적이었습니다.

이 접근 방식의 한 가지 위험은 공격자가 sudo su스크립트를 찾을 수있는 경우 발신 전자 메일 전송 자격 증명을 얻거나 전자 메일 전송을 위해 스크립트를 읽을 수있게하는 것입니다. mailgun에는 설정해야하는 ip 허용 목록이 있지만이 특정 사용 사례에는 불완전합니다.

이 스크립트는 mydomain.com실제 도메인으로 변경 한 후에 mailgun과 함께 작동 합니다. 스크립트를 저장 /root/login-alert.sh하거나 더 모호한 위치 에 저장할 수 있습니다.

#!/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

그런 다음 @Fritz 답변에 따라 다음 /etc/pam.d/sshd을 포함 하도록 변경할 수 있습니다.

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

도착하는 사용자 ( chmod 700 /root/login-alert.sh) 에게는 읽기 권한이 없으므로 도착하는 사용자는 스크립트에 대한 읽기 권한이 필요하지 않습니다.


1

이 스크립트 /etc/ssh/sshrc는 이메일 을 보내고 시스템 로거에 로그를 추가합니다. 개인 서브넷과 월드 와이드 웹 사이에 차이가 생겨 (원하는 경우 비활성화 할 수 있음) (필요 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

swatch 패키지의 swatchdog 을 사용하여 /var/log/auth.log에 " fail "(대소 문자 구분) 문구가 포함 된 행을 모니터링하고 있습니다. 간단한 시스템 서비스로 실행하도록 설정했습니다.

apt install swatch

소유자 루트 권한 644 로 구성 파일 /etc/swatch/swatch-auth-log.conf 를 만듭니다.

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

"/ 전 / 불합격" 은 "I"는 대소 문자를 구분하여 표시하는 정규 표현식이다. 내 sendmailmailgun을 통해 모든 것을 고정 주소로 보내는 스크립트 이므로 주소는 실제로 중요하지 않습니다.

크리에이트 systemd 서비스 파일 /etc/systemd/system/swatch-auth-log.service을 소유자 루트로 허가 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

그런 다음 서비스 상태를 활성화, 시작 및 확인하십시오.

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

성공적인 상태 보고서의 예-

 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

부팅시 서비스가 자동으로 시작되고 systemd가 모니터링합니다 .


토론

원래 위와 비슷한 pam 솔루션을 사용 했지만 /etc/pam.d/common-auth 에서는 sshd가 아닙니다 . 그것은 ssh, sudo 및 login을 잡는 것이 었습니다. 그러나 업데이트 후 복구 모드에서 비밀번호를 변경 한 후에도 모든 비밀번호가 작동을 멈췄습니다. 결국 나는 /etc/pam.d/common-auth 를 원래의 것으로 바꾸었고 암호는 다시 작동했다. 다음은 Stack Exchange UNIX 및 Linux 보드 에 대한 설명입니다.

보안 설정을 이해하기 어려워지지 않는 것이 더 안전하다고 결정했습니다. 그리고 어쨌든 모든 것이 로그 파일에 있습니다.


0

실제로 @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>" &

이것은 내가 설정 한 14.04, 16.04 및 Centos 6.5.x 서버에서 작동합니다 .mta가 구성되어 있는지 확인해야하지만 일단 완료되면 매력적입니다. 다음 단계 twilio 알림

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.