Як налаштувати сповіщення електронною поштою, коли вхід в 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 немає.


Це також працює, якщо клієнт не вимагає TTY? Наприклад, ssh -Nлише переадресація порту.
gertvdijk

це також працює, коли ми використовуємо gmail в якості сервера smtp?
користувач155073

Для цього потрібне попередження : це не працює, якщо користувач створює файл, який називається, ~/.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відразу після входу в систему :(
FelikZ

3
Спасибі, це чудово працює. Просто переконайтеся, що ви UsePAMналаштували yesу свою sshd_config.
Ніколас БАДІЯ

2
Просто примітка до себе або інших людей, які не знайомі з Selinux. Я отримав помилку дозволу, коли пам_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. 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 shell). Оператор if повернеться істинним лише тоді, коли користувач увійшов через ssh, що, в свою чергу, призведе до запуску блоку з відступним кодом.

Далі ми будуємо текст повідомлення:

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

Другий TEXTрядок додає перший, даючи IP-адресу системи, з якої користувач входить. Нарешті, сформований текст надсилається електронною поштою на вашу адресу.

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


2

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


2

Я взяв кілька чудових відповідей з цієї теми і зробив щось, що є більш-менш копіювальним і вставним. Він використовує Mailgun для надсилання електронних листів, щоб ви не шкодували будь-яких проблем із налаштуванням STMP. Вам просто потрібен API 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

Це найкраща відповідь на мій погляд. Це просто і не вимагає надсилання електронної пошти з машини, яка, безумовно, потрапить у папку зі спамом, якщо не буде налаштовано належним чином.
JayD3e

2

Адаптація поштової зброї відповіді @Fritz

Після публікації я помітив, що @pacharanero також пише про поштову зброю, але я не розумію, що вони роблять з копанням, тому я також розміщу своє рішення.

Якщо ви знаходитесь у вітрині, що не має SMTP, можливо, вам доведеться використовувати щось на зразок поштового рушниці, sendgrid тощо. Це працювало для мене в Google Cloud.

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

Цей сценарій повинен працювати з пістолетом після зміни 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 пакета для відстеження будь-яких рядків , що містять фразу « провал » (чутливо до регістру) в /var/log/auth.log . Я налаштував його для запуску як простого системного сервісу.

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 - це сценарій, який надсилає все на фіксовану адресу через поштову зброю , тому адреса насправді не має значення).

Створення 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 та logins. Але потім після оновлення всі мої паролі перестали працювати, навіть після зміни паролів у режимі порятунку. Врешті-решт я змінив /etc/pam.d/common-auth назад на оригінал та паролі запрацювали знову. Ось опис на платі UNIX та Linux Stack Exchange

Я вирішив, що було б безпечніше не чіпати важкі для розуміння налаштування безпеки. І все одно в файлах журналів.


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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.