
核心是用 OpenSSH 的 ChrootDirectory + internal-sftp 组合,把用户“钉死”在指定目录里,既不能跳出、也不能执行 Shell 命令,所有文件操作都可审计。
一、创建专用用户与组(禁用登录权限)
隔离的前提是用户无法获得交互式 Shell:
- 新建一个专属组,比如
sftp-audit:sudo groupadd sftp-audit - 添加用户,指定家目录(即未来 chroot 根)、无效 shell、并加入组:
sudo useradd -m -d /sftp/upload-user1 -s /sbin/nologin -g sftp-audit upload-user1 - 设密码:
sudo passwd upload-user1 - 验证:
getent passwd upload-user1 | grep nologin应有输出
二、准备 Chroot 目录结构(权限必须严格)
OpenSSH 对 chroot 路径有硬性要求:从根目录到该路径的每一级,所有权必须是 root:root,且不能有写权限给组或其他人。否则 SFTP 连接直接失败。
- 创建顶层目录(如
/sftp),并设权:sudo mkdir -p /sftp/upload-user1sudo chown root:root /sftpsudo chmod 755 /sftp - 用户实际可写目录需放在 chroot 内部(如
/sftp/upload-user1/upload):sudo mkdir -p /sftp/upload-user1/uploadsudo chown upload-user1:sftp-audit /sftp/upload-user1/uploadsudo chmod 755 /sftp/upload-user1/upload - 注意:
/sftp/upload-user1本身仍归 root 所有、不可被组/其他写 —— 这是 OpenSSH 强制校验点
三、配置 SSH 服务启用隔离模式
编辑 /etc/ssh/sshd_config,在文件末尾添加:
Subsystem sftp internal-sftp
Match Group sftp-audit
X11Forwarding no
AllowTcpForwarding no
ChrootDirectory /sftp/%u
ForceCommand internal-sftp
PermitTunnel no
-
%u表示用户名,自动映射到/sftp/upload-user1 -
ForceCommand internal-sftp确保用户只能走 SFTP,跳过任何 Shell 或命令执行 - 重启服务生效:
sudo systemctl restart sshd(或service sshd restart)
四、审计与日志强化(关键收口)
SFTP 本身不记录详细操作,需靠 SSH 日志补全:
- 确认
/etc/ssh/sshd_config中已启用:LogLevel VERBOSE(或INFO,VERBOSE可记录具体 SFTP 操作如 open/write/close) - 日志默认在
/var/log/secure(RHEL/CentOS)或/var/log/auth.log(Debian/Ubuntu) - 可加一条 auditd 规则监控上传目录变更:
sudo auditctl -w /sftp/upload-user1/upload -p wa -k sftp_upload - 后续查日志:
sudo ausearch -k sftp_upload | aureport -f -i











