CentOS系统中Node.js的安全设置指南
sudo yum update -y更新CentOS系统及所有软件包,修复已知安全漏洞,降低被攻击风险。/etc/ssh/sshd_config文件,将PermitRootLogin设置为no,禁止root用户通过SSH远程登录;创建普通用户(如myuser)并配置密码,通过sudo执行管理任务,减少潜在攻击面。/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配置类似规则并保存。sudo yum install policycoreutils-python-utils安装工具,执行sudo setenforce 1开启强制模式,限制进程权限,提升系统安全性。myuser)启动Node.js应用(如npm start或node app.js),避免应用以root权限运行导致的安全风险(如进程被入侵后控制整个系统)。npm audit检查项目依赖项中的已知漏洞,按提示修复;npm outdated查看过时的依赖,升级到最新稳定版本;package.json中固定依赖版本(如"express": "4.17.1"),避免意外升级引入漏洞。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特殊字符
certbot工具):sudo yum install certbot python2-certbot-nginx
sudo certbot --nginx -d yourdomain.com
express-session中间件管理会话,设置secret(用于签名会话ID)、resave(是否强制保存未修改的会话)、saveUninitialized(是否保存未初始化的会话)选项;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 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请求)。