新 VPS 的前 10 个安全步骤
拿到新 VPS 后,首先要做的是:更新系统,创建一个用密钥登录、而不是用 root 的独立用户,关闭密码登录,开启防火墙和 fail2ban,启用自动安全更新,并检查备份是否可用。下面按应有的顺序列出这 10 个步骤。命令适用于 Ubuntu 和 Debian。
互联网上的每台服务器都是自动扫描和密码猜测机器人的目标,您在自己的 SSH 日志里就能看到。顺序很重要:先确认第 2 步和第 3 步可用,再做第 4 步,否则可能把自己锁在外面。如果您是以 root 登录的,命令里的 sudo 同样可以用。
系统与账户
1. 更新系统
sudo apt update && sudo apt upgrade -y
在 Ubuntu 上,如果更新需要重启,就会出现 /var/run/reboot-required 文件。出现时请重启一次服务器。Debian 可能不会创建这个文件,所以内核更新后无论如何都要重启。
2. 创建您自己的用户
日常工作不要使用 root。创建一个有 sudo 权限的独立用户。可以把 deploy 换成任何您喜欢的名字:
sudo adduser deploy
sudo usermod -aG sudo deploy
3. 用 SSH 密钥登录
如果您的电脑上还没有密钥对,请用 ssh-keygen -t ed25519 创建一对。然后把公钥复制到新用户,并测试登录:
ssh-copy-id [email protected]
如果登录时没有提示输入密码,就说明准备好了。Windows 没有 ssh-copy-id。在 PowerShell 中,下面这条命令可以起到同样的作用:
Get-Content $env:USERPROFILE\.ssh\id_ed25519.pub | ssh [email protected] "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
加固 SSH
4. 关闭密码登录和 root 登录
先确认您能用密钥以新用户身份登录。然后查明是哪些文件定义了这些设置。当 OpenSSH 在多个位置找到同一项设置时,会采用它最先读到的值。在 Debian 和 Ubuntu 上,主配置文件的最开头就包含了 /etc/ssh/sshd_config.d/ 文件夹。服务商镜像可能在该文件夹里留有一个开启密码登录的文件。即使您在主文件里写了 no,那个文件里的 yes 仍然生效:
sudo grep -rniE "^\s*(PasswordAuthentication|PermitRootLogin|KbdInteractiveAuthentication)" /etc/ssh/sshd_config /etc/ssh/sshd_config.d/
把输出中每一行生效的设置,在它所在的文件里改成 no:PasswordAuthentication no、PermitRootLogin no、KbdInteractiveAuthentication no。输出中没有出现的设置,请追加到 /etc/ssh/sshd_config 的末尾。然后测试、应用,并检查实际生效的值:
sudo sshd -t && sudo systemctl reload ssh
sudo sshd -T | grep -E "^(passwordauthentication|permitrootlogin|kbdinteractiveauthentication)"
三行都应以 no 结尾。不要关闭当前已打开的会话。先新开一个终端,确认密钥登录可用,再离开。如果还是把自己锁在外面了,请从面板中打开 VNC 控制台。控制台登录不受 SSH 设置影响。
这些设置以后可能悄悄变回去。在服务商面板中的某些操作,比如添加 SSH 密钥或重置密码,可能让服务商的首次启动脚本(cloud-init)在下次启动时再次运行,而该脚本可能会重新开启密码登录。在任何此类操作之后,请再次运行上面的 sshd -T 命令并检查这些值。
收窄对外访问
5. 开启防火墙
在 ufw 中,先放行 SSH,再启用防火墙。顺序反过来,连接就会断开。如果 SSH 运行在 22 以外的端口,请用该端口代替 22:
sudo ufw allow 22/tcp
sudo ufw enable
sudo ufw status verbose
如果要运行 Web 服务器,还要放行 80 和 443 端口。ufw 默认拒绝传入连接。面板里也有防火墙工具。如果使用 Docker,请注意:根据 Docker 文档,您发布的端口会绕过 ufw 规则。对于只需要服务器自己访问的服务,请只在回环地址上发布端口,例如 Docker Compose 文件中的 127.0.0.1:5432:5432。
6. 安装 fail2ban
fail2ban 会在一段时间内封锁不断登录失败的 IP 地址:
sudo apt install -y fail2ban python3-systemd
printf '[sshd]\nenabled = true\nbackend = systemd\nmaxretry = 5\nbantime = 1h\n' | sudo tee /etc/fail2ban/jail.local
sudo systemctl enable fail2ban && sudo systemctl restart fail2ban
sudo fail2ban-client status sshd
在 Seturack 的一键应用服务器上,ufw 已开启,fail2ban 也在运行。如果您安装的是干净的操作系统,请用 sudo ufw status 和 systemctl is-active fail2ban 检查它们的状态。
7. 检查开放的端口
sudo ss -tulpn
这条命令会列出所有正在监听的服务和端口。不需要对外访问的服务,比如数据库和缓存,应该只监听 127.0.0.1。把不需要的服务关掉:sudo systemctl disable --now service-name
长期保持
8. 自动安装安全更新
根据 Ubuntu 文档,unattended-upgrades 软件包通常是预装的,安全更新默认开启。如果缺少,请安装并启用:
sudo apt install -y unattended-upgrades
sudo dpkg-reconfigure -plow unattended-upgrades
自动重启默认是关闭的,所以内核更新后请自己重启服务器。根据服务条款,初始设置完成后保持系统更新是您的责任。
9. 做好备份并测试恢复
在 Seturack,您的服务器每晚都会备份,并保留最近 7 天。这已包含在价格中。在管理标签页中打开备份,就可以查看备份、恢复单个文件,或恢复整台服务器。测试恢复时,请恢复单个文件:恢复整台服务器会替换当前的整个磁盘。大的改动之前创建快照是个好习惯,但快照不是备份。重要数据请另外在服务器之外保存一份。详情请参阅每日备份文章。
10. 加强密码
您的面板账户是通往服务器的钥匙。请为它设置一个很长的、不在其他地方使用的密码,并保存在密码管理器中。第一次从面板复制来的 root 密码,请用 sudo passwd root 修改。给 SSH 私钥设置口令。千万不要把密码或密钥粘贴到支持消息或聊天中。
评论0
暂无评论
成为第一个分享想法的人。
请登录或注册后发表评论。