Ответы:
Предупреждение: согласно комментариям, это не работает, если пользователь создает файл с именем
~/.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-блоках. Монит может также оповещать по электронной почте об успешных входах через 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). Оператор if вернет true, только если пользователь вошел в систему через ssh, что, в свою очередь, приведет к запуску блока с отступом кода.
Далее мы затем строим текст сообщения:
$(date)будет заменен выводом dateкоманды${USER} будет заменено логином пользователя $(hostname -f) будет заменено полным именем хоста системы, в которую вы входите Вторая TEXTстрока добавляет к первой, давая IP-адрес системы, с которой пользователь входит в систему. Наконец, сгенерированный текст отправляется по электронной почте на ваш адрес.
Резюме По умолчанию Linux будет регистрировать каждый системный вход в систему, будь то по ssh или нет, в файлы системного журнала, но иногда - особенно для системы, к которой редко обращаются через ssh - быстрое и грязное уведомление может быть полезным.
Я взял несколько отличных ответов из этой ветки и сделал что-то более-менее копируемое и вставляемое. Он использует 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 также пишет о 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), поэтому прибывающим пользователям не нужно иметь доступ для чтения к сценарию.
Этот скрипт /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 для отслеживания любых строк, содержащих фразу « 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
Я решил, что безопаснее не трогать трудно понять настройки безопасности. И все равно в файлах журналов.
Я на самом деле только что изменил ответ @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
ssh -Nтолько с переадресацией портов.