CentOS服务器暴露在公网后,最频繁的攻击之一就是SSH密码暴力破解。攻击者利用僵尸网络或扫描工具,持续尝试root及常见用户名搭配弱口令,一旦成功服务器就会被植入挖矿木马、勒索软件或被当作跳板。解决这个问题不能只靠单一手段,需要从登录策略、账户策略、网络层防护和入侵响应几个维度同时收紧。
立即检查当前系统被爆破的迹象
在动手加固之前,先确认服务器是否已经遭受过暴力破解。执行以下命令查看失败的登录记录:
lastb | head -n 50
如果输出大量来自同一IP的失败记录,说明扫描已经在进行。再看安全日志中是否有可疑的Accepted记录:
grep "Accepted" /var/log/secure | tail -n 50
重点核对登录来源IP、用户名和时间。如果发现非本人操作的登录成功记录,应第一时间切断该IP、修改所有密码并排查异常进程。
禁用root直接SSH登录
暴力破解的首要目标就是root账户。攻击者不需要猜用户名,只需要撞密码,成功率会高很多。修改SSH配置:
vi /etc/ssh/sshd_config
找到或添加以下配置:
PermitRootLogin no
保存后重启SSH服务:
systemctl restart sshd
之后所有管理员必须先以普通用户登录,再通过su或sudo切换到root。这会直接废掉一大类针对root的爆破行为。
启用SSH密钥认证并关闭密码登录
最彻底的方案是禁用密码认证,只允许密钥登录。先在本地生成密钥对:
ssh-keygen -t ed25519 -C "server-admin"
将公钥上传到服务器:
ssh-copy-id user@your_server_ip
确认可以用密钥登录后,再修改SSH配置:
PasswordAuthentication no PubkeyAuthentication yes ChallengeResponseAuthentication no
重启sshd服务后,所有没有私钥的连接请求都会被直接拒绝,密码爆破彻底失去意义。注意在关闭密码登录前,务必确认至少有一个账户的密钥可以正常登录,否则可能把自己锁在服务器外。
修改默认SSH端口
把SSH端口从22改为高位端口,可以过滤掉大量无差别扫描。编辑sshd_config:
Port 22922
同时需要调整防火墙规则和SELinux策略。如果使用firewalld:
firewall-cmd --permanent --remove-service=ssh firewall-cmd --permanent --add-port=22922/tcp firewall-cmd --reload
如果SELinux处于enforcing状态,需要允许SSH使用新端口:
semanage port -a -t ssh_port_t -p tcp 22922
修改后重启sshd。注意这并非安全手段,只是降低噪音,真正的安全仍然依赖密钥认证和访问控制。
使用fail2ban自动封禁攻击IP
fail2ban监控日志文件,当某个IP在短时间内失败次数超过阈值,就自动在防火墙中封禁该IP一段时间。CentOS上安装:
yum install epel-release -y yum install fail2ban -y
创建本地配置文件:
vi /etc/fail2ban/jail.local
写入针对SSH的规则:
[sshd] enabled = true port = 22922 filter = sshd logpath = /var/log/secure maxretry = 3 bantime = 3600 findtime = 600
上述配置表示:10分钟内同一IP失败3次,封禁1小时。启动并设置开机自启:
systemctl enable fail2ban --now systemctl status fail2ban
查看封禁情况:
fail2ban-client status sshd
fail2ban能有效应对慢速爆破和分布式低频攻击,是公网服务器的基础防护组件。
配置TCP Wrappers实现IP白名单
如果服务器只允许固定办公网络或家庭网络访问,可以直接用TCP Wrappers做IP级访问控制。编辑/etc/hosts.allow:
sshd: 1.2.3.4 5.6.7.0/24
编辑/etc/hosts.deny:
sshd: ALL
这样只有白名单中的IP可以连接SSH,其他来源在TCP层就被拒绝。注意CentOS 8及更高版本已移除TCP Wrappers支持,此方法主要适用于CentOS 7。
强化密码策略
即使启用了密钥登录,系统中仍可能存在需要密码认证的服务或本地账户。使用PAM模块强制密码复杂度:
vi /etc/security/pwquality.conf
设置最小长度、字符类别和重试次数:
minlen = 12 dcredit = -1 ucredit = -1 lcredit = -1 ocredit = -1 maxrepeat = 3
同时修改/etc/login.defs中的密码有效期:
PASS_MAX_DAYS 90 PASS_MIN_DAYS 1 PASS_WARN_AGE 7
对已有账户强制下次登录修改密码:
chage -d 0 username
密码策略不能阻止在线爆破,但可以降低弱口令被撞中的概率,并在密码泄露后缩短暴露窗口。
限制SSH登录用户和连接频率
在sshd_config中通过AllowUsers或AllowGroups明确指定可以登录的账户:
AllowUsers admin deploy
或只允许特定组:
AllowGroups sshusers
同时限制未认证连接数和登录超时:
MaxAuthTries 3 LoginGraceTime 30 MaxSessions 2 MaxStartups 3:50:10
MaxStartups表示当未完成认证的连接数达到3个时,开始以50%概率拒绝新连接,超过10个则全部拒绝。这能有效缓解并发爆破。
部署端口敲门机制
对于高安全要求场景,可以使用knockd实现端口敲门。SSH端口默认在防火墙中关闭,只有按照特定顺序访问一组预设端口后,防火墙才临时放行来源IP。安装:
yum install epel-release -y yum install knock-server -y
编辑/etc/knockd.conf:
[openSSH] sequence = 7000,8000,9000 seq_timeout = 10 command = /sbin/iptables -I INPUT -s %IP% -p tcp --dport 22922 -j ACCEPT tcpflags = syn [closeSSH] sequence = 9000,8000,7000 seq_timeout = 10 command = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22922 -j ACCEPT tcpflags = syn
启用服务后,外部扫描器根本看不到SSH端口,只有知道敲门顺序的人才能打开访问通道。这种方式隐蔽性极强,但会增加日常登录的操作步骤,适合跳板机或核心业务服务器。
启用系统审计与实时告警
防护措施部署后,还需要监控异常行为。安装并配置auditd:
yum install audit -y systemctl enable auditd --now
添加对SSH配置文件和日志的监控规则:
vi /etc/audit/rules.d/ssh.rules
-w /etc/ssh/sshd_config -p wa -k ssh_config_changes -w /var/log/secure -p wa -k ssh_log_access
加载规则:
augenrules --load
配合logwatch或自写脚本定期分析/var/log/secure,当出现大量失败登录或异常成功登录时发送邮件告警。实时告警可以用简单的shell脚本加crontab实现,每分钟检查一次fail2ban封禁数量变化。
使用防火墙限制来源区域
如果业务只面向国内用户,可以在firewalld中配置地理位置IP段,或者直接使用ipset批量导入国内IP地址段,仅允许这些来源访问SSH端口。对于海外服务器,则只允许管理员的固定IP或所在国家的IP段。这种方式能从源头减少90%以上的扫描流量。
创建ipset集合:
ipset create cn_allow hash:net
批量导入IP段后,在iptables中引用:
iptables -A INPUT -p tcp --dport 22922 -m set --match-set cn_allow src -j ACCEPT iptables -A INPUT -p tcp --dport 22922 -j DROP
注意IP段数据需要定期更新,否则可能误伤正常用户。
定期更新系统与SSH版本
暴力破解之外,SSH服务本身的漏洞也可能被利用。保持系统更新:
yum update openssh-server openssh-clients -y
检查当前版本:
sshd -V
CentOS 7的OpenSSH版本较老,如果条件允许,可以编译安装新版OpenSSH,或迁移到仍受支持的发行版。旧版本可能存在已知的认证绕过或信息泄露漏洞,单纯靠登录策略无法防御。
组合方案的实际效果
单独使用任何一种手段都有局限。关闭密码登录后,fail2ban的作用会减弱,因为攻击者没有密码可试;修改端口后,扫描量下降但针对性攻击仍会找到新端口;IP白名单最安全但灵活性差。实际生产环境中,建议至少组合以下四层:密钥认证、fail2ban、非默认端口、限制登录用户。高安全场景再加端口敲门和IP白名单。
部署完成后,可以模拟攻击测试防护效果。从另一台服务器使用hydra对目标SSH发起爆破,观察fail2ban是否在3次失败后封禁来源IP,同时检查/var/log/secure中的记录是否正常。只有经过验证的配置才是有效的配置。
服务器安全不是一次性工作,攻击手法在变化,系统配置也会随业务调整。建议每季度复查一次SSH配置、fail2ban规则和登录日志,确保护策略仍然符合当前需求。
