温馨提示×

如何禁止linux sftp删除

小樊
34
2026-10-25 13:23:40
栏目: 智能运维

在 Linux 中,SFTP 本身依赖于 SSH 子系统,默认情况下用户拥有与系统权限一致的读写删除能力。要“禁止 SFTP 删除文件”,常见且可控的方案如下(从推荐到补充):


一、推荐方案:使用 rssh / scponly 类受限 Shell(简单但老)

适合只允许上传下载、完全禁止删除、重命名等

  • scponly:只能 scp/sftp 读和写,不能执行命令
  • 但仍可“覆盖/删除”取决于权限

⚠️ 这两种工具目前已较少维护,不推荐新系统使用。


二、推荐方案:使用 OpenSSH + 自定义 SFTP 包装脚本(最灵活 ✅)

原理

用 Subsystem sftp internal-sftp 改为调用自定义脚本,在脚本中过滤掉 remove / rmdir 等命令。

步骤示例

1. 创建 SFTP 包装脚本

vi /usr/local/bin/sftp-no-delete.sh

内容:

#!/bin/bash
exec /usr/lib/openssh/sftp-server -e 2> >(grep -v -E 'remove|rmdir' >&2)

或更严格(禁止删除):

#!/bin/bash
while read cmd; do
  case "$cmd" in
    remove*|rmdir*) 
      echo "Permission denied"
      ;;
    *)
      echo "$cmd"
      ;;
  esac
done | /usr/lib/openssh/sftp-server -e

实际更可靠的是用 sftp-server 的 -p 参数限制协议命令(见下)

2. 修改 sshd_config

Subsystem sftp /usr/local/bin/sftp-no-delete.sh

或只针对某用户:

Match User sftpuser
    ForceCommand /usr/local/bin/sftp-no-delete.sh

三、✅ 最佳方案:使用 sftp-server -p 限制协议命令(官方支持)

OpenSSH 的 sftp-server 支持 协议级命令白名单/黑名单

查看支持命令

sftp-server -Q requests

输出类似:

open
close
read
write
lstat
fstat
stat
mkdir
rmdir
remove
rename
...

禁止删除(remove / rmdir)

Subsystem sftp internal-sftp -p open,close,read,write,stat,lstat,mkdir

或针对用户:

Match User sftpuser
    ForceCommand internal-sftp -p open,close,read,write,stat,lstat,mkdir

✅ 这样:

  • 可上传
  • 可下载
  • 不可删除
  • 不可重命名(如不需要可去掉 rename)

四、文件系统级方案(兜底)

即使 SFTP 不允许,也要防止:

chattr +a /sftp/upload
  • +a:只能追加,不能删除或修改
  • 适合日志/上传目录
chattr +i file
  • 禁止任何修改/删除(root 也不行,除非解除)

五、配合 chroot(安全必做)

Match User sftpuser
    ChrootDirectory /sftp
    ForceCommand internal-sftp -p open,close,read,write,stat,mkdir

总结建议 ✅

需求 推荐方式
禁止删除 internal-sftp -p
禁止删除+重命名 同上,去掉 rename
高安全 chroot + 权限 + chattr
审计 日志 + 只读挂载

如果你愿意,我可以:

  • 给你一套 完整 sshd_config 示例
  • 或针对 CentOS / Ubuntu / 容器 给具体命令

0 踩