上线优惠价:每个套餐的价格都比我们追踪的最便宜的离岸竞争对手低 30%。 查看价格对比所有套餐价格均比最便宜的离岸主机服务商低 30%

知识库 · 安全

Linux 服务器加固:最初的一小时

Linux 服务器首小时加固清单:系统更新、sudo 用户、SSH 密钥、防火墙、fail2ban、时间同步、Lynis 审计、备份和事件响应。

更新于 阅读约 7 分钟

本指南要点

  • 在做任何其他事情之前,先为系统打好补丁,并开启自动安全更新。
  • 以 sudo 用户身份使用 SSH 密钥登录,然后禁用 root 登录和密码登录。
  • 使用 ufw 或 nftables 只放行您需要的端口,并让 fail2ban 拦截暴力破解尝试。
  • 如果服务器遭到入侵,请控制事态、保全证据、轮换所有密钥和凭据,并从干净的模板重建。
安全12 个章节
全部指南
本页内容
  1. 安装更新并开启自动安全更新
  2. 创建 sudo 用户
  3. 使用 SSH 密钥登录
  4. 禁用密码登录和 root 登录
  5. 更改 SSH 端口(可选)
  6. 设置防火墙
  7. 使用 fail2ban 拦截暴力破解
  8. 保持时钟同步
  9. 使用 Lynis 进行审计
  10. 提前做好备份
  11. Tor 中继与 VPN 服务器注意事项
  12. 如果服务器遭到入侵

新服务器上线后不久就会遭到自动化的登录尝试。请在最初的一小时内按顺序完成本清单。命令适用于 Debian 和 Ubuntu,AlmaLinux 和 Rocky Linux 有所不同之处会另行说明。在创建 sudo 用户之前,请以 root 身份运行这些命令,并将 alice 替换为您自己的用户名,将 SERVER_IP 替换为您服务器的地址。

安装更新并开启自动安全更新

apt update
apt full-upgrade -y
apt install -y unattended-upgrades
dpkg-reconfigure -plow unattended-upgrades

在对话框中选择“Yes”。该操作会写入 /etc/apt/apt.conf.d/20auto-upgrades,此后安全更新将每天自动安装。如需在更新要求重启时(例如安装了新内核)自动重启,请在 /etc/apt/apt.conf.d/50unattended-upgrades 中设置以下几行:

Unattended-Upgrade::Automatic-Reboot "true";
Unattended-Upgrade::Automatic-Reboot-Time "04:00";

在 AlmaLinux 和 Rocky Linux 上,安装 dnf-automatic,在 /etc/dnf/automatic.conf 中设置 upgrade_type = security 和 apply_updates = yes,然后启用其定时器:

dnf upgrade --refresh -y
dnf install -y dnf-automatic
systemctl enable --now dnf-automatic.timer

如果内核已更新,请重启。

创建 sudo 用户

以 root 身份工作时,每一个输入错误都会变成影响整个系统的更改,而且 root 是攻击者最先尝试的账户。请创建一个拥有 sudo 权限的个人账户:

apt install -y sudo
adduser alice
usermod -aG sudo alice

在 AlmaLinux 和 Rocky Linux 上,管理员组名为 wheel:

useradd -m -G wheel alice
passwd alice

使用 SSH 密钥登录

在您的电脑上创建一个受密码短语保护的密钥对,将公钥复制到新账户,然后用它登录,并检查 sudo 是否可用:

ssh-keygen -t ed25519 -C "alice laptop"
ssh-copy-id alice@SERVER_IP
ssh alice@SERVER_IP
sudo -v

在 Windows 上,请使用快速入门指南中的 PowerShell 命令代替 ssh-copy-id。

禁用密码登录和 root 登录

只有在新用户的密钥登录和 sudo 都正常可用后,才可继续。创建 /etc/ssh/sshd_config.d/00-hardening.conf,写入以下内容:

PermitRootLogin no
PasswordAuthentication no
KbdInteractiveAuthentication no
PubkeyAuthentication yes
MaxAuthTries 3
X11Forwarding no
AllowUsers alice

00- 前缀很重要。对于每个选项,sshd 会采用它读到的第一个值,而它会先按字母顺序读取 sshd_config.d 中的文件,再读取 sshd_config 的其余部分。因此,您的文件会优先于云镜像上的 50-cloud-init.conf(该文件可能会重新开启密码登录),也会优先于 Red Hat 系发行版上的 01-permitrootlogin.conf。AllowUsers 会拒绝所有未列出的账户。请检查语法以及将要生效的值,然后重启 SSH:

sshd -t
sshd -T | grep -Ei 'permitrootlogin|passwordauthentication|kbdinteractive|allowusers'
systemctl restart ssh

