华为云2核2G ECS加固实战:Swap、UFW、Fail2ban与密钥登录
背景:先看这台机器的初始状态
一台华为云新加坡的 ECS,Ubuntu 24.04,2 核,内存实测只有 1.7 GiB,而且没有 Swap。首次检查时发现三个问题:
- 内存小、无 Swap,重负载下容易 OOM;
- sshd 仍允许 root 密码登录,暴露在公网的 22 端口就是 brute force 的靶子;
- 没有入侵封禁和集中监控,出问题只能事后翻日志。
加固前先定两条保命原则,后面每一步都按这个来:改任何配置前先备份原文件;改 sshd 时保持一条已登录会话不关,新开会话验证成功才收尾。华为云控制台的 VNC 远程登录不受 SSH 设置影响,可以作应急入口。
第一步:加 2G Swap 并持久化
sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
持久化写进 /etc/fstab:
/swapfile none swap sw 0 0
再把 swappiness 调低,避免系统过早用 Swap:
echo 'vm.swappiness=10' | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
验证:free -h 能看到 Swap 2.0G,swapon --show 有输出。
第二步:开自动安全更新
装 unattended-upgrades,写一份 20auto-upgrades,让安全更新自动装、其他更新不动:
sudo apt install unattended-upgrades -y
# /etc/apt/apt.conf.d/20auto-upgrades
APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Unattended-Upgrade "1";
验证方法:
apt-config dump | grep Periodic
sudo unattended-upgrade --dry-run
以后手动更新如果不想被交互式提示打断,可以用 DEBIAN_FRONTEND=noninteractive 跳过 debconf 询问。
第三步:UFW 只放行 22 端口
顺序很重要:先放行 22,再启用,否则会把自己锁在外面。
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow 22/tcp
sudo ufw enable
sudo ufw status verbose
这台机器启用后对外只监听 22 端口,华为云的 uniagentd 只监听 127.0.0.1,不用另外处理。
第四步:SSH 改成仅密钥登录
先把自己的公钥加进 root 的 authorized_keys,确认密钥能登录后,再改 sshd 配置。注意一个坑:这台机器主配置本来就是 PasswordAuthentication no,但 sshd_config.d/50-cloud-init.conf 这个 drop-in 把它覆盖成了 yes,所以只改主配置没用,必须改 drop-in 里那一项,同时把 cloud.cfg 的 ssh_pwauth 改成 false,防止 cloud-init 回写。
# sshd_config.d/50-cloud-init.conf 及相关配置
PasswordAuthentication no
PermitRootLogin prohibit-password
MaxAuthTries 3
X11Forwarding no
改完不要关掉当前会话,新开一个会话验证:密钥能登、密码方式被拒(Permission denied (publickey))才算收尾。
第五步:Fail2ban 做暴力破解封禁
sudo apt install fail2ban -y
# /etc/fail2ban/jail.local
[sshd]
enabled = true
backend = systemd
maxretry = 5
findtime = 10m
bantime = 1h
可以再配递增封禁(最长 1 周),并把本地回环加进 ignoreip。启动后用 fail2ban-client status sshd 确认 jail 在跑,初期 0 封禁是正常的。
第六步:Beszel 探针做监控兜底
探针装到 /opt/beszel-agent/,用 systemd 托管,环境变量文件只给 root 读。Hub 端点「添加」保存该系统后,探针的 WebSocket 就会连上 Hub,连接建立后探针会自动停掉自身的 SSH 监听。注意:探针端口不用在 UFW 或安全组里放行入站,监控走的是探针主动向 Hub 发起的出站连接。
踩过的坑
- .pem 权限:Windows 上生成的私钥文件 ACL 里有个孤儿 SID,OpenSSH 直接拒用。用
icacls /inheritance:r收紧成仅自己可读后解决。 - 端口可达测试误判:有一次 22 端口测试打到的是本地出口代理,不是服务器本身,不能作为服务器可达的证据,一切以 SSH 登录结果为准。
- 手动 apt 更新的交互提示:
keyboard-configuration会问键盘布局(保持默认 English (US) 即可),openssh-server会问保留本地改过的 sshd_config 还是装新版默认配置——选高亮默认的 keep the local version currently installed,才能保住前面的 SSH 加固。
验证清单
free -h:Swap 2G 已启用ufw status:默认拒绝入站、仅放行 22/tcp- 新会话:密钥可登、密码被拒
fail2ban-client status sshd:jail 正常运行- Beszel 面板:探针在线,WebSocket 已连接
做完这套,2 核 2G 的小机器在“别被扫爆、别 OOM、出了问题能看见”这三点上基本就稳了。后续如果要扩,再考虑把监控告警和备份接进来。
- 点赞
- 收藏
- 关注作者
评论(0)