服务器安全教程:从裸机到基础加固的完整操作流程
刚拿到一台云服务器或VPS时,默认配置通常只适合快速连通,不适合长期暴露在公网。
下面这套流程按“能连上、锁住入口、减少攻击面、持续维护”的顺序展开,适用于常见的 Ubuntu 22.04 / 24.04、Debian 12 和 CentOS Stream 9,命令以 Ubuntu 为主,差异部分会单独说明。
先确认你手上有哪些操作条件
开始之前,先准备好三样东西,缺一样都可能把自己关在服务器外面:
- 服务器公网 IP、初始登录用户名(常见是
root或ubuntu)和密码或初始密钥。 - 一台本地电脑,Windows 可用 PowerShell 或 Xshell,macOS/Linux 直接用终端。
- 云厂商控制台的 VNC 或“远程连接”入口,这是你改错 SSH 配置后唯一的补救通道。
先在本地终端测试连通性:
ssh root@你的服务器IP
能正常进入命令行,说明基础网络和登录方式没问题,再继续后面的加固操作。
第一步:创建普通账号并配置 SSH 密钥
长期直接用 root 远程登录风险很高,一旦密码泄露,攻击者拿到的就是最高权限。
建议先建一个普通用户,并给它配置密钥登录。
在服务器上执行:
adduser deploy
usermod -aG sudo deploy # Debian/Ubuntu
# CentOS Stream 用:usermod -aG wheel deploy
回到本地电脑生成密钥对(如果已有可跳过):
ssh-keygen -t ed25519 -C "deploy@myserver"
把公钥上传到服务器:
ssh-copy-id -i ~/.ssh/id_ed25519.pub deploy@你的服务器IP
上传后测试新账号能否免密登录:
ssh deploy@你的服务器IP
能直接进入且不需要输入密码,说明密钥生效。在确认新账号可以登录之前,不要关闭当前 root 会话。
第二步:收紧 SSH 登录入口
编辑 SSH 配置文件:
sudo nano /etc/ssh/sshd_config
找到并修改以下项,没有的就手动添加:
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
Port 22022
Port 改成非 22 的端口可以减少自动化扫描,但它不是安全的核心,密钥登录才是。
改完先检查语法:
sudo sshd -t
没有输出表示配置语法正确,再重载服务:
sudo systemctl reload ssh # Ubuntu/Debian
# CentOS Stream 用:sudo systemctl reload sshd
验证方式: 新开一个终端窗口,用新端口和新账号登录:
ssh -p 22022 deploy@你的服务器IP
能登录成功,再关闭旧窗口。
如果连不上,立刻通过云控制台的 VNC 进去把配置改回来。
第三步:配置防火墙,只放行必要端口
Ubuntu/Debian 默认用 ufw,CentOS Stream 默认用 firewalld,选你系统自带的那套即可,不要两套同时开。
Ubuntu/Debian:
sudo ufw allow 22022/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable
sudo ufw status verbose
CentOS Stream:
sudo firewall-cmd --permanent --add-port=22022/tcp
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload
sudo firewall-cmd --list-all
执行 enable 或 reload 之前,务必先放行你的 SSH 端口,否则当前连接断开后就再也连不上。
云厂商的安全组也要同步放行相同端口,两层防火墙都通过才真正生效。
第四步:系统更新与基础防护
保持系统补丁最新,能挡掉大量已公开的漏洞利用:
sudo apt update && sudo apt upgrade -y # Ubuntu/Debian
# CentOS Stream 用:sudo dnf upgrade -y
开启自动安全更新(Ubuntu/Debian):
sudo apt install unattended-upgrades -y
sudo dpkg-reconfigure --priority=low unattended-upgrades
如果服务器对外提供 SSH 服务,可以安装 fail2ban 自动封禁多次尝试失败的 IP:
sudo apt install fail2ban -y
sudo systemctl enable --now fail2ban
sudo fail2ban-client status sshd
最后一条命令能看到 Currently banned 和 Total banned 字段,说明防护已经在工作。
容易踩坑的几个地方
- 改完 SSH 不验证就退出:一定保留一个已登录的会话,用新窗口测试成功后再关闭。
- 防火墙和云安全组只配一层:两层都要放行,缺一层就会表现为“端口明明开了却连不上”。
- UFW 和 firewalld 同时开启:规则会互相干扰,只保留系统默认的那一套。
- 只改端口不关密码登录:端口混淆挡不住针对密码的暴力破解,密钥登录才是关键。
- 删除或覆盖
authorized_keys:改权限时用chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys,不要直接删目录。
怎么判断加固真的生效了
做完以上步骤,用这几项检查一遍:
ssh -p 22022 deploy@IP能免密登录,root 直连被拒绝。sudo ufw status或sudo firewall-cmd --list-all显示只放行了必要端口。sudo fail2ban-client status sshd有监控数据。sudo apt list --upgradable没有大量待更新补丁。
四项都符合,说明基础安全配置已经到位。
后续再根据业务需要安装 Web 服务、数据库时,记得同步调整防火墙规则,不要把数据库端口直接暴露到公网。
如果服务器上已经跑了宝塔面板,SSH 加固和面板安全入口、面板 SSL 是两套独立设置,建议都开启;
面板默认端口和 SSH 端口不要设成同一个。