一、为什么要加固:你的服务器正在被扫描
当服务器接入公网的那一刻,互联网上大量自动化扫描程序会昼夜不停地遍历 IP 地址,一旦发现 22 端口(SSH 默认端口),就会用海量用户名和密码组合反复尝试登录——这就是暴力破解。
查看 SSH 登录失败记录的命令:
sudo journalctl -u sshd | grep -i "failed" | tail -30
二、登录服务器的两条通道
- 通道一:SSH(含控制台 Workbench)——走公网、经过安全组 22 端口、受 sshd 配置管辖。如果改崩了配置或封了 22 端口,这条通道会一起断开,不是后路。
- 通道二:VNC——走阿里云带外管理通道,相当于直接坐在服务器物理显示器前登录。不经过安全组也不经过 sshd,能救命的后路。
三、用密钥代替密码登录
3.1 密钥认证原理
密码有被猜中或泄露的弱点。密钥认证生成一对钥匙:
- 私钥:留在自己电脑上,绝不外传,是身份的唯一凭证
- 公钥:放到服务器上,可以公开
登录时服务器用公钥出一道只有对应私钥才能解开的"数学难题",持有私钥的人能顺利登录,没有私钥的攻击者无从下手。
3.2 准备普通用户
sudo adduser study # 新建普通用户 study
sudo passwd study # 设置登录密码
sudo usermod -aG wheel study # 加入 wheel 组以获得 sudo 权限
3.3 确认 VNC 后路
在阿里云控制台进入 云服务器ECS → 实例 → 远程连接 → 选择 VNC 远程连接。登录成功后执行:
whoami # 显示当前用户名,应为 study
tty # VNC 登录显示 /dev/tty1,SSH 登录显示 /dev/pts/0 之类
3.4 在本地生成密钥对
# Mac/Linux 终端执行:
ssh-keygen -t ed25519 -C "你的名字-服务器加固"
# 查看公钥内容:
cat ~/.ssh/id_ed25519.pub
# Windows PowerShell:
type $env:USERPROFILE\.ssh\id_ed25519.pub
3.5 把公钥安装到服务器
sudo su - study
mkdir -p ~/.ssh
chmod 700 ~/.ssh
vi ~/.ssh/authorized_keys
# 在 vi 中按 i 进入编辑 → 粘贴公钥 → Esc → :wq 保存
chmod 600 ~/.ssh/authorized_keys
ls -l ~/.ssh # 核对:authorized_keys 应为 -rw-------
3.6 先验证密钥能登录,再禁用密码(铁律!)
# 在自己电脑上用 SSH 客户端登录验证:
ssh study@服务器公网IP
3.7 为老师配置巡检账号
sudo adduser teacher
sudo mkdir -p /home/teacher/.ssh
sudo vi /home/teacher/.ssh/authorized_keys
# 贴入老师的公钥,保存退出
sudo chmod 700 /home/teacher/.ssh
sudo chmod 600 /home/teacher/.ssh/authorized_keys
sudo chown -R teacher:teacher /home/teacher/.ssh
# teacher 没有密码,单独配置免密 sudo:
echo "teacher ALL=(ALL) NOPASSWD: ALL" | sudo tee /etc/sudoers.d/teacher
sudo chmod 440 /etc/sudoers.d/teacher
sudo visudo -c # 检查语法
sudo -u teacher sudo -n true && echo "teacher 免密 sudo 可用"
四、加固 sshd 配置
sudo vi /etc/ssh/sshd_config
找到并修改以下几项:
PubkeyAuthentication yes # 允许密钥登录
PasswordAuthentication no # 禁止密码登录(先验证密钥后再改)
PermitRootLogin no # 禁止 root 远程登录
MaxAuthTries 3 # 最多 3 次认证尝试
ClientAliveInterval 300 # 每 300 秒探测客户端
ClientAliveCountMax 2 # 连续 2 次无响应断开
AllowUsers study teacher # 登录白名单
修改后先验证语法再重载:
sudo sshd -t # 测试配置文件语法
sudo systemctl reload sshd # 重载配置生效
五、两道门:安全组与主机防火墙
云服务器有两层防护:
- 安全组:阿里云平台层防火墙,管"公网流量能不能进入实例"
- 主机防火墙(firewalld):操作系统内部防火墙,管"流量到达后放不放行到具体服务"
5.1 配置主机防火墙
sudo firewall-cmd --permanent --add-service=ssh
sudo firewall-cmd --reload
sudo firewall-cmd --list-all
5.2 配置阿里云安全组
进入 实例 → 安全组 → 配置规则 → 入方向,保留 SSH(TCP 22) 和 ICMP,删除不需要的端口。
5.3 查看监听端口
sudo ss -tlnp
六、让服务器自动反击:fail2ban
fail2ban 持续监控登录日志,发现某个 IP 反复失败登录就自动封禁。
6.1 安装
sudo dnf install -y epel-release
sudo dnf install -y fail2ban
6.2 编写防护规则
sudo vi /etc/fail2ban/jail.d/sshd.local
[sshd]
enabled = true
backend = systemd
maxretry = 3
findtime = 600
bantime = 3600
含义:10 分钟内失败 3 次,就把这个 IP 封禁一小时。
6.3 启动并查看
sudo systemctl enable --now fail2ban
sudo fail2ban-client status sshd
七、验证清单
| 验证项 | 命令/操作 |
|---|---|
| VNC 以 study 登录 | 控制台 VNC 登录,tty 显示 /dev/tty1 |
| SSH 密钥登录无需密码 | ssh study@公网IP |
| 密码登录被拒绝 | 尝试密码登录应失败 |
| root 无法直接登录 | ssh root@公网IP 应被拒绝 |
| sshd 配置无报错 | sudo sshd -t |
| 防火墙只放行 ssh | sudo firewall-cmd --list-all |
| fail2ban 正在运行 | sudo fail2ban-client status sshd |
| teacher 免密 sudo 可用 | sudo -u teacher sudo -n true |
八、本章小结
| 攻击者想做的事 | 你部署的加固措施 |
|---|---|
| 猜密码登进来 | SSH 密钥登录 + 禁用密码 + 禁止 root |
| 从别的端口钻进来 | firewalld + 安全组,两层最小化放行 |
| 反复爆破 SSH | fail2ban 自动封禁 |
| 进来了不被发现 | journal 日志审计 |