在 AlmaLinux 和 Rocky Linux 上,该服务名为 sshd。现有会话会保持连接。请从新的终端确认 alice 仍能登录,并且 root 登录会被拒绝。

更改 SSH 端口(可选)

非标准端口可以消除日志中大部分来自机器人的噪音,但它并不是安全边界:扫描仍然能找到它,每条 ssh、scp 和 rsync 命令都需要指定端口,而且有些网络会封锁不常见的端口。如果只允许密钥登录,继续使用 22 端口也没有问题。如果仍要更改,请将 Port 2222 添加到您的加固配置文件中,开放该端口并重启 SSH:

ufw allow 2222/tcp
systemctl restart ssh

Ubuntu 24.04 通过 systemd 套接字启动 SSH,因此在该系统上请用以下两条命令代替重启命令:

systemctl daemon-reload
systemctl restart ssh.socket

在 AlmaLinux 和 Rocky Linux 上,还必须让 SELinux 和 firewalld 放行新端口:

dnf install -y policycoreutils-python-utils
semanage port -a -t ssh_port_t -p tcp 2222
firewall-cmd --permanent --add-port=2222/tcp
firewall-cmd --reload
systemctl restart sshd

在删除 22 端口的规则之前,请先从新的终端测试新端口:

ssh -p 2222 alice@SERVER_IP

设置防火墙

Debian 和 Ubuntu 上的 ufw

apt install -y ufw
ufw default deny incoming
ufw default allow outgoing
ufw limit 22/tcp
ufw allow 443/tcp
ufw enable
ufw status verbose

limit 会放行 SSH,但会封锁在 30 秒内发起六个或更多连接的地址。如果您更改过 SSH 端口,请改用自己的端口,并且只开放您的服务所需的端口。ufw 会自动添加对应的 IPv6 规则。

使用 nftables

如需直接控制,请将您自己的规则集写入 /etc/nftables.conf。以下规则集会丢弃所有入站流量,但回复流量、环回流量、ICMP(IPv6 正常工作所必需)、SSH 和 HTTPS 除外:

#!/usr/sbin/nft -f
flush ruleset
table inet filter {
  chain input {
    type filter hook input priority 0; policy drop;
    ct state established,related accept
    ct state invalid drop
    iif "lo" accept
    meta l4proto { icmp, ipv6-icmp } accept
    tcp dport { 22, 443 } accept
  }
}

检查该文件,然后立即加载,并设置为每次启动时自动加载:

nft -c -f /etc/nftables.conf
systemctl enable --now nftables

ufw 和您自己的 nftables 文件只能二选一,不要同时使用。flush ruleset 还会删除其他软件创建的规则,因此不要在 Docker 主机上使用它。AlmaLinux 和 Rocky Linux 默认启用 firewalld;可按如下方式开放服务:

firewall-cmd --permanent --add-service=https
firewall-cmd --reload

使用 fail2ban 拦截暴力破解

apt install -y fail2ban python3-systemd

创建 /etc/fail2ban/jail.local。将您自己的 IP 填入 ignoreip,以免把自己封禁,并将 port 设置为您的 SSH 端口:

[DEFAULT]
backend = systemd
bantime = 1h
ignoreip = 127.0.0.1/8 ::1 YOUR_IP

[sshd]
enabled = true
port = 22
systemctl enable fail2ban
systemctl restart fail2ban
fail2ban-client status sshd

systemd 后端读取的是 systemd 日志,因此在没有 /var/log/auth.log 的全新 Debian 12 和 13 系统上同样适用。要解除封禁:

fail2ban-client set sshd unbanip IP_ADDRESS

在 AlmaLinux 和 Rocky Linux 上,fail2ban 由 EPEL 提供:

dnf install -y epel-release
dnf install -y fail2ban

在仅允许密钥登录的 SSH 上,fail2ban 主要用于减少日志噪音;对于接受密码登录的服务,它的作用更大。

保持时钟同步

timedatectl set-ntp true
timedatectl set-timezone UTC
timedatectl

确认输出中有 System clock synchronized: yes。如果 set-ntp 报告不支持 NTP,请安装时间同步客户端,然后重新运行该命令:

apt install -y systemd-timesyncd

AlmaLinux 和 Rocky Linux 默认启用 chrony。准确的时间对 TLS、一次性密码、日志关联分析和 Tor 都很重要;使用 UTC 可以让多台服务器的日志便于相互比对。

使用 Lynis 进行审计

apt install -y lynis
lynis audit system

