2

网上有一些指南展示了如何让 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我可以通过做来运行应用程序pm2 start app.js

    我的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/,如果我pm2使用 sudo 全局安装,这会自动发生。

    我应该如何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
    

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

4

1 回答 1

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

  2. 编写一个简单的 shell 脚本,登录到node用户并启动 pm2 作为 init scirpts

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

于 2015-05-31T20:41:34.823 回答