VSFTP在CentOS上的安全策略
小樊
41
2025-11-29 16:06:02
VSFTP在CentOS上的安全策略
一 基础加固与访问控制
- 禁用匿名访问,仅启用本地或虚拟用户;将本地用户chroot到其主目录,且避免对chroot目录授予可写权限(不使用或关闭allow_writeable_chroot),降低提权与符号链接攻击风险。
- 启用传输日志(如xferlog_enable=YES),便于审计与异常追踪。
- 使用用户黑名单文件**/etc/vsftpd/ftpusers**(该文件始终生效,优先级最高),禁止root等高权限账户登录。
- 通过**/etc/vsftpd/user_list与参数userlist_enable**、userlist_deny实现白名单或黑名单控制:
- 黑名单模式:userlist_enable=YES,userlist_deny=YES(默认拒绝列表内用户);
- 白名单模式:userlist_enable=YES,userlist_deny=NO(仅允许列表内用户)。
- 主机访问控制优先使用firewalld富规则限制来源网段/IP,替代已不推荐或不生效的 tcp_wrappers(CentOS 8 起不再支持 hosts.allow/hosts.deny 对 FTP 的控制)。
二 传输加密与端口管理
- 启用TLS/SSL加密:设置ssl_enable=YES,禁用匿名加密(allow_anon_ssl=NO),强制本地登录与数据传输加密(force_local_logins_ssl=YES、force_local_data_ssl=YES),仅启用安全协议(如ssl_tlsv1=YES;ssl_sslv2=NO;ssl_sslv3=NO),并正确配置证书与私钥路径(如rsa_cert_file、rsa_private_key_file)。
- 防火墙放行控制通道与被动模式端口:
- 控制通道:放行21/tcp;
- 被动模式数据端口:在 vsftpd.conf 中设置pasv_min_port / pasv_max_port(例如10060–10090),并在防火墙放行该端口段,避免随机端口带来的暴露与审计困难。
三 用户隔离与最小权限
- 推荐采用虚拟用户方案:
- 使用db_load将明文口令生成**/etc/vsftpd/access.db**;
- 配置 PAM 文件**/etc/pam.d/vsftpd使用pam_userdb.so**进行虚拟用户认证;
- 创建一个不可登录的系统用户(如vsftpd)作为所有虚拟用户的映射账户,家目录作为FTP根(如**/data/vsftpd**),并设其不可写;在根下为上传创建子目录(如**/data/vsftpd/pub**)并赋予适当权限,实现“根不可写、上传目录可写”的最小权限模型。
- 若使用本地用户:启用chroot_local_user=YES并关闭allow_writeable_chroot;如需例外,使用chroot_list_enable/chroot_list_file精确控制少数账户。
四 SELinux与系统安全联动
- 保持SELinux为enforcing,按需开启布尔值:
- 允许本地用户家目录访问:setsebool -P ftp_home_dir on;
- 需要更宽松的FTP访问时可启用:setsebool -P allow_ftpd_full_access on(仅在明确需求与风险评估后使用)。
- 目录与权限:确保FTP根目录不可写(或按虚拟用户模型将可写权限仅赋予上传子目录),避免因chroot可写引入安全风险。
五 快速检查清单与推荐配置片段
- 快速检查清单:
- 已禁用匿名(anonymous_enable=NO);本地/虚拟用户按需启用;
- 已启用chroot且chroot目录不可写;
- ftpusers黑名单已覆盖高危账户(如root);
- user_list与userlist_deny策略符合“白名单优先”原则;
- 已启用TLS/SSL并禁用不安全协议;
- 防火墙已放行21/tcp与被动端口段;
- 已开启xferlog等日志并定期审计;
- SELinux 布尔值与目录权限配置正确。
- 推荐配置片段(示例,按实际环境调整):
- vsftpd.conf(关键项):
- anonymous_enable=NO
- local_enable=YES
- write_enable=YES
- chroot_local_user=YES
- allow_writeable_chroot=NO
- xferlog_enable=YES
- xferlog_file=/var/log/vsftpd.log
- pam_service_name=vsftpd
- guest_enable=YES(虚拟用户时)
- guest_username=vsftpd(虚拟用户时)
- virtual_use_local_privs=YES(虚拟用户时)
- ssl_enable=YES
- allow_anon_ssl=NO
- force_local_logins_ssl=YES
- force_local_data_ssl=YES
- ssl_tlsv1=YES;ssl_sslv2=NO;ssl_sslv3=NO
- rsa_cert_file=/etc/pki/tls/certs/your_cert.crt
- rsa_private_key_file=/etc/pki/tls/private/your_key.key
- pasv_min_port=10060;pasv_max_port=10090
- 防火墙:
- firewall-cmd --permanent --add-port=21/tcp
- firewall-cmd --permanent --add-port=10060-10090/tcp
- firewall-cmd --reload
- 虚拟用户 PAM:/etc/pam.d/vsftpd
- auth required /lib64/security/pam_userdb.so db=/etc/vsftpd/access
- account required /lib64/security/pam_userdb.so db=/etc/vsftpd/access