Lynis 会检查数百项设置,并输出警告、建议和加固指数。详细信息会写入 /var/log/lynis.log 和 /var/log/lynis-report.dat。请把结果当作待办清单,而不是一味追求最高分的评分。在 AlmaLinux 和 Rocky Linux 上,Lynis 位于 EPEL 中。

提前做好备份

加固可以降低风险;备份则能让事件发生后得以恢复。在 VPS 上,完成本清单后请创建一个快照,并按照 VPS 快照与异地备份中的说明,使用 restic 或 Borg 设置加密的异地备份。请将备份仓库设为仅追加模式,这样即使入侵者进入服务器,也无法删除您的历史备份。

Tor 中继与 VPN 服务器注意事项

Tor 中继

  • 我们的运行 Tor 中继、网桥或洋葱服务指南提供了每种角色的完整设置步骤。
  • 非出口中继和网桥只在 Tor 网络内部传递加密流量;请在 /etc/tor/torrc 中写入 ExitRelay 0,将这一点明确下来。
  • 出口中继则不同:它们发往网站的流量看起来来自您的 IP,并会招来滥用举报。运行出口中继之前,请阅读可接受使用政策。出站 25 端口默认关闭。
  • 从 Tor 项目的软件仓库安装 tor,并让 unattended-upgrades 自动更新它;Tor 中继指南给出了适用于 Debian 和 Ubuntu 的确切 origin 配置行。
  • 在防火墙中只开放 ORPort,并将任何 ControlPort 或指标端口都限制在 localhost 上。
  • 带宽在合理使用范围内不限流量。如果预计会有持续的大流量,请在 torrc 中使用 RelayBandwidthRate 和 RelayBandwidthBurst(或 AccountingMax)设置上限。
  • 请用一台单独的服务器运行中继:中继地址是公开的,许多服务都会封锁这些地址。

WireGuard VPN 服务器

从密钥到手机客户端的完整设置步骤,请参阅如何使用 WireGuard 自建 VPN。简而言之:开放 WireGuard 端口,启用 IP 转发,只允许从隧道到公网接口的转发(可用 ip -br addr 查询接口名称),并确保配置文件仅 root 可读:

ufw allow 51820/udp
echo 'net.ipv4.ip_forward=1' > /etc/sysctl.d/99-wireguard.conf
sysctl --system
ufw route allow in on wg0 out on eth0
chmod 600 /etc/wireguard/wg0.conf
  • 为隧道的地址段添加 NAT;如果需要路由 IPv6,还要启用 IPv6 转发。
  • VPN 用户的流量会通过您服务器的 IP 发出。根据可接受使用政策,他们发送的垃圾邮件、扫描和攻击都视为来自您的服务器,因此请只向您信任的人提供访问权限。
  • WireGuard 本身不保留连接日志。如果您向用户承诺不记录日志,还请检查 journald 和防火墙的日志记录。

如果服务器遭到入侵

典型迹象:不明进程占用 CPU、出现意料之外的出站流量、出现新的账户或 SSH 密钥,或者收到我们发出的滥用通知。

  1. 控制事态。首先阻止向外发起的攻击:在防火墙中阻断出站流量,或关闭服务器。根据可接受使用政策中的零容忍规则,对于从我们网络发起的攻击,我们会立即采取行动,即使服务器是被劫持的也不例外。
  2. 保全证据。在 VPS 上,请在做任何更改之前创建快照,并将日志复制到服务器之外。
  3. 展开调查:使用下面的命令检查登录记录、开放端口、进程、cron 任务、服务、root 的 SSH 密钥,以及用户 ID 为 0 的账户。
  4. 轮换服务器上存放过的所有密钥和凭据:密码、SSH 密钥(请在干净的机器上生成新密钥)、访问令牌、数据库密码和 TLS 私钥。
  5. 重建。从干净的模板重装系统,用入侵发生之前的备份恢复数据,执行本清单中的步骤,并堵上攻击者利用的漏洞,例如过时的插件、弱密码或暴露在外的服务。
  6. 告知我们。如果是独立服务器或 GPU 服务器,请通过工单回复我们的滥用通知,说明您发现并修复了哪些问题,或者请求帮助。
last -a
ss -tulpn
ps auxf
ls -la /etc/cron.d /var/spool/cron
systemctl list-units --type=service --state=running
cat /root/.ssh/authorized_keys
awk -F: '$3 == 0' /etc/passwd
某个步骤遇到困难?

独立服务器和 GPU 服务器客户可在客户中心提交工单,注明服务器的 IP 地址以及已尝试过的操作。首次回复目标:12 小时内。其他服务器请使用其页面上的服务器操作、指南和网络状态页面。

欢迎回来

登录以管理您的服务器和余额。

无需 KYC由 Cloudflare Turnstile 提供人机验证无跟踪