CentOS系统中Node.js的安全设置
导读:CentOS系统中Node.js的安全设置指南 一、系统级基础安全加固 保持系统与软件包最新 定期执行sudo yum update -y更新CentOS系统及所有软件包,修复已知安全漏洞,降低被攻击风险。 禁用root远程登录 编辑/e...
CentOS系统中Node.js的安全设置指南
一、系统级基础安全加固
- 保持系统与软件包最新
定期执行sudo yum update -y
更新CentOS系统及所有软件包,修复已知安全漏洞,降低被攻击风险。 - 禁用root远程登录
编辑/etc/ssh/sshd_config
文件,将PermitRootLogin
设置为no
,禁止root用户通过SSH远程登录;创建普通用户(如myuser
)并配置密码,通过sudo
执行管理任务,减少潜在攻击面。 - 配置SSH登录限制
在/etc/ssh/sshd_config
中设置AllowUsers
(如AllowUsers myuser
)限制允许登录的用户;启用公钥认证(PubkeyAuthentication yes
)并禁用密码认证(PasswordAuthentication no
);修改SSH默认端口(如Port 2222
),降低暴力破解概率;执行sudo systemctl restart sshd
使配置生效。 - 使用防火墙限制网络流量
启用firewalld
(sudo systemctl start firewalld & & sudo systemctl enable firewalld
),仅允许必要端口(如SSH端口2222、Node.js应用端口3000)通过:
或使用sudo firewall-cmd --permanent --zone=public --add-port=2222/tcp sudo firewall-cmd --permanent --zone=public --add-port=3000/tcp sudo firewall-cmd --reload
iptables
配置类似规则并保存。 - 启用SELinux(可选但推荐)
若系统未启用SELinux,可通过sudo yum install policycoreutils-python-utils
安装工具,执行sudo setenforce 1
开启强制模式,限制进程权限,提升系统安全性。
二、Node.js应用层安全配置
- 避免使用root运行应用
始终以普通用户(如myuser
)启动Node.js应用(如npm start
或node app.js
),避免应用以root权限运行导致的安全风险(如进程被入侵后控制整个系统)。 - 管理依赖项安全
- 定期运行
npm audit
检查项目依赖项中的已知漏洞,按提示修复; - 使用
npm outdated
查看过时的依赖,升级到最新稳定版本; - 在
package.json
中固定依赖版本(如"express": "4.17.1"
),避免意外升级引入漏洞。
- 定期运行
- 配置安全HTTP头
使用helmet
中间件设置安全HTTP头,防范XSS、点击劫持等常见Web攻击。示例代码:const express = require('express'); const helmet = require('helmet'); const app = express(); app.use(helmet()); // 默认开启多个安全头(如Content-Security-Policy、X-Frame-Options)
- 实施速率限制
使用express-rate-limit
中间件限制请求速率,防止DDoS攻击或暴力破解。示例配置:const rateLimit = require('express-rate-limit'); const limiter = rateLimit({ windowMs: 15 * 60 * 1000, // 15分钟 max: 100 // 每个IP限制100次请求 } ); app.use(limiter); // 应用于所有请求
- 验证用户输入
使用validator
等库对所有用户输入(如表单、URL参数)进行验证,防止SQL注入、XSS攻击。示例代码:const validator = require('validator'); const email = 'foo@bar.com'; if (!validator.isEmail(email)) { throw new Error('Invalid email address'); } const userInput = '< script> alert("xss")< /script> '; const safeInput = validator.escape(userInput); // 转义HTML特殊字符
- 使用HTTPS加密通信
- 生成SSL证书(可使用Let’s Encrypt的
certbot
工具):sudo yum install certbot python2-certbot-nginx sudo certbot --nginx -d yourdomain.com
- 配置Node.js应用监听443端口并使用证书(或通过Nginx反向代理处理HTTPS);
- 强制所有HTTP请求重定向到HTTPS,确保数据传输加密。
- 生成SSL证书(可使用Let’s Encrypt的
- 安全会话管理
- 使用
express-session
中间件管理会话,设置secret
(用于签名会话ID)、resave
(是否强制保存未修改的会话)、saveUninitialized
(是否保存未初始化的会话)选项; - 将会话数据存储在Redis等外部存储中(而非内存),避免应用重启时会话丢失。示例配置:
const session = require('express-session'); const RedisStore = require('connect-redis')(session); app.use(session({ secret: 'your-secret-key', resave: false, saveUninitialized: false, store: new RedisStore({ host: 'localhost', port: 6379 } ) } ));
- 使用
- 错误处理与日志记录
- 捕获应用中的未处理异常(如
uncaughtException
)和未处理的Promise rejection(如unhandledRejection
),记录错误日志(如使用winston
或morgan
),避免向用户泄露敏感信息(如数据库密码、服务器路径)。示例代码:process.on('uncaughtException', (err) => { console.error('Uncaught Exception:', err.stack); // 发送错误日志到监控系统(如ELK、Sentry) process.exit(1); // 强制退出进程,防止应用处于不稳定状态 } ); process.on('unhandledRejection', (reason, promise) => { console.error('Unhandled Rejection at:', promise, 'reason:', reason); } );
- 捕获应用中的未处理异常(如
三、额外安全实践
- 使用NVM管理Node.js版本
通过nvm
(Node Version Manager)安装和管理Node.js版本,方便切换版本并获取最新的安全补丁。安装命令:curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash source ~/.bashrc nvm install 18.17.1 // 安装指定版本 nvm use 18.17.1 // 切换到该版本
- 配置环境变量管理敏感信息
使用dotenv
库加载.env
文件中的环境变量,将敏感信息(如数据库密码、API密钥)存储在环境变量中,而非代码中。示例步骤:- 安装
dotenv
:npm install dotenv
; - 创建
.env
文件:DB_PASSWORD=your_password
; - 在代码中加载:
require('dotenv').config(); const dbPassword = process.env.DB_PASSWORD;
。
- 安装
- 监控与日志分析
使用morgan
记录HTTP请求日志(如app.use(morgan('combined'))
),结合journalctl
(sudo journalctl -u node-app -f
)监控应用日志,及时发现异常行为(如大量404请求、异常POST请求)。
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: CentOS系统中Node.js的安全设置
本文地址: https://pptw.com/jishu/725214.html