Nodejs、PM2 和 nginx 部署安全性?

Posted

技术标签:

【中文标题】Nodejs、PM2 和 nginx 部署安全性?【英文标题】:Nodejs, PM2, and nginx deploying security? 【发布时间】:2015-08-14 05:03:03 【问题描述】:

网上有一些指南展示了如何让 nodejs 在服务器上运行,但它们往往会跳过一些关于安全性的细节。这是一个有点牵强的问题,我不知道从哪里开始。我想知道是否有人可以澄清以下细节。

首先,我的设置:

我已经使用非 sudo 用户在本地安装了节点,因为使用管理员运行节点是一个坏主意:

/home/appuser
    |--- nodejs/               # node install
            |--- bin/
            |--- include/
            |--- lib/
            |--- share/

    |--- app/
            |--- node_modules/
            |--- public/        # holds html templates, static files , uploaded files
            |--- core/          # holds main app js files
            |--- app.js         # Main Nodejs program
            |--- config.js      # Configuration that holds authentication details, other config stuff
            |--- package.json

我可以通过 pm2 start app.js 使用 PM2 运行应用程序。

我的nginx 配置:

server 
    listen 80;

    server_name mydomainname.com;

    location / 
      proxy_pass http://localhost:8080;
      proxy_http_version 1.1;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection 'upgrade';
      proxy_set_header Host $host;
      proxy_cache_bypass $http_upgrade;
    

我的担忧是:

(1) 应用程序 - 主app/ 应该住在/home/appuser 内吗?

让我的应用程序文件存在于我的非 sudo 用户家中是否有危险?如果是这样,我的应用文件应该放在哪里?

我想知道public/ 是否应该位于不同的位置,而不是与应用程序文件位于同一文件夹中。我不希望应用程序源文件泄露出去,尤其是我的config.js,它包含一些敏感信息,例如我的数据库身份验证详细信息和电子邮件身份验证详细信息。

如果应该移动,/public 相对于app/ 的位置在哪里?

目前app/ 的权限为chown -R appuser:appuser app/,因此用户拥有所有文件。我应该在我的应用程序文件夹上设置其他权限吗?

(2) PM2 - 由于我在本地安装了 nodejs 及其模块,如何在服务器重启后安全地让pm2 重新启动我的 nodejs 应用程序?

我的理解是pm2-init.sh 将存在于/etc/init.d/,如果我使用 sudo 全局安装了pm2,这会自动发生。

我应该如何让pm2 使用我的非 sudo 用户安全地重新启动我的应用程序?

(3) NGINX

如果public/nginx 是这样送达的,我该如何安全地送达:

http://mydomainname.com/public

我的应用程序处理路线,如果找不到路线,应该抛出404。但是有人可以解决这个问题并恶意让我的应用程序或nginx 浏览其他目录吗?

即,在应用目录之外

http://mydomainname.com/../../etc/path/to/secrets

或者,只是在我的应用中本地

http://mydomainname.com/public/../../config.js

如果可能的话,是否可以在 nginx 或 nodejs 中设置额外的安全预防措施来防止这种情况发生?

【问题讨论】:

对于 Stack Overflow 上的实际问题来说,这个问题太多了,如果你想在那个 javascript 聊天室联系我,我会回答他们chat.***.com/rooms/17/javascript 关于启动脚本pm2 startup -u myUsersee here 【参考方案1】:

    我采用的方式是让所有文件都是node:node-developer。然后您在node 用户下启动您的应用程序。其中 node-developer 是开发人员组。并将所有文件权限设置为770

    编写一个简单的 shell 脚本,登录到node 用户并以 init 脚本启动 pm2

    通过使用适当的权限设置解决。 Nginx 在nginx 用户下运行。如果文件是公开的,请将其设为nginx:nginx。甚至用户也可以做public/../../something。 Nginx 将无权访问它。

【讨论】:

以上是关于Nodejs、PM2 和 nginx 部署安全性?的主要内容,如果未能解决你的问题,请参考以下文章

nodejs + pm2 +gitee+Ubuntu 配置一键部署的开发环境

linux上利用pm2和nginx部署项目

Next.js项目部署,使用Nginx和pm2

nodejs项目的部署

如何在 Ubuntu 上使用 pm2 和 Nginx 部署 Node.js 应用

如何在 Ubuntu 上使用 pm2 和 Nginx 部署 Node.js 应用