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