Yanıtlar:
Uyarı: yorumlara göre, kullanıcı adlı bir dosya oluşturursa bu çalışmaz
~/.ssh/rc
. *
/etc/ssh/sshrc
Aşağıdaki içerikleri kullanarak değiştirin veya oluşturun :
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 &
Bu, herhangi biri SSH aracılığıyla oturum açtığında sizi e-posta ile etkili bir şekilde bilgilendirecek ve giriş syslog'da oturum açacaktır.
Not: E-posta bildiriminin çalışması için sendemail
pakete ( sudo apt-get install sendemail
) ihtiyacınız olacaktır.
Not: port yönlendirme ile çalışır, fakat -N seçeneği ile değildir.
~/.ssh/rc
nedenle güvenlik önlemi olarak kullanışsızdır. @adosaigua'nın cevabı pam_exec
doğru mu?
~/.ssh/rc
. Tabanlı sistem çapında bir yöntem kullanmak pam
sadece daha güvenilir ve daha güvenlidir, çünkü yalnızca root
bununla uğraşabilir. Yani cevap: sshrd
Metodlar tek kullanıcılı sistemler için uygun, fakat pam
metot tüm sistemler için güvenilir bir şekilde çalışıyor .
Uyarı: Giriş yapılandırmasını her zaman yaptığınız gibi, arka planda bir yedekleme ssh oturumu açık bırakın ve girişi yeni bir terminalden test edin.
sshrc
Kullanıcı kendi ~/.ssh/rc
dosyasına sahipse , yöntem çalışmadığı için, bunu pam_exec
@adosaiguas'ın önerdiği şekilde nasıl yapacağınızı açıklayacağım . Bunun iyi bir yanı, bunun da ssh
(yerel girişler ve hatta tüm girişler gibi) dışındaki giriş türlerine farklı bir dosyaya bağlanarak kolayca uyarlanabilmesidir /etc/pam.d/
.
Öncelikle komut satırından posta gönderebilmeniz gerekir. Bununla ilgili başka sorular da var. Bir posta sunucusunda kurulumu muhtemelen en kolay olanıdır mailx
(ki zaten zaten yüklenmiştir).
Sonra aşağıdaki içerikle çalıştırılabilir bir komut dosyası dosyasına login-notify.sh
( /etc/ssh/
örneğin, içine koydum ) ihtiyacınız var. E-posta bildiriminin konusunu ve içeriğini değiştirmek için değişkenleri değiştirebilirsiniz. chmod +x login-notify.sh
Çalıştırılabilir hale getirmek için yürütmeyi unutmayın .
#!/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
Bunu yaptıktan sonra, aşağıdaki satırı aşağıdakilere ekleyebilirsiniz /etc/pam.d/sshd
:
session optional pam_exec.so seteuid /path/to/login-notify.sh
Test amacıyla, modül olarak dahil edilmiştir optional
, böylece yürütme başarısız olursa hala giriş yapabilirsiniz. Eğer bunun işe yaradığını hasıl olduktan sonra değiştirebileceğiniz optional
için required
. O zaman kanca kodunuzun çalıştırılması başarılı olmazsa (istediğiniz şey buysa) giriş yapmak mümkün olmaz.
PAM'ın ne olduğunu ve nasıl çalıştığını açıklama ihtiyacı duyanlar için, işte burası çok iyi .
/etc/ssh/login-notify.sh failed: exit code 13
UsePAM
ayarlanmış olduğundan emin olun yes
.
unconfined_u:object_r:bin_t:s0
. Sonra ben chmod +x /bin/login-notify.sh
ve o çalışır.
Linux kutularımızdaki süreçleri izlemek için monit kullanıyoruz . monit , ssh üzerinden başarılı girişlerde bulunan e-postalarla da alarm verebilir. Bizim monit config bu gibi görünüyor
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
Not: Posta sunucusu yapılandırması, e-posta formatı vb. monitrc
Dosyada ayarlanmalıdır.
Güncelleme: Bu konuda daha ayrıntılı bir blog yazısı yazdı
Aşağıdakileri yazın /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
Her oturum açışında yürütülür (bash shell kullanıcıları için). İf ifadesi yalnızca kullanıcı ssh aracılığıyla giriş yaptıysa, sonuçta girintili kod bloğunun çalışmasına neden olacaksa true değerini döndürür.
Sonra, mesajın metnini oluştururuz:
$(date)
date
komutun çıktısı ile değiştirilecektir${USER}
kullanıcının giriş adıyla değiştirilecektir $(hostname -f)
Giriş yapılan sistemin tam ana bilgisayar adıyla değiştirilecektir İkinci TEXT
satır, bu kullanıcının giriş yaptığı sistemin IP adresini vererek birinciye eklenir. Son olarak, oluşturulan metin adresinize bir e-posta ile gönderilir.
Özet Linux, varsayılan olarak, sistem günlüğü dosyalarında ssh ile olsun olmasın, her sistem girişini kaydedecektir, ancak bazen - özellikle ssh ile nadiren erişilen bir sistem için - hızlı ve kirli bir bildirim yararlı olabilir.
Bu diğer soruda muhtemelen aradığın şeye sahipsin. Temel olarak , bir kullanıcı ssh: /etc/pam.d/sshd ile oturum açtığında çalıştırılan komut dosyasındaki mail komutuna çağrı ekleyebilirsiniz.
Bu konudaki mükemmel cevapların bir kısmını aldım ve kopyalanabilir ve yapıştırılabilir bir şey yaptım. Mailgun, e-postaları göndermek için kullanır, böylece STMP kurulumuyla ilgili tüm sorunlarınızdan kurtulursunuz. Bir Mailgun API anahtarına ve gönderen bir etki alanına ihtiyacınız var.
SSH girişinin ardından, komut dosyası giriş bilgilerini (kullanıcı, ana bilgisayar adı, IP adresi ve tüm geçerli ortam değişkenleri) bir e-posta adresine gönderir. message
Değişkeni özelleştirerek göndermek istediğiniz diğer parametreleri eklemek kolaydır .
#!/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 yazdıktan sonra, mailgun hakkında da yazılar yazdığını fark ettim, ancak kazı ile ne yaptıklarını anlamıyorum, ben de çözümümü göndereceğim.
SMTP'si olmayan bir VM'deyseniz, mailgun, sendgrid veya benzeri bir şey kullanmanız gerekebilir. Bu benim için Google Cloud’da çalıştı.
Bu yaklaşımın bir riski, bir saldırganın sudo su
komut dosyasını bulabilmesi ve bulması veya okunabilir e-posta göndermek için komut dosyasından çıkması durumunda giden e-posta gönderme kimlik bilgilerinizi alabilmesidir . mailgun kurmanız gereken bir ip beyaz listesi var, ancak bu özel kullanım durumu için açık bir şekilde kusurlu.
Bu komut dosyası mydomain.com
, asıl etki alanınızı değiştirdikten sonra mailgun ile çalışmalıdır . Senaryoyu /root/login-alert.sh
ya da daha karanlık bir yere kaydedebilirsiniz .
#!/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
Bundan sonra /etc/pam.d/sshd
eklemek için değiştirmek için @Fritz cevabını takip edebilirsiniz :
session optional pam_exec.so seteuid /root/login-alert.sh
Bunun, gelen kullanıcılar ( chmod 700 /root/login-alert.sh
) için okuma izni olmadan çalıştığını ve bu nedenle gelen kullanıcıların komut dosyasına okuma erişiminin olması gerekmediğini unutmayın.
Bu komut dosyası /etc/ssh/sshrc
bir e-posta gönderir ve sistem günlüğüne bir günlük ekler. Kişisel alt ağınız ve dünya çapındaki ağ (ihtiyaç duyduğunuz sudo apt-get install mailutils
) arasında bir fark yaratılır (böylece isterseniz devre dışı bırakabilirsiniz ).
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
Ben kullanıyorum swatchdog gelen renk örneği ifadeyi "içeren herhangi hatları için izlemek için pakette başarısız içinde" (harf duyarsız) /var/log/auth.log . Basit bir systemd servisi olarak çalıştırmak için ayarladım.
apt install swatch
Bir yapılandırma dosyası /etc/swatch/swatch-auth-log.conf sahibi root ile izin 644 oluşturun -
watchfor /fail/i
pipe /usr/local/sbin/sendmail -t auth.log@xxx.com
"/ İ / başarısız" , "i" bu duyarsız olduğu belirtilerek, bir düzenli ifade olduğunu. ( Sendmail , her şeyi mailgun aracılığıyla sabit bir adrese gönderen bir betiktir , bu nedenle adres gerçekten önemli değildir).
Bir systemd servis dosyası /etc/systemd/system/swatch-auth-log.service sahibi root, izin 644 ile oluşturun -
[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
Ardından hizmetin durumunu etkinleştirin, başlatın ve görüntüleyin -
sudo systemctl enable swatch-auth-log.service
sudo systemctl start swatch-auth-log.service
sudo systemctl status swatch-auth-log.service
Başarılı bir durum raporu örneği -
● 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
Servis açılışta otomatik olarak başlatılacak ve systemd tarafından izlenecektir .
Tartışma
Başlangıçta yukarıdakilere benzer bir pam çözümü kullandım , ancak /etc/pam.d/common-auth içinde sshd değil . Bu, ssh, sudo ve girişleri yakalamaktı. Ancak bir güncellemeden sonra kurtarma modundaki şifreleri değiştirdikten sonra bile bütün şifrelerim çalışmayı kesti. Sonunda /etc/pam.d/common-auth orjinaline döndüm ve şifreler tekrar çalıştı. İşte Stack Exchange UNIX ve Linux panosunda bir açıklama
Güvenlik ayarlarını anlamakta zorlanmanın daha güvenli olacağına karar verdim. Ve her şey zaten günlük dosyalarında.
Aslında sadece @SirCharlo cevabını değiştirdim
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>" &
Bu işlem 14.04, 16.04 ve Centos 6.5.x sunucularında çalışır, kurulumunu yaptığımdan eminim, mta'nın yapılandırıldığından emin olmanız gerekir, ancak bir kez yapıldığında, bu bir çekicilik sağlar. Bir sonraki adım twilio uyarıları
ssh -N
sadece kapı yönlendirmesiyle.