核心是隔离与最小权限:主目录750归属ftpuser,上传目录775归属ftpuser:ftpusers且禁执行;启用chroot_local_user=YES与allow_writeable_chroot=YES锁定路径;local_umask=002确保上传文件664、目录775;禁用shell登录并加固SELinux与日志审计。

核心是让上传目录可写但不可执行、不可切换出,同时确保用户无法修改他人文件或越权访问。关键不在“锁”,而在“隔离+最小权限”。
上传目录的归属与基础权限
FTP 用户主目录(如 /home/ftpuser)和上传子目录(如 /home/ftpuser/uploads)必须严格分离所有权:
- 主目录归用户自己所有:chown ftpuser:ftpusers /home/ftpuser
- 上传目录归用户+专用组共同所有:chown ftpuser:ftpusers /home/ftpuser/uploads
- 主目录权限设为 750(rwxr-x---),禁止组外访问
- 上传目录权限设为 775(rwxrwxr-x),允许组内协作上传,但禁止执行(防止脚本运行)
强制 chroot 锁定用户根路径
避免用户通过 cd .. 脱离自身目录,必须启用 vsftpd 的 jail 机制:
- 在 /etc/vsftpd/vsftpd.conf 中启用:
chroot_local_user=YES
allow_writeable_chroot=YES(vsftpd 2.3.5+ 必须加此项,否则因目录可写而拒绝登录) - 若只对部分用户生效,改用白名单方式:
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
并在该文件中逐行列出需锁定的用户名
上传后自动限制文件权限
用户上传的文件默认继承 umask,但需确保新文件不带执行位、且组权限合理:
- 设置全局 umask:local_umask=002(上传文件得 664,目录得 775)
- 禁用上传文件的执行权限:添加 file_open_mode=0664,强制覆盖默认 0777
- 如需更细粒度控制(如上传即设为只读),可用 inotify + 脚本监听 uploads 目录,自动 chmod 644 新文件
补充安全加固项
仅靠目录权限不够,还需配合系统级防护:
- 关闭 shell 登录:usermod -s /sbin/nologin ftpuser,防止 FTP 用户 SSH 入侵
- SELinux 启用时,需打标:chcon -t public_content_rw_t /home/ftpuser/uploads,并开启布尔值:setsebool -P ftp_home_dir 1
- 启用日志审计:xferlog_enable=YES,配合 sudo tail -f /var/log/vsftpd.log 实时监控上传行为


















