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规则和登录日志,确保护策略仍然符合当前需求。