답변:
경고 : 의견에 따르면 사용자가
~/.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 옵션에서는 작동하지 않습니다.
~/.ssh/rc
보안 수단으로 쓸모가 없습니다. @adosaiguas의 대답 pam_exec
은 정답 입니다.
~/.ssh/rc
파일을 수정하거나 삭제할 수 없도록해야 합니다. 시스템 전체를 기반으로 한 방법을 사용하는 pam
것은 더 root
혼란스럽고 안전 합니다. 그 대답은 다음과 같습니다.이 sshrd
방법은 단일 사용자 시스템에서는 pam
작동 하지만 모든 시스템에서 안정적으로 작동 합니다.
경고 : 로그인 구성을 변경할 때 항상 백업 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
있으므로 실행에 실패한 경우에도 로그인 할 수 있습니다. 당신이 작동하는지 확인 만든 후에는 변경할 수 있습니다 optional
로 required
. 그러면 후크 스크립트가 성공적으로 실행되지 않으면 로그인 할 수 없습니다 (원하는 경우).
PAM이 무엇이며 어떻게 작동하는지에 대한 설명이 필요한 사람들에게는 여기에 매우 좋은 것이 있습니다.
/etc/ssh/login-notify.sh failed: exit code 13
바로 로그인 :( 후
UsePAM
설정 했는지 확인하십시오 yes
.
unconfined_u:object_r:bin_t:s0
. 그런 다음 나는 chmod +x /bin/login-notify.sh
작동합니다.
우리는 리눅스 박스에서 프로세스를 모니터링하기 위해 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
파일 로 설정해야합니다.
업데이트 : 이것에 대한 자세한 블로그 게시물 을 작성했습니다
다음을 넣습니다 /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를 통해 거의 액세스하지 않는 시스템에 대해서는 빠르고 더러운 알림이 유용 할 수 있습니다.
이 스레드에서 훌륭한 답변을 얻었고 복사하거나 붙여 넣을 수있는 무언가를 만들었습니다. 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
게시 후 @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
) 에게는 읽기 권한이 없으므로 도착하는 사용자는 스크립트에 대한 읽기 권한이 필요하지 않습니다.
이 스크립트 /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
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"는 대소 문자를 구분하여 표시하는 정규 표현식이다. 내 sendmail 은 mailgun을 통해 모든 것을 고정 주소로 보내는 스크립트 이므로 주소는 실제로 중요하지 않습니다.
크리에이트 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 보드 에 대한 설명입니다.
보안 설정을 이해하기 어려워지지 않는 것이 더 안전하다고 결정했습니다. 그리고 어쨌든 모든 것이 로그 파일에 있습니다.
실제로 @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 알림
ssh -N
를 들어 포트 전달 만 가능합니다.