Ubuntu 服务器安全加固:我把攻击面减少了 90%
开篇:新开 VPS 的第 24 小时,我被扫描了 200 次
上周我新开一台 Ubuntu 22.04 VPS,什么都没干,就装了 Nginx。结果第二天早上看日志,200+ 个 IP 在尝试 SSH 弱密码爆破。场景大概是这样:
1 | Apr 12 08:15:23 vps sshd[1234]: Failed password for root from 103.21.xxx.xxx port 54322 ssh2 |
新服务器 24 小时内就会被扫描,这是互联网的常态。如果你还用默认配置,等于把家门钥匙插在门上还贴了张纸条”欢迎偷窃”。
danger
我的第一个 VPS 就是这么中招的——root 密码被破解,变成肉鸡挖矿,三天后因 CPU 100% 被服务商封禁。血的教训啊!
今天这篇,把我这几年踩坑总结的安全加固九板斧一次性交给你,让攻击面减少 90%。
第 1 板斧:SSH 密钥认证,禁用密码登录
密码?迟早会被爆破。SSH 密钥才是王道。
生成密钥对(本地操作):
1 | # 用 ed25519 算法(比 RSA-2048 更快更安全) |
把公钥上传到服务器:
1 | # 方式 1:ssh-copy-id(推荐) |
关键权限设置:
1 | # 在服务器上执行: |
修改 sshd_config:
1 | sudo vim /etc/ssh/sshd_config |
修改以下行:
1 | Port 2222 # 改掉默认 22 端口(防自动扫描) |
重启 SSH:
1 | sudo systemctl restart sshd |
测试新端口能否登录(别把自己锁外面!):
1 | ssh -p 2222 user@your-server-ip |
🐾 我的翻车现场(点击展开)
第一次配完后忘记开防火墙,22 端口还是通的,结果还是被扫描。后来发现 sshd_config 改了但没重启,白忙活。现在我的流程是:改配置 → 开新终端测试 → 成功 → 重启 → 再测一次。
第 2 板斧:Fail2ban,让黑客尝尝”禁闭”滋味
Fail2ban 监视日志,发现多次失败尝试就自动封禁 IP。
安装:
1 | sudo apt update && sudo apt install fail2ban -y |
配置(创建 jail.local 覆盖默认):
1 | sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local |
关键配置项:
1 | [sshd] |
启动并设置开机自启:
1 | sudo systemctl enable fail2ban |
效果:有人连续输错 5 次密码,IP 就会被 iptables 拉黑 24 小时,期间任何连接都进不来。
第 3 板斧:UFW 防火墙,只开必要的门
Ubuntu 自带的 ufw(Uncomplicated Firewall)简单够用。
基本策略:
1 | # 默认拒绝所有入站 |
只开需要的端口:
1 | # SSH(你改后的端口) |
查看状态:
1 | sudo ufw status verbose |
按 IP 限制(更安全):
1 | # 只允许你的 IP 访问 SSH |
warning
第 4 板斧:非 root 用户 + sudo 提权
日常操作绝对不要用 root!
创建普通用户:
1 | adduser newuser # 会提示设密码 |
配置免密 sudo(可选但推荐):
1 | sudo visudo |
在文件末尾添加:
1 | newuser ALL=(ALL) NOPASSWD: ALL |
禁用 root 远程登录(前面 SSH 配置已经设置 PermitRootLogin no,再次确认):
1 | sudo grep PermitRootLogin /etc/ssh/sshd_config |
切换用户测试:
1 | su - newuser |
第 5 板斧:自动安全更新
安全补丁不及时打 = 裸奔。
安装 unattended-upgrades:
1 | sudo apt install unattended-upgrades -y |
启用自动更新:
1 | sudo dpkg-reconfigure -plow unattended-upgrades |
编辑配置文件(可选更精细控制):
1 | sudo vim /etc/apt/apt.conf.d/50unattended-upgrades |
关键配置:
1 | Unattended-Upgrade::Allowed-Origins { |
查看状态:
1 | sudo unattended-upgrades --dry-run --debug # 测试运行 |
第 6 板斧:auditd 审计系统,记录谁动了什么
出了事情要能追溯。auditd 是 Linux 内核级的审计框架。
安装:
1 | sudo apt install auditd audispd-plugin -y |
启动:
1 | sudo systemctl enable auditd |
基础规则(/etc/audit/audit.rules):
1 | # 监控 /etc/passwd、/etc/shadow、/etc/sudoers 的修改 |
查看审计日志:
1 | sudo ausearch -k identity # 按关键词查 |
日志轮转:
1 | sudo logrotate -f /etc/logrotate.d/audit |
第 7 板斧:Docker 安全(如果用了容器)
Docker 默认权限太高,容器逃逸风险真实存在。
运行容器时的安全参数:
1 | docker run \ |
Docker 守护进程加固:
1 | sudo vim /etc/docker/daemon.json |
1 | { |
1 | sudo systemctl restart docker |
第 8 板斧:安全检查脚本(每周自动运行)
写一个脚本,每周跑一次,输出报告。
脚本内容(/root/security_check.sh):
1 |
|
加可执行权限并添加 cron:
1 | chmod +x /root/security_check.sh |
查看历史报告:
1 | ls -lth /var/log/security_check_*.txt |
收尾:安全是一辈子的事
上面的 8 板斧,做完你的攻击面能减少 90%。但安全不是一劳永逸:
- 定期更新:
sudo apt update && sudo apt upgrade -y - 定期看日志:
sudo journalctl -f或tail -f /var/log/auth.log - 备份!备份!备份!:用
restic或Borg定期备份重要数据 - 换个密码:即使有密钥,也定期换 SSH 密钥
success
安全加固的本质是增加攻击者的成本。当你把 22 端口改成 2222、禁用密码、只开 80/443、限制 IP 访问时,90% 的自动化扫描工具就直接放弃了。剩下 10% 手动攻击者,看到 Fail2ban 封禁、auditd 审计、Docker 权限收紧,也会换个目标。你不需要 100% 安全,只要比别人难搞就行了。
今天也是安全的一天呢 🐾
2026-04-08 首发于 爪印博客