VPS 生产环境部署的 Linux 服务器安全加固指南

全新部署的 VPS 默认配置存在多个安全隐患:开放了 root SSH 登录、使用密码验证、没有防火墙保护。服务器加固是在生产环境上线前系统性地消除这些漏洞的过程。整个流程不超过 30 分钟,但能为您的服务器提供多年的保护。本指南提供了经过实战验证、可直接复制使用的命令和配置方法。

为什么服务器加固如此关键

互联网上有成千上万的机器人持续扫描 22 端口(SSH 服务)。一台新部署、未经加固的 VPS 在上线后数小时内就会收到数千次登录尝试,每天可能被攻击数万次。根据 Shodan 的数据分析,开启了 root 登录和密码验证的服务器极容易迅速遭到入侵。

即便您的服务器上没有存储敏感数据,攻击者也可能将其用作以下目的:发送垃圾邮件、进行加密货币挖矿、发动 DDoS 攻击,或用作入侵其他目标的跳板。这会导致您的服务器 IP 被列入黑名单、被 ISP 限制、产生额外的流量费用,甚至对其他受害者造成伤害。

第一步 — 首先完整更新系统

这是最关键的第一步。VPS 供应商提供的系统镜像可能已有数周甚至数月的历史,包含已知的安全漏洞。立即应用所有可用的更新,包括安全补丁和系统包。

sudo apt update && sudo apt upgrade -y
sudo apt autoremove -y
sudo apt autoclean

这三个命令分别做以下工作:apt update 刷新软件包列表;apt upgrade -y 自动安装所有可用的升级版本;apt autoremove 删除已过时的依赖;apt autoclean 清理安装缓存,释放磁盘空间。

第二步 — 创建非 root 用户账户

永远不要直接使用 root 账户进行日常操作。创建一个普通用户账户用于日常管理,需要权限时使用 sudo。这样做可以限制意外操作的影响范围,提高安全审计的有效性。

# 创建新用户
sudo adduser deployer

# 将用户加入 sudo 组,获得 sudo 权限
sudo usermod -aG sudo deployer

# 切换到新用户测试
su - deployer

# 验证 sudo 权限正常工作
sudo whoami   # 应该返回 "root"

之后所有操作都使用 deployer 用户进行。系统会提示设置密码(暂时保留,待 SSH 密钥配置完成后可禁用),并可选择填写全名等信息。

第三步 — 配置 SSH 密钥认证

SSH 密钥提供了远强于密码的安全性。Ed25519 算法是现代推荐的选择,相比 RSA 4096 位既更快更强。

在您的本地电脑上生成密钥对

重要:密钥对必须在您的本地电脑上生成,不是在 VPS 上。

# 生成 Ed25519 密钥对
ssh-keygen -t ed25519 -C "[email protected]"

# 系统会问密钥保存位置(默认 ~/.ssh/id_ed25519 — 按 Enter)
# 然后问是否设置 passphrase(密码保护密钥 — 建议设置)
# 系统会生成两个文件:
# - ~/.ssh/id_ed25519 (私钥 — 绝不可分享)
# - ~/.ssh/id_ed25519.pub (公钥 — 可复制到服务器)

将公钥复制到 VPS

您需要在 VPS 上安装公钥,以便用私钥登录。有两种方法:

# 方法1:使用 ssh-copy-id(推荐,最简单)
ssh-copy-id -i ~/.ssh/id_ed25519.pub deployer@YOUR_VPS_IP

# 方法2:手动复制(如果 ssh-copy-id 不可用)
cat ~/.ssh/id_ed25519.pub | ssh deployer@YOUR_VPS_IP \
  "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"

这两种方法都会: 1. 在 VPS 的 ~/.ssh/ 文件夹中创建 authorized_keys 文件 2. 将您的公钥添加到这个文件 3. 设置正确的权限(600 = 仅拥有者可读写)

测试密钥登录

# 用密钥登录 VPS — 应该不再提示输入密码
ssh -i ~/.ssh/id_ed25519 deployer@YOUR_VPS_IP

# 在 VPS 内验证登录成功
whoami   # 应该显示 "deployer"
pwd      # 应该显示 "/home/deployer"

关键提醒:必须在禁用密码验证之前彻底测试 SSH 密钥登录。如果密钥配置出错,禁用密码后会无法登录服务器,只能通过 VPS 控制台(console)进行救援操作。反复测试,直到确保密钥登录完全正常。

第四步 — 强化 SSH 配置

SSH 默认配置包含许多可被利用的弱点。编辑 SSH 配置文件,应用一系列加固措施。

sudo nano /etc/ssh/sshd_config

在编辑器中找到或添加以下配置项。如果该行以 # 开头,删除 # 取消注释;如果行不存在,则在文件末尾添加:

# 禁止 root 用户通过 SSH 直接登录
PermitRootLogin no

# 禁用密码认证,仅允许 SSH 密钥
PasswordAuthentication no
PubkeyAuthentication yes

