Nodejs,PM2和nginx部署安全性?

时间:2015-05-31 19:13:03

标签: node.js security nginx production-environment pm2

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

首先,我的设置:

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

    /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用户安全地重新启动我的应用程序?{/ p>

(3)NGINX

  • 如果pm2提供public/,如果按照以下方式提供服务,我该如何安全地提供服务:

    nginx
  • 我的应用处理路由,如果找不到路由,则应该抛出http://mydomainname.com/public 。但有人可以解决这个问题并恶意制作我的应用程序或404浏览其他目录吗?

    即,在app目录之外

    nginx

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

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

    是否可以在http://mydomainname.com/public/../../config.js 或nodejs中设置额外的安全预防措施,以防止这种情况发生?

1 个答案:

答案 0 :(得分:0)

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

  2. 编写一个简单的shell脚本,该脚本登录到node用户并以初始scirpts开始pm2

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