如何为 Node.js 加固 Linux 服务器(适合初学者,逐步指南)
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 或任何后端服务。
祝部署顺利 🚀
欢迎进入 真正的服务器加固 世界。