说实话,CentOS 6虽然现在已经出了历史舞台(它的生命周期在2020年11月就结束了),但国内还有很多老旧服务器、嵌入式设备或者遗留系统还在跑这个版本。这些机器往往直接暴露在公网,攻击者扫描默认22端口的暴力破解从未停止。今天这篇指南,我就带着你一步步把SSH的安全加固做到位,就像给服务器穿上一层防弹衣。
咱们先从最基础也最有效的第一步开始——改SSH端口。
一、修改SSH默认端口:让扫描者摸不着北
默认22端口就像你家大门上贴着的“欢迎光临”,全世界都知道。黑客的脚本第一时间就扫这个端口。改成高位端口,比如2222、10022甚至更高,能过滤掉99%的自动扫描攻击。
操作步骤
首先,你得用root或者具有sudo权限的用户登录服务器。然后编辑SSH配置文件:
sudo vi /etc/ssh/sshd_config
找到这一行:
#Port 22
去掉注释,改成你想要的端口,比如:
Port 2222
接着,你得确保SELinux允许这个新端口。CentOS默认开启SELinux,如果不配置,SSH服务可能启动失败。运行:
sudo semanage port -a -t ssh_port_t -p tcp 2222
如果你没装semanage,先安装:
sudo yum install policycoreutils-python -y
重启SSH服务:
sudo service sshd restart
重要提醒:改完端口后,不要关闭当前的SSH会话!新开一个终端,用新端口测试连接:
ssh -p 2222 username@your_server_ip
确认能连上,再关闭旧的会话。不然改错了,你就得去机房或者找VPS服务商的VNC控制台恢复了,那麻烦可就大了。
二、防火墙策略:只放行信任的IP
改端口是第一步,但还不够。理想的状况是:只有你的办公IP或家里的IP才能连上SSH。这就要靠iptables了(CentOS 6默认的防火墙工具)。
配置步骤
- 编辑防火墙规则
sudo vi /etc/sysconfig/iptables
- 在规则中添加新端口 找到类似这样的行:
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
把它改成:
-A INPUT -m state --state NEW -m tcp -p tcp --dport 2222 -j ACCEPT
- 限制源IP(可选但强烈推荐) 如果你固定IP,可以进一步限制:
-A INPUT -s 你的固定IP/32 -p tcp -m state --state NEW -m tcp --dport 2222 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 2222 -j DROP
这样,除了你的IP,其他人连2222端口直接被丢包。
- 重启防火墙
sudo service iptables restart
然后验证规则是否生效:
sudo iptables -L -n -v
你应该能看到新端口的ACCEPT规则,以及对应源IP的匹配计数。
为什么不用firewalld?
CentOS 6默认用iptables,firewalld是CentOS 7开始引入的。所以别在CentOS 6上瞎折腾firewalld,直接用iptables最靠谱。
三、禁用root直接登录:给管理员加道锁
允许root直接SSH登录是安全大忌。一旦密码被破解,攻击者直接拿到最高权限。正确做法是:禁用root登录,改用普通用户+sudo提权。
配置步骤
- 创建一个普通用户
sudo useradd -m -s /bin/bash your_username
sudo passwd your_username
设置一个强密码,最好包含大小写、数字和特殊字符。
- 赋予sudo权限 编辑sudoers文件:
sudo visudo
找到root ALL=(ALL) ALL这一行,在下面添加:
your_username ALL=(ALL) ALL
或者更安全的做法,只允许执行特定命令(比如重启服务):
your_username ALL=(ALL) NOPASSWD: /sbin/service sshd restart
- 禁用root SSH登录 再次编辑SSH配置:
sudo vi /etc/ssh/sshd_config
找到或添加:
PermitRootLogin no
同时,建议禁用密码认证,改用密钥登录(见下文)。
- 重启SSH服务
sudo service sshd restart
- 用新用户测试
ssh -p 2222 your_username@your_server_ip
登录后,执行sudo命令时输入密码即可。
关于密钥登录:更安全的替代密码
密码再怎么强,也比不过密钥。密钥登录的本质是“你拥有私钥”,服务器验证公钥,暴力破解完全无效。
- 在本地生成密钥对(在你的电脑上执行)
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
一路回车,或者设置一个 passphrase(强烈建议设置)。
- 将公钥复制到服务器
ssh-copy-id -p 2222 your_username@your_server_ip
如果没装ssh-copy-id,手动复制也行:
cat ~/.ssh/id_rsa.pub | ssh -p 2222 your_username@your_server_ip "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
- 禁用密码登录
编辑
/etc/ssh/sshd_config:
PasswordAuthentication no
ChallengeResponseAuthentication no
重启SSH:
sudo service sshd restart
现在,没有私钥的人就算知道密码也登不上去。
四、额外加固:失败次数限制、空闲超时、日志监控
光做上述三步还不够,还得防止暴力破解的变种和异常登录。
1. 限制SSH失败次数
安装并配置fail2ban,它能监控日志,多次失败后自动封IP。
sudo yum install fail2ban -y
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo vi /etc/fail2ban/jail.local
添加:
[sshd]
enabled = true
port = 2222
filter = sshd
logpath = /var/log/secure
maxretry = 3
bantime = 3600
启动服务:
sudo service fail2ban start
sudo chkconfig fail2ban on
2. 空闲会话超时
防止有人断开连接后会话还在,可能被他人利用。
编辑/etc/ssh/sshd_config:
ClientAliveInterval 300
ClientAliveCountMax 2
这样5分钟无操作自动断开。
3. 日志监控
定期查看SSH登录日志:
sudo tail -f /var/log/secure | grep sshd
或者设置告警,异常登录时发邮件。
五、测试与验证:确保一切正常
加固完成后,务必全面测试:
- 用新端口和新用户登录
ssh -p 2222 your_username@your_server_ip
- 验证root登录被拒
ssh -p 2222 root@your_server_ip
应该提示“Permission denied (publickey,gssapi-with-mic,password)”。
- 检查SSH配置语法
sudo sshd -t
无输出即表示配置正确。
- 查看服务状态
sudo service sshd status
- 测试密钥登录
确保
ssh-keygen生成的私钥能无密码登录。
六、一些真实场景中的坑
云服务商的安全组:如果你用的是阿里云、腾讯云等,别忘了在控制台的“安全组”或“防火墙”规则里也放行新端口2222,否则外网连不上。
SELinux上下文:如果改了SSH端口后服务启动不了,通常是SELinux问题。用
semanage port -l查看允许端口,用semanage port -a -t ssh_port_t -p tcp 2222添加。备用连接:永远保持一个控制台访问(比如VNC),以防SSH全断后无法恢复。
定期更新:虽然CentOS 6已停更,但如果有安全更新,还是得手动装。命令:
sudo yum update openssh -y
七、总结:安全是一个层叠过程
改端口、配防火墙、禁用root、密钥登录、fail2ban……这些措施不是孤立的,而是层层叠加。即使某一层被绕过,还有其他层在保护你。记住,没有绝对安全的系统,但可以通过增加攻击成本来让大多数攻击者知难而退。
最后,定期审计你的SSH配置和登录日志。比如每月跑一次:
sudo grep "Failed password" /var/log/secure | awk '{print $(NF-3)}' | sort | uniq -c | sort -nr | head
看看谁在频繁尝试登录,然后果断封掉他们的IP。
希望这篇指南能帮到你。CentOS 6虽老,但安全加固的原则不变。如果时间允许,尽早迁移到CentOS 7/8或Rocky Linux、AlmaLinux这些现代发行版,毕竟旧系统的漏洞库太让人头疼了。
