安全配置最重要的是顺序
加固服务器不是越快关闭功能越安全。稳妥顺序应该是:在自己的电脑生成密钥,把公钥交给 deploy,另开窗口证明密钥能登录,先在防火墙放行 SSH,再启用防火墙,最后才收紧 SSH 策略。整个过程保留服务商网页控制台和原来的会话。
在本地生成 Ed25519 密钥
密钥在自己的电脑上生成,不是在服务器上生成。Ubuntu 官方文档把 Ed25519 作为合适的默认选择。给私钥设置口令,私钥不能上传到网站、网盘公开目录或 Git 仓库。
ssh-keygen -t ed25519 -C 'my-laptop'
ssh-copy-id deploy@203.0.113.10
ssh deploy@203.0.113.10
把 203.0.113.10 换成真实 IP。ssh-copy-id 不可用时,可以通过服务商控制台把本地 .pub 文件的内容加入 /home/deploy/.ssh/authorized_keys;只复制公钥,绝不能复制没有 .pub 后缀的私钥。新窗口登录后执行 sudo whoami,确认输出 root,并保持这个窗口在线。
先放行 SSH,再启用 UFW
很多 Ubuntu 镜像里的 UFW 默认未启用。一定先添加 SSH 规则,再执行 enable。如果你已把 SSH 改到自定义端口,就要放行真实端口,不能照抄 22。
sudo ufw allow OpenSSH
sudo ufw enable
sudo ufw status verbose
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
最终列表应当包含 SSH、80/TCP 和 443/TCP。80 用于 HTTP 和证书签发验证,443 用于 HTTPS。数据库端口、开发服务器端口和内部应用端口不要因为“以后可能会用”就向整个互联网开放。云厂商如果还有一层安全组,也要配置相同的必要端口。
验证完成后再收紧 SSH
当前 Ubuntu 可以把自定义配置放在 /etc/ssh/sshd_config.d 中,便于以后知道哪一项是自己改的。不同发行版和版本的默认值不完全相同,修改前要看对应版本的官方 OpenSSH 文档。
sudoedit /etc/ssh/sshd_config.d/99-aioos-hardening.conf
sudo sshd -t
sudo systemctl reload ssh
sudo sshd -T | grep -E 'passwordauthentication|permitrootlogin|pubkeyauthentication'
配置文件可以设置 PubkeyAuthentication yes、PasswordAuthentication no、PermitRootLogin no,但只有密钥登录和 sudo 都确认成功后才能这样做。sshd -t 没有输出通常表示语法通过;reload 后再开第三个全新窗口验证,旧窗口最后再关。
打开自动安全更新
如果镜像没有预装 unattended-upgrades,可以安装并启用自动安全更新。它能处理系统安全补丁,但不会替你升级所有应用依赖,也不代表以后不用人工检查。
sudo apt install -y unattended-upgrades
sudo dpkg-reconfigure -plow unattended-upgrades
systemctl status unattended-upgrades --no-pager
建议每周仍查看一次更新和日志;大型版本升级先备份、先测试,不要在访问高峰直接执行。
官方资料
执行前请对照 Ubuntu OpenSSH 官方指南 与 Ubuntu 防火墙官方指南,确认当前系统版本的服务名称和配置目录。
我的踩坑体会
最危险的命令往往不是错误命令,而是顺序错了的正确命令。关闭密码登录本身没有问题,但密钥没验证就关闭,五分钟的操作会变成一次控制台救援。现在我把每次权限修改都当成迁移:先增加新入口,验证新入口,再移除旧入口。
完成标准
重新打开一个完全独立的终端,确认密钥登录正常、sudo 正常、UFW 规则正确,并能从日志看到自己的登录记录。私钥应有安全备份。接下来开始选择并保护 网站域名。