# 限制尝试次数(防止暴力破解)
MaxAuthTries 3
MaxSessions 5

# 自动断开无活动连接(单位秒)
# ClientAliveInterval 设置多久检查一次;ClientAliveCountMax 设置允许多少次未响应
ClientAliveInterval 300
ClientAliveCountMax 2

# 仅允许特定用户登录(可选,提高安全性)
AllowUsers deployer

# 修改 SSH 端口(可选,但要记住新端口号)
# Port 2222

# 其他加固设置
HostKey /etc/ssh/ssh_host_ed25519_key
Protocol 2
LogLevel VERBOSE
X11Forwarding no

保存退出(Ctrl+X,然后 Y,再 Enter),然后重启 SSH 服务使配置生效:

sudo systemctl restart sshd

关键:重启前再次用另一个终端测试密钥登录,确保可以连接,再关闭原连接。这样即使新配置有问题也不会被锁在外面。

第五步 — 配置 UFW 防火墙

UFW(Uncomplicated Firewall)是 Linux 防火墙的简单管理界面。它提供了易于理解的规则语法,同时减少了配置错误的风险。

# 安装 UFW(通常已预装)
sudo apt install ufw -y

# 设置默认策略:进入流量默认拒绝,出去流量默认允许
sudo ufw default deny incoming
sudo ufw default allow outgoing

# 在启用防火墙前,一定要打开 SSH 端口,否则会被锁在外面!
sudo ufw allow 22/tcp

# 如果前面改了 SSH 端口,这里也要改
# sudo ufw allow 2222/tcp

# 允许网页服务的标准端口(如果运行 web 服务器)
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp

# 启用防火墙
sudo ufw enable

# 查看防火墙状态和所有规则
sudo ufw status verbose

# 输出示例应该显示:
# Status: active
# To                         Action      From
# --                         ------      ----
# 22/tcp                     ALLOW       Anywhere
# 80/tcp                     ALLOW       Anywhere
# 443/tcp                    ALLOW       Anywhere

使用 UFW 应用程序配置文件

UFW 可以直接使用预定义的应用程序配置文件,而不需要手动指定端口号:

# 查看所有可用的应用程序配置文件
sudo ufw app list

# 使用配置文件名添加规则(示例)
sudo ufw allow 'OpenSSH'      # 等同于 allow 22/tcp
sudo ufw allow 'Nginx Full'   # 允许 80 和 443
sudo ufw allow 'Apache Full'  # 允许 80 和 443

# 查看配置文件详情
sudo ufw app info 'Nginx Full'

第六步 — 安装和配置 Fail2Ban

Fail2Ban 监控系统日志,自动检测恶意的登录尝试,并暂时 ban 掉这些攻击 IP。它可以显著减少暴力破解攻击的成功率。

# 安装 Fail2Ban
sudo apt install fail2ban -y

# 启用并启动服务
sudo systemctl enable fail2ban
sudo systemctl start fail2ban

创建本地配置文件

不要直接编辑 /etc/fail2ban/jail.conf(这是默认配置)。应该创建本地覆盖文件 jail.local 来自定义配置,这样系统更新时原文件会保留。

sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo nano /etc/fail2ban/jail.local

找到 [sshd] 部分,确保以下设置存在:

