我设置了一个 chroot 用户,该用户只能通过 sshd 的 sftp 访问 1 个目录,以便我的一位同事可以上传某些类型的文件。然后,我将想办法通过 HTTP 触发命令,该命令将对文件运行一个长时间的进程,并且我需要在进程运行时禁用 sftp。
是否有命令可用于禁用 sftp,而无需更改 sshd_config 文件并重新加载服务?我原本想进行端口阻止,但我仍然需要访问 ssh。
我读过有关禁用用户帐户的信息passwd -l
,但如果已经通过 sftp 登录,它仍然允许修改。
有什么建议么?
编辑:
经过进一步尝试后,我发现我可以向 PIDps -axl | grep $user@notty
发送一个来断开用户与当前会话的连接,然后要么阻止用户再次登录,要么按照 Martin 的建议删除指向 sftp-server 二进制文件的符号链接。kill -9
passwd -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 端口。