本篇目标
一、为什么要重视服务器安全?
很多人第一次购买云服务器后,会直接开放 SSH、Web 服务,然后开始部署业务。
觉得:
我的服务器没人知道,不会有人攻击。
实际上,只要服务器暴露在公网,几分钟内就可能收到来自全球各地的扫描请求。
例如:
互联网
↓
端口扫描
↓
SSH 暴力破解
↓
漏洞扫描
↓
尝试入侵
这些攻击大多数不是针对你个人,而是自动化程序在全网扫描。
所以:
服务器不是"会不会被扫描",而是"什么时候被扫描"。
二、SSH 为什么最容易被攻击?
Linux 最常见的远程管理方式就是 SSH。
SSH默认监听:22 端口
攻击者通常会:
- • 尝试常见用户名(root、admin、ubuntu 等)
如果密码足够简单,就可能被成功登录。
因此:SSH 是服务器安全的第一道关。
三、密码登录还是密钥登录?
很多新手喜欢:
用户名 + 密码
虽然方便,但安全性较低。
更推荐:
SSH 密钥认证
认证方式对比:
查看当前 SSH 配置:
# PubkeyAuthentication 为密钥认证
# PasswordAuthentication 为密码认证
grep -E "PasswordAuthentication|PubkeyAuthentication" /etc/ssh/sshd_config
生成 SSH 密钥
首先在自己的电脑执行:
# -t 指定密钥算法 -C 公钥添加注释
ssh-keygen -t ed25519 -C "hakuna@example.com"
如果你的系统较旧,也可以使用:
# -b 密钥长度
ssh-keygen -t rsa -b 4096
一路按 Enter 即可。
生成完成后,会得到两个文件:
| |
|---|
~/.ssh/id_ed25519 | |
~/.ssh/id_ed25519.pub | |
上传公钥到服务器
最简单的方法:
ssh-copy-id username@服务器IP
例如:
ssh-copy-id root@192.168.1.100
如果系统没有 ssh-copy-id,也可以手动复制:
cat ~/.ssh/id_ed25519.pub
把输出内容追加到服务器:
~/.ssh/authorized_keys
验证密钥登录
重新打开一个终端:
ssh root@服务器IP
如果能够直接登录,而不再输入密码:
说明密钥登录已经配置成功。
最后关闭密码登录
确认密钥可以正常登录后,再修改 SSH 配置(/etc/ssh/sshd_config):
PubkeyAuthentication yes
PasswordAuthentication no
保存配置并重启ssh:
systemctl restart ssh
最后再次测试:
ssh root@服务器IP
如果能够正常登录,说明服务器已经切换到密钥认证。
千万不要在验证之前关闭密码登录,否则很可能把自己锁在服务器外。
四、修改 SSH 端口有必要吗?
很多教程都会建议:
把 SSH 从 22 改成 2222 或其他端口。
修改后需要重启 SSH:
systemctl restart ssh
这样可以减少大量针对 22 端口的自动扫描。
不过需要明确一点:
修改端口不能提高服务器本身的安全性,只能减少无意义的扫描和日志。
真正决定安全的是:
五、配置防火墙
即使服务已经启动,也不代表应该允许所有端口都暴露到公网。
建议遵循一个原则:
只开放业务需要的端口。
查看当前开放端口:
ss -lntp
Ubuntu 常用 UFW:
# 开放 SSH
ufw allow 22/tcp
# 开放 HTTP
ufw allow 80/tcp
# 开放 HTTPS
ufw allow 443/tcp
# 启用防火墙
ufw enable
# 查看规则
ufw status
如果 SSH 修改到了其他端口,例如 2222:
ufw allow 2222/tcp
然后再关闭 22。
不要先关闭 SSH,再修改规则,否则很容易导致无法远程连接。
六、使用 Fail2ban 防止暴力破解
Fail2ban 是运维中非常常用的安全工具。
它的工作流程可以理解为:
登录失败
↓
达到次数限制
↓
自动封禁攻击 IP
安装:
Ubuntu:
apt update
apt install fail2ban -y
CentOS:
yum install fail2ban -y
启动:
systemctl enable fail2ban
systemctl start fail2ban
查看状态:
systemctl status fail2ban
查看 SSH 防护状态:
fail2ban-client status sshd
查看被封禁 IP:
fail2ban-client status sshd
输出中会看到:
Banned IP list
如果某个 IP 被误封:
fail2ban-client set sshd unbanip 192.168.1.100
七、及时更新系统
很多安全漏洞都来自:
系统版本过旧
例如:
建议定期更新:
Ubuntu:
apt update
apt upgrade -y
CentOS:
yum update -y
更新前建议:
不要在生产高峰期直接升级系统。
八、真实案例:SSH 被暴力破解
某天早上,收到用户反馈:
网站访问速度明显变慢。
第一反应不要急着重启服务器。
先确认系统资源。
查看 CPU:
top
发现:
load average 持续升高
说明服务器确实存在异常。
继续查看进程:
top
发现:
sshd
占用了大量 CPU
为什么 SSH 会这么忙?
继续查看当前连接:
ss -tnp | grep :22
结果:
大量来自不同 IP 的 SSH 连接
说明:
有人正在不断尝试连接 SSH。
继续查看认证日志:
Ubuntu:
grep "Failed password" /var/log/auth.log | tail -20
CentOS:
grep "Failed password" /var/log/secure | tail -20
发现:
Failed password for root
而且:
一分钟内出现数百次。
这时候基本可以确认:
服务器正在遭受 SSH 暴力破解。
接下来开始处理。
第一步:
查看 Fail2ban 是否运行:
systemctl status fail2ban
发现:
服务没有启动。
立即启动:
systemctl enable fail2ban
systemctl start fail2ban
再次观察:
fail2ban-client status sshd
发现:
多个 IP 已被封禁。
最后进一步优化:
一段时间后:
服务器 CPU 恢复正常。
SSH 日志也恢复平静。
这次故障虽然没有真正入侵成功,但如果服务器仍然使用弱密码,很可能只是时间问题。
九、安全运维的几个好习惯
很多安全问题,并不是因为黑客技术高,而是因为配置不规范。
建议养成以下习惯:
安全不是一次配置,而是持续维护。
十、本篇总结
没有绝对可靠的安全配置,只有不断降低风险的过程。