网上有一些指南介绍了如何在服务器上运行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中设置额外的安全预防措施,以防止这种情况发生?
答案 0 :(得分:0)
我采用的方法是让所有文件都为node:node-developer
。然后在node
用户下启动您的应用。其中node-developer是开发人员的一个组。并将所有文件权限设置为770
编写一个简单的shell脚本,该脚本登录到node
用户并以初始scirpts开始pm2
使用适当的权限设置解决。 Nginx在nginx
用户下运行。如果文件是公开的,请将其设为nginx:nginx
。甚至用户也可以public/../../something
。 Nginx无权访问它。