ftp虚拟用户需映射为真实系统用户(如ftpacl),结合文件系统acl与vsftpd权限配置(write_enable=yes、allow_writeable_chroot=yes等)协同实现文件级精细控制,缺一不可。

FTP服务器虚拟用户本身不直接参与Linux内核级权限判定,访问文件时仍由系统以映射后的UID/GID执行权限检查。要实现“精细到文件级”的控制,必须让虚拟用户在系统层面拥有明确身份,并与底层ACL协同生效——不是FTP配置单独起作用,而是虚拟用户映射 + 文件系统ACL + vsftpd权限开关三者配合。
虚拟用户必须映射为真实系统身份
vsftpd的虚拟用户默认无对应UID,ACL规则(如 u:ftpuser:rwx)对其无效。需通过PAM模块将其绑定到一个实际存在的系统用户或组:
- 在
/etc/pam.d/vsftpd中配置pam_userdb.so或pam_pwdfile.so,并确保auth [default=1] pam_succeed_if.so user ingroup ftpacl之类规则存在 - 创建专用系统用户(如
sudo adduser --disabled-password --gecos "" ftpacl),不设登录shell,仅作ACL授权载体 - 所有虚拟用户统一映射到该系统用户(通过
guest_username=ftpacl在vsftpd.conf中指定),这样他们的操作就等效于ftpacl用户行为
ACL规则必须施加在目标目录/文件上,且覆盖该映射用户
假设虚拟用户统一映射为系统用户ftpacl,则ACL需显式授权给它:
- 对FTP根目录(如
/var/ftp/shared)设置:sudo setfacl -m u:ftpacl:rwx /var/ftp/shared - 若需新上传文件自动可写,加默认ACL:
sudo setfacl -d -m u:ftpacl:rwx /var/ftp/shared - 若不同虚拟用户需差异化权限(如
designer可写、viewer只读),需为每个虚拟用户创建独立系统用户,并分别设ACL:setfacl -m u:designer:rwX,u:viewer:r-X /var/ftp/shared
vsftpd配置必须允许底层权限生效
即使ACL已设好,vsftpd若自行限制,系统权限也无从发挥:
- 禁用
force_local_logins_ssl=YES等强制拦截项,避免SSL握手失败导致降权 - 确认
write_enable=YES、file_open_mode=0644、local_umask=002等参数合理,使新建文件权限不被过度收紧 - 若启用
chroot_local_user=YES,确保allow_writeable_chroot=YES(或改用chroot_list_enable精确控制),否则chroot目录不可写将直接阻断ACL效果
验证是否真正生效
不要只看FTP客户端能否上传——要验证文件级权限是否按ACL预期落地:
- 用FTP上传一个新文件后,在服务器上执行:
getfacl /var/ftp/shared/uploaded.txt,确认输出中含user:ftpacl:rwx或对应用户名条目 - 切换到
ftpacl用户(sudo -u ftpacl touch test),测试能否在相同路径下创建、修改、删除——结果应与FTP中一致 - 检查mask值:
getfacl输出中的mask::rwx必须至少包含你赋予的权限位,否则ACL条目被裁剪