[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 3         # 3 次失败后 ban
bantime = 3600       # ban 1 小时(单位秒)
findtime = 600       # 在 10 分钟内的失败次数计入
ignoreip = 127.0.0.1/8   # 本地回环地址不 ban

保存后重启 Fail2Ban:

sudo systemctl restart fail2ban

# 查看 SSH 的 ban 状态
sudo fail2ban-client status sshd

# 输出示例:
# Status for the jail: sshd
# |- Filter set: sshd
# |- Currently failed: 2
# |- Currently banned: 1
# `- Total banned: 42

定期检查 Fail2Ban 的日志:

# 查看实时日志
sudo journalctl -u fail2ban -f

# 查看历史日志
cat /var/log/fail2ban.log | grep Ban

第七步 — 启用自动安全更新

手动定期应用安全补丁容易被遗忘。unattended-upgrades 可以自动下载和应用系统更新,保持服务器的安全性。

# 安装自动更新工具
sudo apt install unattended-upgrades -y

# 使用图形界面配置
sudo dpkg-reconfigure --priority=low unattended-upgrades

# 系统会问是否启用自动更新,选择 "Yes"

配置自动重启(可选但推荐)

某些更新需要重启才能生效。您可以配置自动重启时间:

sudo nano /etc/apt/apt.conf.d/50unattended-upgrades

# 找到以下行并取消注释(删除行前的 //)
// Unattended-Upgrade::Automatic-Reboot "false";
// Unattended-Upgrade::Automatic-Reboot-Time "02:00";

# 改为
Unattended-Upgrade::Automatic-Reboot "true";
Unattended-Upgrade::Automatic-Reboot-Time "02:00";

这将在午夜 2 点自动安装更新并重启(选择在您的业务不活跃时段)。

第八步 — 删除不必要的服务

精简运行的服务可以减少攻击面。审计并关闭不使用的服务。

# 查看当前运行的所有服务
sudo systemctl list-units --type=service --state=running

# 禁用不需要的服务(示例)
sudo systemctl disable --now snapd          # Ubuntu snap 应用
sudo systemctl disable --now avahi-daemon   # 网络发现
sudo systemctl disable --now cups           # 打印服务(如果不需要)
sudo systemctl disable --now isc-dhcp-server # DHCP 服务

# 查看所有打开的端口
sudo ss -tlnp

第九步 — 系统级网络加固(sysctl)

Linux 内核参数可以调整网络行为,防止某些类型的攻击。这些设置对所有网络接口生效。

sudo nano /etc/sysctl.d/99-hardening.conf

添加以下配置:

# 启用反向路径过滤 — 防止 IP 欺骗
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1

# 禁用 ICMP 重定向 — 防止路由表篡改
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv6.conf.all.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0

# 启用 SYN Cookies — 防止 SYN flood 攻击
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 2048
net.ipv4.tcp_synack_retries = 2

# 禁用源路由 — 防止源路由欺骗
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
net.ipv6.conf.all.accept_source_route = 0

# 启用日志记录对可疑数据包
net.ipv4.conf.all.log_martians = 1
net.ipv4.conf.default.log_martians = 1

# 忽略 ping 请求(ping 扫描)
net.ipv4.icmp_echo_ignore_all = 0

# 增加打开文件描述符的限制
fs.file-max = 65535

# 增加连接跟踪限制,防止连接表溢出
net.ipv4.ip_conntrack_max = 2000000

保存并应用这些设置:

sudo sysctl -p /etc/sysctl.d/99-hardening.conf

# 输出应该显示所有设置值已被加载

第十步 — 使用 Lynis 进行全面安全审计

Lynis 是一个全面的 Linux 安全审计工具。它扫描系统配置,检测潜在的安全问题,并提供改进建议。Lynis 会给出 0-100 的加固指数评分。

# 安装 Lynis
sudo apt install lynis -y

# 执行完整的系统审计
sudo lynis audit system

# 输出会显示大量的检查项和建议
# 最后会显示最终的加固指数评分(Hardening Index)

Lynis 审计过程会检查:

完成本指南的所有步骤后,Lynis 评分应该在 65-80 分之间。继续参考 Lynis 的建议进一步提升评分。

第十一步 — 监控和日志管理

即使加固完美,监控系统活动对于及时发现异常也至关重要。

# 查看最近的登录尝试
sudo tail -f /var/log/auth.log

# 查看 SSH 相关的日志
sudo grep sshd /var/log/auth.log | tail -20

# 使用 journalctl 查看系统日志
sudo journalctl -u sshd -n 50

# 配置日志轮转防止日志文件过大
sudo nano /etc/logrotate.d/rsyslog

第十二步 — AppArmor 和 SELinux(高级)

这些是强制访问控制 (MAC) 系统,提供额外的沙箱隔离。Ubuntu 默认使用 AppArmor,CentOS/RHEL 使用 SELinux。

# 检查 AppArmor 状态
sudo aa-status

# 启用所有已禁用的配置文件
sudo aa-enforce /etc/apparmor.d/*

# 重启 AppArmor
sudo systemctl restart apparmor

# 查看 AppArmor 日志
sudo tail -f /var/log/syslog | grep apparmor

加固清单和验证

项目 重要性 所需时间 验证命令
系统更新 关键 2-5分钟 apt list --upgradable
创建非root用户 关键 2分钟 id deployer
SSH密钥 + 禁密码 关键 5-10分钟 ssh -i KEY user@host
UFW防火墙 高 5分钟 ufw status verbose
Fail2Ban 高 5分钟 fail2ban-client status sshd
自动安全更新 高 2分钟 systemctl status unattended-upgrades
sysctl加固 中 5分钟 sysctl net.ipv4.conf.all.rp_filter
Lynis审计 中 10分钟 lynis audit system

成功标志:完成以上步骤后,您的 VPS 应该满足以下条件:

  • 仅允许 SSH 密钥登录(无密码)
  • 禁用了 root 直接登录
  • UFW 防火墙已激活
  • Fail2Ban 正在运行并守护 SSH
  • 自动安全更新已启用
  • 系统参数已强化
  • Lynis 评分 ≥65 分
完成这些步骤后,您的 VPS 安全性将远高于大多数未经加固的服务器。

定期维护建议

加固完成并不是终点。安全是一个持续的过程,需要定期的监控和维护。

需要一台可立即加固的 VPS?

AsiaGB 提供完整的 root 权限和标准的 Linux 系统,支持 Ubuntu 和 Debian,开箱即可执行本指南中的所有加固步骤。VPS 月租仅从 500 泰铢起。

查看 VPS 套餐