vsftpd统一530错误响应配置及结合fail2ban抵御暴力破解与用户名枚举的技术咨询
兄弟,你这个思路太精准了!vsftpd默认的登录失败响应确实会泄露用户是否存在的关键信息,刚好结合fail2ban就能把暴力破解和用户名枚举这两个安全风险一起堵住,我给你一步步捋清楚怎么操作:
先明确你碰到的两种场景,方便咱们对标解决:
场景1(有效用户user1):用户已在
/etc/vsftpd.allowed_users和/etc/passwd中注册(采用UNIX系统认证)$ ftp myftp.example.com Connected to myftp.example.com. 220 Welcome FTP user. Name (myftp.example.com:user1): user1 331 Please specify the password. Password: 530 Login incorrect. ftp: Login failed.场景2(无效用户user2):用户未在
/etc/vsftpd.allowed_users中登记(可能在/etc/passwd中存在或不存在)$ ftp myftp.example.com Connected to myftp.example.com. 220 Welcome FTP user. Name (myftp.example.com:user2): user2 530 Login incorrect. ftp: Login failed.
一、让vsftpd对所有登录失败返回完全一致的530响应
核心就是抹平有效用户和无效用户的认证流程差异,不让攻击者通过响应步骤判断用户是否存在:
修改vsftpd主配置文件(一般路径是
/etc/vsftpd.conf),添加或确保以下参数生效:# 隐藏用户邮箱信息,减少泄露点 hide_email_enable=YES # 登录失败后的超时时间,辅助统一响应节奏 auth_fail_timeout=60 # 保留你原来的白名单配置 userlist_enable=YES userlist_deny=NO userlist_file=/etc/vsftpd.allowed_users # 确保使用PAM认证 pam_service_name=vsftpd修改PAM认证配置(路径
/etc/pam.d/vsftpd),这是统一响应的关键。把原有的认证行替换成以下内容:auth required pam_unix.so nullok_secure try_first_pass auth required pam_deny.so这个配置的作用是:不管用户是否存在,都会先要求输入密码,然后统一返回530错误,彻底堵死用户名枚举的可能。
重启vsftpd服务让配置生效:
systemctl restart vsftpd现在再测试,不管输入有效还是无效用户,都会先弹出
331 Please specify the password.的提示,输入密码后统一返回530 Login incorrect.,完美抹平差异!
二、配置fail2ban拦截暴力破解攻击
接下来给vsftpd加上fail2ban的防护,自动封禁多次登录失败的IP:
先确保fail2ban已经安装(没装的话用对应包管理器安装,比如Debian/Ubuntu用
apt install fail2ban,CentOS/RHEL用yum install fail2ban)。复制默认配置文件做自定义修改(避免系统更新覆盖你的配置):
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local编辑
/etc/fail2ban/jail.local,找到[vsftpd]区块,修改成以下配置(根据你的需求调整参数):[vsftpd] enabled = true # 覆盖所有FTP相关端口(明文+加密) port = ftp,ftp-data,ftps,ftps-data # 使用默认的vsftpd日志过滤规则 filter = vsftpd # 指定vsftpd的日志路径,根据你的系统可能是/var/log/messages或/var/log/syslog,要确认正确 logpath = /var/log/vsftpd.log # 登录失败3次就封禁 maxretry = 3 # 封禁时长1小时(单位秒,86400就是24小时) bantime = 3600重启fail2ban服务:
systemctl restart fail2ban可以用
fail2ban-client status vsftpd查看当前封禁状态,确认是否正常工作。
备注:内容来源于stack exchange,提问作者Nexus1138

