Linux 使用端口80(Ubuntu/Linode)运行Node.js的最佳实践
我正在一个Linux 使用端口80(Ubuntu/Linode)运行Node.js的最佳实践,linux,node.js,security,web-applications,configuration,Linux,Node.js,Security,Web Applications,Configuration,我正在一个云Linux节点上设置我的第一个Node.js服务器,我对Linux admin的细节相当陌生。(顺便说一句,我不想同时使用Apache。) 所有内容都已正确安装,但我发现,除非使用根登录名,否则无法通过节点侦听端口80。但是,出于安全原因,我不希望将其作为root运行 以下方面的最佳实践是什么: 为节点设置良好的权限/用户,使其安全/沙盒 允许在这些限制条件下使用端口80 启动节点并自动运行它 处理发送到控制台的日志信息 任何其他一般维护和安全问题 我是否应该将端口80通信转发到其他
云Linux节点上设置我的第一个Node.js
服务器,我对Linux admin
的细节相当陌生。(顺便说一句,我不想同时使用Apache。)
所有内容都已正确安装,但我发现,除非使用根登录名
,否则无法通过节点侦听端口80
。但是,出于安全原因,我不希望将其作为root运行
以下方面的最佳实践是什么:
为节点设置良好的权限/用户,使其安全/沙盒
允许在这些限制条件下使用端口80
启动节点并自动运行它
处理发送到控制台的日志信息
任何其他一般维护和安全问题
我是否应该将端口80通信转发到其他侦听端口
谢谢端口80
我在云实例上所做的是使用以下命令将端口80重定向到端口3000:
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3000
然后在端口3000上启动Node.js。对端口80的请求将映射到端口3000
您还应该编辑/etc/rc.local
文件,并添加该行减去sudo
。这将在机器启动时添加重定向。您不需要在/etc/rc.local
中使用sudo
,因为那里的命令在系统引导时以root
的形式运行
日志
使用该模块启动Node.js。它将确保在崩溃时重新启动,并将控制台日志重定向到一个文件
开机启动
将Node.js启动脚本添加到为端口重定向编辑的文件中,/etc/rc.local
。这将在系统启动时运行Node.js启动脚本
数字海洋和其他VPS
这不仅适用于Linode,也适用于Digital Ocean、AWS EC2和其他VPS提供商。然而,在基于RedHat的系统上,对于端口80(这是最初的问题),Daniel完全正确。我最近转到了https
,不得不从iptables
切换到管理SSL证书的轻型nginx代理。我发现了一个关于如何处理这个问题的有用的方法。基本上我
- 通过
- 从(我碰巧使用)处获得实际证书
-
- 并在我的nginx
example_ssl.conf
文件中链接到它(和未注释的东西,去掉名称中的“example”…)
希望这能帮别人省去一些麻烦。我确信有一种纯粹的节点方式可以做到这一点,但nginx很快,而且很有效。为安全用户提供使用端口80的权限
请记住,我们不希望以root用户身份运行应用程序,但有一个问题:您的安全用户没有使用默认HTTP端口(80)的权限。您的目标是能够发布一个网站,访问者可以通过导航到一个易于使用的URL,如http://ip:port/
不幸的是,除非您以root用户身份登录,否则通常必须使用类似http://ip:port
-其中端口号>1024
很多人被困在这里,但解决办法很简单。有几个选择,但这是我喜欢的。键入以下命令:
sudo apt-get install libcap2-bin
sudo setcap cap_net_bind_service=+ep `readlink -f \`which node\``
现在,当您告诉节点应用程序希望它在端口80上运行时,它不会抱怨
选中此项,在绑定到端口80(或443)后删除根权限。
这允许端口80/443保持受保护,同时仍然阻止您以根用户身份提供请求:
function drop_root() {
process.setgid('nobody');
process.setuid('nobody');
}
使用上述功能的完整工作示例:
var process = require('process');
var http = require('http');
var server = http.createServer(function(req, res) {
res.write("Success!");
res.end();
});
server.listen(80, null, null, function() {
console.log('User ID:',process.getuid()+', Group ID:',process.getgid());
drop_root();
console.log('User ID:',process.getuid()+', Group ID:',process.getgid());
});
查看更多详细信息。谢谢你的回答,很好,切中要害。顺便说一句,在Ubuntu上,它是/etc/rc.local,-i eth0”标志通常是虚拟专用服务器的一个问题。根据需要替换eth0。如果我将Node.js启动脚本添加到/etc/rc.local
,它是否会在系统引导时作为根目录执行?这将破坏端口80重定向的目的。请注意,要使端口重定向正常工作,目标端口也必须是防火墙上的opne。WRT在启动时启动一个节点实例,我们只需使用发行版的init脚本/systemd文件,允许您指定一个用户。这是更好、更简单的答案。此外,在这里添加了详细的答案:像NGINX这样的web服务器如何在端口80上运行?它也有类似的功能吗?@Eric Andrewlewis:我会说这要看情况而定。在非根模式下运行服务器时,将显示此错误。如果您以root用户身份运行Nginx服务器,该怎么办!另外,如果以普通用户身份运行并出现错误。运行以上命令以授予访问端口的安全权限。也指
sudo apt-get install libcap2-bin
sudo setcap cap_net_bind_service=+ep `readlink -f \`which node\``
function drop_root() {
process.setgid('nobody');
process.setuid('nobody');
}
var process = require('process');
var http = require('http');
var server = http.createServer(function(req, res) {
res.write("Success!");
res.end();
});
server.listen(80, null, null, function() {
console.log('User ID:',process.getuid()+', Group ID:',process.getgid());
drop_root();
console.log('User ID:',process.getuid()+', Group ID:',process.getgid());
});