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

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

Я использую Ubuntu 12.04 под управлением xfce

12 ответов

Решение

Предупреждение: согласно комментариям, это не работает, если пользователь создает файл с именем ~/.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, и имя входа будет зарегистрировано в системном журнале.

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

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

Предупреждение: Как всегда, когда вы меняете конфигурацию входа в систему, оставьте сеанс резервного копирования 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/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 вернет true, только если пользователь вошел в систему через ssh, что, в свою очередь, приведет к запуску блока с отступом кода.

Далее мы затем строим текст сообщения:

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

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

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

Мы использовали monit для мониторинга процессов на наших Linux-блоках. Монит может также оповещать по электронной почте об успешных входах через 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 файл

Обновление: написал более подробную запись в блоге по этому

Мэйлган адаптация ответа @Fritz

После публикации я заметил, что @pacharanero также пишет о mailgun, но я не понимаю, что они делают с dig, поэтому я также опубликую свое решение.

Если вы используете виртуальную машину без SMTP, вам может понадобиться что-то вроде mailgun, sendgrid или тому подобное. Это сработало для меня в Google Cloud.

Одним из рисков такого подхода является то, что злоумышленник может получить учетные данные для отправки исходящей электронной почты, если он может sudo su и найдите скрипт или оставьте скрипт для отправки письма читабельным. У mailgun есть белый список ip, который вы должны настроить, но он явно не подходит для этого конкретного случая использования.

Этот скрипт должен работать с mailgun после изменения mydomain.com на ваш фактический домен. Вы можете сохранить скрипт в /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) поэтому прибывающим пользователям не нужно иметь доступ для чтения к сценарию.

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

Я использую swatchdog из пакета swatch для отслеживания любых строк, содержащих фразу " fail " (без учета регистра) в /var/log/auth.log. Я настроил его, чтобы запустить как простой сервис systemd.

apt install swatch

Создайте файл конфигурации /etc/swatch/swatch-auth-log.conf с владельцем root, разрешение 644 -

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

"/ Fail/i" является регулярным выражением, где "i" указывает, что регистр не учитывается. (Мой sendmail - это скрипт, отправляющий все на фиксированный адрес с помощью mailgun, поэтому адрес на самом деле не имеет значения).

Создайте файл службы systemd /etc/systemd/system/swatch-auth-log.service с владельцем root, разрешение 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 и логины. Но потом после обновления все мои пароли перестали работать, даже после смены паролей в режиме восстановления. В конце концов я изменил /etc/pam.d/common-auth обратно на оригинал, и пароли снова заработали. Вот описание на плате Stack Exchange для UNIX и Linux

Я решил, что безопаснее не трогать трудно понять настройки безопасности. И все равно в лог-файлах.

Я взял несколько отличных ответов из этой ветки и сделал что-то более-менее копируемое и вставляемое. Он использует 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

Я на самом деле только что изменил ответ @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 alert

Этот скрипт в /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- Найдите папку пользователя (для меня root):

echo  ~root

2- создать или отредактировать файл ".bashrc" в корневой папке:

nano root/.bashrc

(замените "root" на вашу пользовательскую папку)

3- добавьте эти строки:

# ssh mail notification
echo 'NOTIFICATION - Acces SSH en ROOT sur `hostname` le:' `date` `who` | mail -s "NOTIFICATION - Connexion en ROOT via SSH depuis: `who | cut -d"(" -f2 | cut -d")" -f1`" myemail@domain.com

Просто замените myemail@domain.com своим адресом электронной почты.

Повторите это с другими пользователями, если у вас их больше одного.

Источник: http://blogmotion.fr/systeme/notification-connexion-ssh-4246

Я попробовал это, но у меня возникли проблемы с тем, чтобы mailx взаимодействовал с моей учетной записью gmail. Я нашел альтернативу электронной почте. Если у вас есть телефон Android, вы можете установить «MQTT push Client». Настройте брокера MQTT с помощью mosquitto и опубликуйте его в сценарии login-notify.sh. Подпишитесь на тему брокера + с «клиентом MQTT push», и все готово. Вы будете получать push-уведомления на свой телефон, электронная почта не требуется.

Другие вопросы по тегам