Ubuntu FTP Server访问控制实践指南
一 基础安全与访问控制总览
- 以 vsftpd 为例,先完成安装与基础加固:禁止匿名、仅允许本地系统用户、开启 chroot 限制目录可见范围,并启用日志以便审计。
- 关键配置示例(/etc/vsftpd.conf):
- 禁用匿名与启用本地用户:anonymous_enable=NO、local_enable=YES
- 写入与目录限制:write_enable=YES、chroot_local_user=YES
- 用户白名单:userlist_enable=YES、userlist_file=/etc/vsftpd.userlist、userlist_deny=NO
- 日志:xferlog_enable=YES、xferlog_std_format=YES
- 典型操作:
- 安装与启停:sudo apt update && sudo apt install vsftpd;sudo systemctl restart vsftpd
- 创建测试用户:sudo adduser ftpuser
- 白名单文件:在 /etc/vsftpd.userlist 中逐行写入允许登录的用户名
- 说明:chroot 将用户限制在其主目录,降低横向移动风险;日志有助于追踪异常访问与传输行为。
二 身份与目录访问限制
- 用户白名单与黑名单
- 白名单模式:userlist_enable=YES、userlist_deny=NO(仅 /etc/vsftpd.userlist 中的用户可登录)
- 黑名单模式:userlist_enable=YES、userlist_deny=YES(出现在列表中的用户被拒绝)
- 目录隔离与写权限
- 全局 chroot:chroot_local_user=YES 将本地用户锁定在其主目录
- 可写 chroot:如需在 chroot 内写入,设置 allow_writeable_chroot=YES(存在一定安全风险,优先采用不可写 chroot + 子目录授权的方式)
- 更安全的做法:保持 chroot 目录不可写,仅对需要的子目录(如 upload)赋予写权限,减少被上传可执行文件的风险
- 示例(白名单 + 不可写 chroot):
- 配置:chroot_local_user=YES、不设置 allow_writeable_chroot、按需为子目录授权
- 权限:sudo chown ftpuser:ftpuser /home/ftpuser,sudo chmod 755 /home/ftpuser;如需上传:sudo chmod u+w /home/ftpuser/upload
- 说明:通过白名单精确控制可登录账户,结合 chroot 与最小权限原则,实现“谁能登录、能到哪、能写什么”的细粒度控制。
三 网络层访问控制
- 防火墙端口放行
- FTP 主动模式:放行 20/tcp(数据)与 21/tcp(控制)
- 被动模式:在 vsftpd 中设置端口范围(如 pasv_min_port=1024、pasv_max_port=1048),并放行对应范围
- UFW 示例:sudo ufw allow 20/tcp、sudo ufw allow 21/tcp、sudo ufw allow 1024:1048/tcp
- 基于 IP 的访问控制
- TCP Wrappers:启用 tcp_wrappers=YES,在 /etc/hosts.allow 中允许指定网段/主机(如:vsftpd: 192.168.1.0/24),在 /etc/hosts.deny 中拒绝其他(如:vsftpd: ALL)
- iptables 白名单:对控制端口与被动端口范围仅允许可信来源(示例:仅放行 192.168.1.10 访问 21/tcp 与 1024:1048/tcp)
- 说明:防火墙负责“端口可达性”,TCP Wrappers/iptables 负责“来源合法性”,两者配合可有效缩小攻击面。
四 加密传输与日志审计
- 启用 SSL/TLS(FTPS)
- 生成或获取证书(自签或 Let’s Encrypt),在 vsftpd 中启用:ssl_enable=YES、force_local_data_ssl=YES、force_local_logins_ssl=YES
- 证书路径示例:rsa_cert_file=/etc/letsencrypt/live/yourdomain.com/fullchain.pem、rsa_private_key_file=/etc/letsencrypt/live/yourdomain.com/privkey.pem
- 端口:控制通道 21/tcp,FTPS 常用 990/tcp;被动端口范围需与防火墙一致
- 日志与监控
- 传输日志:xferlog_enable=YES、xferlog_std_format=YES,定期审计 /var/log/vsftpd.log 或 xferlog,关注异常 IP、频繁失败登录与异常传输量
- 说明:加密可防止凭据与数据被窃听,日志是发现暴力破解与数据外泄的关键手段。
五 快速配置示例与验证
- 目标:仅允许白名单用户、仅允许内网网段、启用 FTPS、被动端口固定范围
- 步骤
- 安装与基础配置
- sudo apt update && sudo apt install vsftpd
- 编辑 /etc/vsftpd.conf:
- 身份与目录:anonymous_enable=NO、local_enable=YES、write_enable=YES、chroot_local_user=YES
- 白名单:userlist_enable=YES、userlist_file=/etc/vsftpd.userlist、userlist_deny=NO
- 被动端口:pasv_min_port=1024、pasv_max_port=1048
- 日志:xferlog_enable=YES、xferlog_std_format=YES
- 用户与权限
- 创建用户:sudo adduser ftpuser
- 白名单:在 /etc/vsftpd.userlist 写入 ftpuser
- 目录权限:sudo chown -R ftpuser:ftpuser /home/ftpuser,sudo chmod 755 /home/ftpuser
- 防火墙与 IP 白名单
- UFW:sudo ufw allow 20/tcp、sudo ufw allow 21/tcp、sudo ufw allow 1024:1048/tcp
- TCP Wrappers:/etc/hosts.allow 加入 vsftpd: 192.168.1.0/24;/etc/hosts.deny 加入 vsftpd: ALL
- 启用 FTPS(可选)
- 配置证书路径与 ssl_enable=YES、force_local_data_ssl=YES、force_local_logins_ssl=YES
- 生效与验证
- sudo systemctl restart vsftpd
- 使用 FileZilla/命令行从白名单主机连接,验证登录、目录限制、上传/下载与被动端口连通性
- 说明:以上示例将“身份—目录—网络—加密—日志”串联为完整闭环,便于直接落地与验证。