🐧 第08章 · 系统安全加固

最小权限/防火墙/SSH/审计

系统安全加固

这一章把一台生产 Linux 服务器从"裸奔"到"能对抗常见攻击"的过程讲清楚。目标是:缩小攻击面、关掉会用到的、禁掉用不到的、并留下可审计的痕迹。结合这台服务器的实践:SSH 已禁用密码登录、开了 fail2ban、跑在云安全组之后才是相对安全的。

安全加固清单(先按顺序做这 7 件)

优先级 动作 说明
高 禁用 root 直接 SSH 登录 用普通用户 + sudo
高 改为密钥登录、禁用密码 杜绝弱密码爆破
高 改默认 SSH 端口/限制来源 IP 降低被扫描概率
高 开 fail2ban 或等价防爆破 自动封禁多次攻击源
中 最小化开放端口 只放行真正需要对外暴露的
中 自动安全更新/及时打补丁 减少已知漏洞窗口
中 日志留痕、进程最小权限 可审计、可溯源

1) 用普通用户管理,别用 root 直连

# 创建用户并加入 sudo 组
sudo adduser deploy
sudo usermod -aG sudo deploy
# 后续 ssh 都用 deploy 登录,需要提权时 sudo

2) 密钥登录 + 禁用密码(本服务器用了 prohibit-password)

# 本机生成密钥对
ssh-keygen -t ed25519 -C "deploy@server" -f ~/.ssh/id_ed25519
# 把公钥上传到服务器
ssh-copy-id deploy@2.25.183.241
# 编辑 /etc/ssh/sshd_config
sudo nano /etc/ssh/sshd_config

关键配置项:

PasswordAuthentication no        # 彻底禁用密码
PubkeyAuthentication yes         # 允许密钥
PermitRootLogin no               # 禁止 root 登录(或 prohibit-password)
# 只用 SSH 协议第 2 版
Protocol 2

注意 | 改完先 sudo sshd -t 检查语法,再 sudo systemctl reload ssh. 并且保留一个已验证能登录的会话再禁用密码,否则把自己锁在门外。

3) 改 SSH 端口 + 限制来源

# 改端口
Port 2222
# 只允许特定来源 IP 用 SSH(单 IP 管理时尤佳)
Match Address 203.0.113.10,10.0.0.0/8
    PasswordAuthentication no

提示 | 改端口能帮你躲过绝大多数"全网端口扫描 + 弱口令爆破"脚本,但这不是安全,只是"隐蔽"。真正的底线是密钥 + 非 root 登录 + fail2ban。

4) 防暴力破解(fail2ban)

# 安装与查看 jail
sudo apt install -y fail2ban
sudo fail2ban-client status        # 看有哪些 jail
sudo fail2ban-client status sshd   # 看具体封了谁

配置在 /etc/fail2ban/jail.local:

[sshd]
enabled = true
maxretry = 3
bantime  = 600
findtime = 10m

注意 | 误封会把自己挡在外面。给常用 IP 加白名单(ignoreip = 203.0.113.10),并别把 bantime 设得过长。

5) 最小化开放端口

只放行真正必需的入站端口,其余一律拒:

sudo ufw default deny incoming
sudo ufw allow 22
sudo ufw allow 80,443/tcp
sudo ufw enable

复习 | 云主机常用"云安全组 + 本机防火墙"双层模式。可回到《网络运维 · 云防火墙与端口开放》一章节详看端口规划和验证。

6) 自动化安全更新

# Ubuntu 自动应用关键安全补丁
sudo apt install -y unattended-upgrades
# 也可以手动定期 cond:
sudo apt update && sudo apt upgrade -y

7) 进程最小权限与日志留痕

  • 别用 root 跑服务:像本机 Xray 用 User=nobody、CapabilityBoundingSet 只留必要能力。
  • 权限收紧:
  • 配置文件/密钥 chmod 600:本机把 /root/.deploy/* 权限设为 600,避免被其他用户读。
  • 目录 chmod 750;上传目录不加执行位。
  • 审计:看登录与命令历史: bash last # 最近登录 journalctl -u ssh | tail # ssh 服务日志 sudo -l # 可见哪些 sudo 权限

相关命令

  • sshd -t 检测 SSH 配置语法; ufw status 看防火墙。
  • fail2ban-client set sshd unbanip <IP> 手工解封误封 IP。
  • lastlog / last -F 看登录记录; auditctl(auditd)做深度审计。