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

56

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

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

Рик Т
источник

Ответы:

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, и логин будет зарегистрирован в системном журнале.

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

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

SirCharlo
источник
Это также работает, если клиент не запрашивает TTY? Например, ssh -Nтолько с переадресацией портов.
gertvdijk
это также работает, когда мы используем Gmail в качестве SMTP-сервера?
user155073
Для этого нужно предупреждение : это не работает, если пользователь создает файл с именем, ~/.ssh/rcпоэтому он совершенно бесполезен в качестве меры безопасности. Ответ @adosaiguas относительно pam_execправильный.
Фриц,
2
@mchid: Если вы подумаете о вопросе «Я хочу получать уведомления, если кто-нибудь войдет в мой личный ящик» , тогда это может быть приемлемым. Если у вас есть только одна учетная запись пользователя. В противном случае вы должны сделать это для всех учетных записей, включая каждую вновь добавленную учетную запись. И в идеале вы должны убедиться, что пользователи не могут изменять или удалять свои ~/.ssh/rcфайлы. Использование общесистемного метода на основе pamпросто более надежно и безопасно, потому что только rootможет связываться с ним. Ответ таков: sshrdметоды работают нормально для однопользовательских систем, но pamметод надежно работает для всех систем.
Фриц
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, так что вы можете войти в систему, если выполнение не удалось. После того, как вы убедились, что это работает, вы можете изменить optionalна required. Тогда вход в систему будет невозможен до тех пор, пока не будет успешно выполнено ваше скрипт-ловушка (если вы этого хотите).

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

ломаться
источник
1
/etc/ssh/login-notify.sh failed: exit code 13
Там
3
Спасибо, это прекрасно работает. Просто убедитесь, что вы UsePAMустановили yesв свой sshd_config.
Николас БАДИА
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 <- для tty-логинов
Фернандо Андре,
2
@ 4wk_ Спасибо за подсказку. Я заменил его ссылкой на интернет-архив, поэтому теперь он должен работать снова.
Фриц
9

Мы использовали 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файле.

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

лакмус
источник
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 вернет true, только если пользователь вошел в систему через ssh, что, в свою очередь, приведет к запуску блока с отступом кода.

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

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

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

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

user476225
источник
2

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

adosaiguas
источник
2

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

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

Павел
источник
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

Я использую 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

«/ Сбой / я» является регулярным выражением, с «я» , указывающим , что не чувствителен к регистру. (Мой 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

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

Крейг Хикс
источник
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 alert

MrMesees
источник