如何为 Node.js 加固 Linux 服务器(适合初学者,逐步指南)

发布: (2025年12月15日 GMT+8 17:51)
6 min read
原文: Dev.to

Source: Dev.to

🧠 安全哲学(简明解释)

我们遵循三条基本规则:

  • 绝不以 root 身份运行应用
  • 每个应用都有自己的用户
  • 应用只能访问自己的文件

如果攻击者入侵了你的应用,他们 不应该 能够:

  • 安装加密货币挖矿程序
  • 修改系统文件
  • 添加用户
  • 影响其他应用

前提假设

  • Ubuntu 22.04 / 24.04
  • 你可以通过 SSH 登录服务器
  • 你以 root 身份开始(全新云服务器)

步骤 1:创建非 root 管理员用户

为自己创建一个普通用户(示例:dev)。

adduser dev

设置一个强密码,然后允许该用户 在不以 root 登录的情况下 管理系统:

usermod -aG sudo dev

为什么?

  • root SSH 登录很危险
  • 普通用户 + sudo 更安全且可审计

步骤 2:设置 SSH 密钥登录

在你的 本地机器 上生成 SSH 密钥(如果还没有的话):

ssh-keygen -t ed25519

将公钥复制到服务器:

mkdir -p /home/dev/.ssh
nano /home/dev/.ssh/authorized_keys   # 在此粘贴你的公钥

修正权限:

chown -R dev:dev /home/dev/.ssh
chmod 700 /home/dev/.ssh
chmod 600 /home/dev/.ssh/authorized_keys

在电脑上测试:

ssh dev@YOUR_SERVER_IP

如果能够登录,说明可以继续。

步骤 3:锁定 SSH(非常重要)

编辑 SSH 配置:

sudo nano /etc/ssh/sshd_config

确保以下行 存在且未被注释

PermitRootLogin no
PubkeyAuthentication yes

文件底部 添加:

Match all
    PasswordAuthentication no

安全地重新加载 SSH:

sudo systemctl reload ssh

这一步的作用

  • 禁用 root SSH 登录 ❌
  • 禁用密码登录 ❌
  • 必须使用 SSH 密钥 ✅

💡 云服务商的恢复控制台仍然可用——不会被锁在外面。

步骤 4:启用防火墙

启用防火墙之前 先放行必需的端口:

sudo ufw allow OpenSSH
sudo ufw allow 80
sudo ufw allow 443

启用防火墙:

sudo ufw enable

检查状态:

sudo ufw status verbose

为什么?

  • 阻止随机的互联网扫描
  • 只允许你明确需要的端口

步骤 5:全局安装 Node.js

使用官方仓库安装 Node.js(示例:Node 24 LTS):

curl -fsSL https://deb.nodesource.com/setup_24.x | sudo -E bash -
sudo apt install -y nodejs

验证:

node -v
which node

期望输出:

  • /usr/bin/node 属于 root

为什么不使用 nvm?

  • systemd 等系统服务与 nvm 配合不佳
  • 由 root 拥有的 Node 更安全、更可预测

步骤 6:创建专用的应用用户

绝不要以管理员用户运行应用。创建一个 服务用户(示例:svc-nextjs):

sudo adduser \
  --system \
  --no-create-home \
  --group \
  --shell /usr/sbin/nologin \
  svc-nextjs

这意味着

  • 没有 SSH 访问
  • 没有交互式 shell
  • 没有 sudo 权限
  • 仅用于运行该应用

步骤 7:隔离应用文件

为你的应用创建目录:

sudo mkdir -p /var/apps/nextjs
sudo chown -R svc-nextjs:svc-nextjs /var/apps/nextjs
sudo chmod 750 /var/apps/nextjs

以管理员身份测试(应失败):

cd /var/apps/nextjs

以服务用户测试(应成功):

sudo -u svc-nextjs ls /var/apps/nextjs

步骤 8:使用 systemd 运行应用(加固)

创建服务文件:

sudo nano /etc/systemd/system/nextjs.service

粘贴以下内容:

[Unit]
Description=Next.js Application (Hardened)
After=network.target

[Service]
Type=simple
User=svc-nextjs
Group=svc-nextjs
WorkingDirectory=/var/apps/nextjs

ExecStart=/usr/bin/node server.js
Restart=always
RestartSec=3

# Security hardening
NoNewPrivileges=true
ProtectSystem=strict
ProtectHome=true
ReadWritePaths=/var/apps/nextjs
PrivateTmp=true
PrivateDevices=true
ProtectKernelTunables=true
ProtectKernelModules=true
ProtectControlGroups=true
RestrictSUIDSGID=true
RestrictNamespaces=true
LockPersonality=true
MemoryDenyWriteExecute=true
CapabilityBoundingSet=
AmbientCapabilities=
UMask=0077

[Install]
WantedBy=multi-user.target

重新加载 systemd:

sudo systemctl daemon-reload

步骤 9:检查安全评分

运行:

systemd-analyze security nextjs.service

得分在 2–3 左右即为优秀的网页服务安全等级。

这能防御什么

  • 权限提升
  • 系统文件修改
  • 内核滥用
  • 加密货币挖矿
  • 横向移动

即使应用被攻破,操作系统仍保持安全。

步骤 10:最终检查

验证 SSH 配置:

sudo sshd -T | egrep 'permitrootlogin|passwordauthentication|pubkeyauthentication'

期望输出:

permitrootlogin no
passwordauthentication no
pubkeyauthentication yes

检查防火墙状态:

sudo ufw status

你已经完成的工作

  • ✅ 禁用 root SSH 登录
  • ✅ 禁用密码登录
  • ✅ 仅允许密钥访问
  • ✅ 防火墙已启用
  • ✅ 为每个应用使用独立的服务用户
  • ✅ 文件系统隔离
  • ✅ 强化的 systemd 沙箱

这是真正的 生产环境安全,而非理论。

最后建议

  • 一个应用对应一个服务用户
  • 绝不以 root 运行应用
  • 让 systemd 强制安全策略
  • 保持 SSH 简单且锁定

现在你已经拥有一个 安全的 Linux 基础,可以用于 Node.js、Python 或任何后端服务。

祝部署顺利 🚀

欢迎进入 真正的服务器加固 世界。

Back to Blog

相关文章

阅读更多 »