CentOS服务器默认的SSH配置在公网环境下几乎等于裸奔。密码爆破、端口扫描、自动化攻击工具每天24小时不间断地在互联网上寻找目标,而多数被攻陷的机器并非因为漏洞太新,而是基础防护没做对。安全加固的核心思路不是堆砌工具,而是减少暴露面、切断自动化攻击路径、保留审计痕迹。下面直接给出可落地的配置方案和操作步骤。
一、先关闭密码登录,改用密钥认证密码登录是暴力破解的主要入口。攻击者用字典和弱口令组合可以在短时间内尝试数万次登录。最有效的阻断方式就是彻底禁用密码认证,只允许SSH密钥登录。先在自己电脑上生成密钥对:
ssh-keygen -t ed25519 -C "your-server-admin"
把公钥上传到服务器的指定用户目录,然后修改SSH服务配置:
vim /etc/ssh/sshd_config
找到并修改以下参数:
PubkeyAuthentication yes PasswordAuthentication no PermitEmptyPasswords no ChallengeResponseAuthentication no UsePAM yes
保存后重启SSH服务:
systemctl restart sshd
注意:在关闭密码登录之前,务必确认密钥可以正常登录,否则会把自己锁在服务器外面。建议先开一个测试会话验证,再执行重启操作。
二、修改默认SSH端口并限制来源IP把SSH端口从22改成高位端口,能过滤掉大量无差别扫描。虽然端口隐藏不是真正的安全措施,但可以显著降低日志噪音和自动化攻击命中率。修改配置:
Port 22922
同时建议配合防火墙限制来源IP,只允许自己的办公或家庭IP访问SSH端口。使用firewalld实现:
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="你的公网IP" port protocol="tcp" port="22922" accept' firewall-cmd --reload
如果办公IP不固定,可以考虑使用跳板机或至少限制到较小的IP段。暴露给全公网的SSH端口无论怎么改端口,最终还是会被扫描到。
三、部署Fail2ban自动封禁异常IP即使只允许密钥登录,仍然会有大量连接尝试消耗服务器资源并产生日志。Fail2ban可以监控SSH日志,对短时间内多次失败连接的IP自动封禁。CentOS安装:
yum install epel-release -y yum install fail2ban -y
创建本地配置:
vim /etc/fail2ban/jail.local
写入以下内容:
[sshd] enabled = true port = 22922 filter = sshd logpath = /var/log/secure maxretry = 3 bantime = 3600 findtime = 600
启动并设置开机自启:
systemctl enable fail2ban --now
查看封禁状态:
fail2ban-client status sshd
这个工具对于公网服务器来说属于必备项,能自动阻断绝大多数扫描器。
四、限制SSH登录用户和登录时间不是所有系统用户都需要远程登录。通过配置AllowUsers或AllowGroups,只放行指定的管理员账号:
AllowUsers admin@你的IP段
也可以直接限制用户:
AllowUsers admin
如果有多人协作,建议使用AllowGroups配合系统组管理。同时可以限制root直接登录:
PermitRootLogin no
管理员先以普通用户登录,再通过sudo提权。这样即使普通账号泄露,攻击者还需要突破sudo密码或提权漏洞才能拿到root权限。
五、启用SSH连接超时和心跳检测闲置的SSH会话容易被中间人劫持或利用。设置合理的超时时间,断开长时间不活动的连接:
ClientAliveInterval 300 ClientAliveCountMax 2
这表示每300秒发送一次心跳包,连续两次无响应就断开连接。对于跳板机或运维终端,这个配置能减少会话被遗忘在公共电脑上的风险。
六、升级OpenSSH和系统补丁CentOS 7自带的OpenSSH版本较老,存在一些已知漏洞。建议升级到较新版本,或者直接迁移到CentOS Stream或Rocky Linux等持续维护的发行版。如果暂时不能迁移,至少要做到:
yum update openssh-server -y yum update openssl -y
定期执行全量更新:
yum update -y
更新后重启SSH服务。对于暴露在公网的生产服务器,补丁管理是最基础也是最重要的安全措施。
七、使用TCP Wrappers做二次访问控制CentOS 7仍然支持TCP Wrappers,可以在SSH服务之前再加一层主机访问控制。编辑/etc/hosts.allow:
sshd: 你的IP段
编辑/etc/hosts.deny:
sshd: ALL
这种白名单模式能直接拒绝非授权IP的连接请求,连接在到达SSH服务之前就被丢弃。不过需要注意,如果服务器前面有反向代理或NAT,TCP Wrappers看到的可能是内网IP,配置时要根据实际网络拓扑调整。
八、审计登录日志和登录通知安全加固不是配置完就结束了,还需要持续监控。CentOS的SSH登录日志在/var/log/secure,可以通过logwatch或自写脚本定期检查。建议配置登录通知,一旦有人登录服务器,立即发送邮件或消息提醒:
echo 'echo "SSH login: $(whoami) from $(echo $SSH_CONNECTION | awk "{print \$1}") at $(date)" | mail -s "SSH Login Alert" your@email.com' >> /etc/profile
或者使用更专业的审计工具如auditd记录所有敏感操作。对于多管理员环境,登录通知能帮助及时发现异常访问。
九、关闭不必要的服务和端口远程访问安全不仅仅是SSH的事。服务器上可能还运行着其他网络服务,每一个开放端口都是潜在的攻击面。用以下命令查看当前监听端口:
ss -tlnp
关闭不需要的服务:
systemctl disable --now 服务名
只保留必要的Web服务、数据库(如果必须远程)和SSH。对于数据库,建议只监听内网地址,不要绑定0.0.0.0。
十、配置SELinux策略很多管理员为了方便直接关闭SELinux,这等于放弃了系统级的强制访问控制。对于公网服务器,建议保持SELinux开启,并正确配置SSH相关策略。如果修改了SSH端口,需要更新SELinux端口标签:
semanage port -a -t ssh_port_t -p tcp 22922
检查SELinux状态:
getenforce
如果显示Enforcing,说明策略生效。遇到SSH无法连接时,先检查SELinux日志/var/log/audit/audit.log,而不是直接关闭SELinux。
十一、定期备份和恢复验证安全加固的最终目的是保证业务连续性。即使所有防护都失效,只要有可靠的备份,就能快速恢复。建议配置自动化备份策略,定期将关键配置和数据同步到异地存储。同时每季度做一次恢复演练,确保备份真的可用。很多团队直到服务器被勒索后才去检查备份,结果发现备份文件也被加密或损坏。
十二、总结加固优先级如果只能做三件事,优先级应该是:关闭密码登录改用密钥、部署Fail2ban、限制来源IP。这三项能挡住90%以上的自动化攻击。如果还能继续做,就加上限制登录用户、升级补丁、配置SELinux和日志审计。安全是分层防御,单靠某一项措施无法保证绝对安全,但每一层都能提高攻击成本,让攻击者转向更容易的目标。
