用于检测(并通过电子邮件通知)到服务器的新 SFTP 连接的 Linux Bash 脚本

Mar*_*tin 2 linux bash sftp

我正在寻求有关 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
Run Code Online (Sandbox Code Playgroud)

这被称为,由 CSF (ConfigServerFirewall) 触发

我想以某种方式将上述两者结合起来,以便在将信息行添加到/var/log/secure诸如以下内容时:

Subsystem       sftp    /usr/libexec/openssh/sftp-server -l INFO
Run Code Online (Sandbox Code Playgroud)

然后它也将能够检测到行开始:

接受公钥....

然后可以将这一行发送到电子邮件地址中......


更新 2:

我可能需要编写自己的 Bash 垫片 ....


更新 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"
Run Code Online (Sandbox Code Playgroud)

我已经从命令行运行了 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
Run Code Online (Sandbox Code Playgroud)

连接时读取数据包问题仍然返回EOF


更新 5:

将文件权限设置为与原始子系统文件 ( /usr/libexec/openssh/sftp-server)的权限相同可解决问题并且脚本正确运行。

Pio*_*asz 6

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
Run Code Online (Sandbox Code Playgroud)

然后你只需要用你的脚本替换默认的 SFTP 服务器/etc/ssh/sshd_config

Subsystem sftp /usr/local/bin/sftp-logger
Run Code Online (Sandbox Code Playgroud)

  • 不错的技巧 +1 – 尽管请注意 `sftp-server` 不再是默认值,而是 `internal-sftp`,它不适用于此技巧。请参阅 [OpenSSH:internal-sftp 和 sftp-server 之间的区别](https://serverfault.com/q/660160/168875)。 (2认同)