Відповіді:
Попередження: згідно з коментарями, це не працює, якщо користувач створить файл з назвою
~/.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/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у свою sshd_config.
unconfined_u:object_r:bin_t:s0. Тоді я chmod +x /bin/login-notify.shі це працює.
Ми використовували 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файлі
Оновлення: Написав більш детальну публікацію в цьому блозі
Помістіть наступне /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 - може бути корисним швидке та брудне повідомлення.
Я взяв кілька чудових відповідей з цієї теми і зробив щось, що є більш-менш копіювальним і вставним. Він використовує 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
Після публікації я помітив, що @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), тому що прибуваючим користувачам не потрібно мати доступ для читання до сценарію.
Цей сценарій /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
Я використовую 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
Я вирішив, що було б безпечніше не чіпати важкі для розуміння налаштування безпеки. І все одно в файлах журналів.
Я насправді просто змінив відповідь @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лише переадресація порту.