Linux

用於檢測(並通過電子郵件通知)與伺服器的新 SFTP 連接的 Linux Bash 腳本

  • December 31, 2019

我正在尋找有關 Linux 伺服器 (CentOS) 指南或腳本的幫助,可用於在檢測到新的 SFTP 連接時向伺服器帳戶發送電子郵件。例如,提供連接名稱和請求 IP 地址以及連接身份驗證類型(如果可能)(如 SSH 密鑰或密碼等)。

我幾乎沒有使用 Bash 腳本的經驗,但是我已經成功地做到了這一點,它可以檢測 SSH 連接;但是我找不到去哪裡擴展它以通知SFTP 連接到伺服器的電子郵件地址,

非常感謝您對此的任何幫助。

我確實意識到這是一個非常糟糕的問題,我很抱歉,但是搜尋引擎結果給了我很多錯誤的結果,例如“我如何 SFTP 到我的伺服器?!” 等等明顯不合適的。

乾杯


更新 1

因此/var/logs/secure收集 SFTP 連接資訊。我希望能夠以某種方式獲取該資訊並將其丟棄在基本的電子郵件中。

我目前工作的 SSH 檢測器在以下位置執行此操作.bashrc

echo -e 'ALERT - SSH access detected:' `date` `ls -l \`tty\` | awk '{print $3}'` '\n\nConnection Details: ' `w -h` '\n\nList of WHO: ' `who --login` | mail -s "Alert: Server Access Email Subject" email@address.com

這被稱為,由 CSF (ConfigServerFirewall) 觸發

我想以某種方式將上述兩者結合起來,以便在將資訊行添加到/var/log/secure諸如以下內容時:

Subsystem       sftp    /usr/libexec/openssh/sftp-server -l INFO

然後它也將能夠檢測到行開始:

接受的公鑰……

然後可以將該行以電子郵件的形式發送到電子郵件地址….


更新 2:

我可能需要編寫自己的 Bash shim ….


更新 3:

感謝 Piotr,我的 shim 程式碼現在是:

#!/bin/bash
# Create a temporary log file
LOGFILE=$(/bin/mktemp /tmp/sftplog.XXXXXX)
# Redirect stderr to LOGFILE
exec 2>"$LOGFILE"

# Run the SFTP with logging to stderr
/usr/libexec/openssh/sftp-server -e -u 022 -l VERBOSE

# Use some sendmail substitute to send an e-mail
/usr/sbin/sendmail -i root@localhost <<EOF
From: email@localaddress.co.uk
To: email@localaddress.co.uk
Subject: SFTP connection for user $(LOGNAME)

Hello,
User $(LOGNAME) just connected to the SFTP server from $(SSH_CONNECTION).

Connection log:
$(<"$LOGFILE")
EOF

# echo -e "Hello,\nUser $(LOGNAME) just connected to the SFTP server from $(SSH_CONNECTION).\n\nConnection log:\n$(<"$LOGFILE")" | mail -s "SFTP connection for user $(LOGNAME)" email@localaddress.co.uk

# Delete the log
rm -f "$LOGFILE"

我已經從命令行執行了 sendmail 指令,這可以正常工作,但是新的 SFTP 連接在讀取數據包時會導致 EOF


更新 4

將腳本簡化為:

#!/bin/bash
# Create a temporary log file

# Run the SFTP with logging to stderr
/usr/libexec/openssh/sftp-server -e -u 022 -l INFO
exec >/dev/null

連接時讀取數據包問題時仍返回EOF 。


更新 5:

將文件權限設置為與原始子系統文件 ( /usr/libexec/openssh/sftp-server) 的權限相同可以解決問題並且腳本可以正確執行。

ssh子系統的好處是您可以用另一個實現替換預設實現(如 Martin 所說的 internal-sftp/usr/lib/openssh/sftp-server ),例如.

一個小例子:創建一個/usr/local/bin/sftp-logger包含內容的文件:

#!/bin/bash
# Create a temporary log file
LOGFILE=$(/bin/mktemp /tmp/sftplog.XXXXXX)
# Redirect stderr to LOGFILE
exec 2>$LOGFILE

# Run the SFTP with logging to stderr
/usr/lib/openssh/sftp-server -e -l INFO

# In case of chatty sendmail
exec >/dev/null

# Use some sendmail substitute to send an e-mail
/usr/sbin/sendmail -i root@localhost <<EOF
From: sshd@localhost
To: root@localhost
Subject: SFTP connection for user $LOGNAME

Hello,
User $LOGNAME just connected to the SFTP server from $SSH_CONNECTION.

Connection log:
$(<$LOGFILE)
EOF

# Delete the log
rm -f $LOGFILE

然後你只需要用你的腳本替換預設的 SFTP 伺服器/etc/ssh/sshd_config

Subsystem sftp /usr/local/bin/sftp-logger

引用自:https://serverfault.com/questions/997129