如何在不重新加载服务的情况下暂时禁用 sftp?

如何在不重新加载服务的情况下暂时禁用 sftp?

我设置了一个 chroot 用户,该用户只能通过 sshd 的 sftp 访问 1 个目录,以便我的一位同事可以上传某些类型的文件。然后,我将想办法通过 HTTP 触发命令,该命令将对文件运行一个长时间的进程,并且我需要在进程运行时禁用 sftp。

是否有命令可用于禁用 sftp,而无需更改 sshd_config 文件并重新加载服务?我原本想进行端口阻止,但我仍然需要访问 ssh。

我读过有关禁用用户帐户的信息passwd -l,但如果已经通过 sftp 登录,它仍然允许修改。

有什么建议么?

编辑:

经过进一步尝试后,我发现我可以向 PIDps -axl | grep $user@notty发送一个来断开用户与当前会话的连接,然后要么阻止用户再次登录,要么按照 Martin 的建议删除指向 sftp-server 二进制文件的符号链接。kill -9passwd -l username

但最后我听从了 Mike 的建议,将文件移到其他地方,而不是在 chroot 目录中运行该进程。

答案1

您可以暂时删除该文件夹的写入权限。


如果您想完全禁用 SFTP,您可以创建一个指向sftp-server二进制文件的符号链接。并将用户配置为使用该符号链接作为 SFTP 二进制文件。然后您可以暂时删除该符号链接,这将有效禁用 SFTP。

Match User theuser
    ForceCommand /path/to/sftp/symlink

请注意,删除符号链接不会终止现有的 SFTP 会话。您必须终止所有用户拥有的进程sftp-server

答案2

请注意,在系统范围内禁用 sftp 可能并不理想,因为 sftp 随后将完全无法用于所有其他可能的任务(无论是使用当前设计还是未来设计)。更好的设计(保留长期灵活性)可能是控制某些数据的“写入”权限(如第一个解决方案所述Martin Prikryl 的更好的多解决方案答案)。

我选择不重复(或尝试完成)Martin Prikryl 的更好的多解决方案答案,它不涉及更改 sshd_config 文件或重新加载服务。

但是,为了教育/熟悉起见,我将分享另一种选择。

而无需更改 sshd_config 文件并重新加载服务?

您可以更改 sshd_config 文件,但不能重新加载服务。(因此,按照要求,您不会同时执行这两项操作。)

然后向父 sshd 服务发送 SIGHUP。(确保它是父进程:向另一个 sshd 服务发送 SIGHUP 可能会终止连接。)识别哪个进程是父进程的简单方法可能是使用 PID 文件。

例如,如果 sshd 正在创建这个 pid 文件:
sudo kill -HUP $( sudo cat /var/run/sshd.pid )

(PID 文件的默认名称/位置在不同的操作系统之间可能有所不同。)

向父进程发送 SIGHUP 信号将导致 sshd 重新加载配置文件(因为 sshd 就是这样设计的)。请注意,这可能不会停止任何当前正在运行的 sftp 会话(修改磁盘上的二进制文件也可能不会这样做),因此请确保在转到敏感的不能运行 sftp 的进程之前处理好这个问题。

答案3

您可以重新配置防火墙服务以阻止正在使用的 sftp 端口。

相关内容