🧩 第07章 · 安全加固全流程
SSH/防火墙/fail2ban/最小权限
安全加固全流程¶
这一章把前面分散的安全知识点串成一台新服务器上线后的完整加固步骤,从"刚装好系统"到"能对外提供服务且基本安全"。你可以把它当一份完整的加固 checklist 用。
加固目标¶
一台云服务器裸机默认往往是:root 可 SS、用密码或密钥都行、一堆端口裸奔、没人防爆破。我们的目标是把它收敛成:密钥登录、非 root 管理、最小开放端口、自动打补丁、可审计。
流程总览¶
① 系统更新 → ② 关 root 登录 → ③ 建管理用户 → ④ 密钥+禁密码
→ ⑤ 改端口/限来源 → ⑥ fail2ban → ⑦ 最小化端口 → ⑧ 服务最小权限 → ⑨ 日志/审计
第①-③步:更新系统 + 建普通用户 + 关 root 登录¶
# 更新系统
sudo apt update && sudo apt upgrade -y
# 建一个用于管理的用户并加入 sudo
sudo adduser ops
sudo usermod -aG sudo ops
# 先在自己本地生成密钥,再上传
ssh-keygen -t ed25519 -C "ops@server" -f ~/.ssh/id_ed25519
ssh-copy-id ops@2.25.183.241
编辑 /etc/ssh/sshd_config:
PermitRootLogin no
PasswordAuthentication no
# (可选)AllowUsers ops 只允许该用户登录
sudo sshd -t && sudo systemctl reload ssh
重大警告 | 改完先保持当前会话并用另一个窗口
ssh ops@IP确认能登录,再关掉 root/密码登录。一次失误就可能把自己锁在门外。
第④-⑥步:密钥 + 端口 + fail2ban¶
# 改端口(可选,增加隐蔽性)
# Port 2222 (写到 sshd_config)
# 装 fail2ban
sudo apt install -y fail2ban
sudo systemctl enable --now fail2ban
# 写 /etc/fail2ban/jail.local
[sshd]
enabled = true
maxretry = 3
bantime = 600
ignoreip = 127.0.0.1/8 ::1
sudo systemctl restart fail2ban
sudo fail2ban-client status # 确认 sshd jail 是 active
第⑦步:最小化开放端口¶
sudo ufw default deny incoming
sudo ufw allow 22
sudo ufw allow 80,443/tcp
sudo ufw enable
sudo ufw status verbose
提示 | 云主机还要同步设置"云安全组":只放行需要的入站端口(参照《网络运维 · 云防火墙与端口开放》)。两边要一致,只放行 80/443/22 以及自托管服务的必需端口(如 RustDesk 的 21115-21117)。
第⑧步:服务最小权限¶
- 每个服务用专用用户跑,能不用 root 就不用。
- 像 Xray 那样用
User=nobody+CapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_BIND_SERVICE+NoNewPrivileges=true,只给必要能力。 - 密钥/配置
chmod 600,chown给正确属主。 - 检查有没有进程以 root 跑着不该跑的服务:
ps aux | grep root(去掉内核线程)。
第⑨步:日志与审计¶
# 看登录记录
last
# 看 SSH 认证失败
journalctl -u ssh | grep failed
# 看当前 sudo 权限
sudo -l
# 重要系统日志常驻
journalctl --disk-usage && journalctl --vacuum-time=14d
加固自检清单(做完逐项打钩)¶
| # | 检查项 | 验证命令 | 期望 |
|---|---|---|---|
| 1 | 已更新系统 | apt list --upgradable |
无关键安全需更新 |
| 2 | root 禁远程登录 | grep PermitRootLogin /etc/ssh/sshd_config |
no |
| 3 | 密码登录已关 | grep PasswordAuthentication |
no |
| 4 | 普通用户能 sudo | sudo -l |
有权限列表 |
| 5 | fail2ban 在跑 | fail2ban-client status |
sshd active |
| 6 | 端口已收敛 | ss -tlnp |
只有必要端口监听 |
| 7 | 密钥权限 600 | ls -l ~/.ssh/id_ed25519 |
-rw------- |
| 8 | 有日志轮转 | ls /etc/logrotate.d/ |
服务有对应规则 |
相关命令¶
sshd -t、systemctl reload ssh配好 SSH 后必做。fail2ban-client set sshd unbanip <IP>解封误封。ufw status、ss -tlnp反复核对开放端口。journalctl -u ssh -p err看 SSH 相关错误。