🐧 第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)做深度审计。