Как настроить оповещение по электронной почте при успешном входе в систему ssh?

37

Есть ли у кого-нибудь скрипт bash, который будет отправлять или уведомлять кого-то в случае успешного входа на сервер ssh? Я хочу получить уведомление, если кто-нибудь войдет в мою личную папку.

Я использую Ubuntu 12.04 для запуска xfce

    
задан Rick T 24.08.2012 в 16:10
источник

7 ответов

38

Предупреждение: в соответствии с комментариями это не работает, если пользователь создает файл с именем ~/.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 <[email protected]>" -t "Your Name <[email protected]>" -s smtp.server.com &

Это будет эффективно уведомлять вас по электронной почте в любое время, когда кто-то регистрируется через SSH, и логин будет занесен в syslog.

Примечание. Для получения уведомления по электронной почте вам понадобится пакет sendemail ( sudo apt-get install sendemail ).

Примечание. работает с переадресацией портов, но с параметром -N нет.

    
ответ дан SirCharlo 24.08.2012 в 17:16
источник
49
  

Предупреждение: Как всегда, когда вы меняете конфигурацию входа, оставьте резервный сеанс 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="[email protected]"
recepient="[email protected]"

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 . Тогда логин не будет возможен, если выполнение вашего скрипта hook не будет успешным (если это то, что вы хотите).

Для тех из вас, кто нуждается в объяснении того, что такое PAM и как это работает, здесь очень хорошо один .     

ответ дан Fritz 16.04.2014 в 16:39
8

Мы использовали monit для мониторинга процессов в наших linux-блоках. monit может также оповещать по электронной почте об успешном входе в систему через ssh. Наш monit config выглядит следующим образом

 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

Update: Написал более подробный пост в блоге это

    
ответ дан Litmus 02.06.2014 в 13:52
4

Поместите следующее в /etc/profile :

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

Как работает скрипт

/etc/profile выполняется при каждом входе в систему (для пользователей оболочки bash). Оператор if возвращает true только в том случае, если пользователь выполнил вход через ssh, что, в свою очередь, приведет к запуску отступающего кода.

Затем мы создадим текст сообщения:

  • $(date) будет заменено выходом команды date
  • ${USER} будет заменено именем пользователя
  • $(hostname -f) будет заменено полным именем хоста системы, зарегистрированной в

Вторая строка TEXT добавляет к первой, указывая IP-адрес системы, с которой этот пользователь регистрируется. Наконец, сгенерированный текст отправляется по электронной почте на ваш адрес.

Резюме Linux по умолчанию будет записывать каждый системный логин, будь то ssh или нет, в файлы системного журнала, но иногда - особенно для системы, к которой редко можно обращаться через ssh - может быть полезно быстрое и грязное уведомление.     

ответ дан user476225 26.11.2015 в 11:48
1

В этом другом вопросе у вас, вероятно, есть то, что вы ищете. В основном вы можете добавить вызов команды электронной почты в скрипт, который запускается, когда пользователь входит в систему через ssh: /etc/pam.d/sshd

    
ответ дан adosaiguas 24.08.2012 в 17:01
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 <[email protected]>" &

Это работает на серверах 14.04, 16.04 и Centos 6.5.x, которые я настроил, я уверен, что вам нужно обеспечить настройку mta, но как только это будет сделано, это работает. Предупреждения следующего шага twilio

    
ответ дан MrMesees 13.12.2016 в 14:24
0

Я взял некоторые из превосходных ответов из этой темы и сделал что-то более или менее копируемое и пакуемое. Он использует Mailgun для отправки электронных писем, поэтому вы избавляетесь от любых проблем с настройкой STMP. Вам просто нужен ключ API Mailgun и отправляющий домен.

После входа в систему 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 16.11.2017 в 19:12