node.js错误:getaddrinfo ENOTFOUND在chroot jail中发出http请求

时间:2014-04-03 17:36:42

标签: node.js chroot

我试图在chroot jail中执行node.js子进程,以防止它访问其目录之外的文件系统。

但是,当我执行此操作时,应用程序无法再通过“请求”提出http请求。模块。我发出的任何请求都以错误结束:getaddrinfo ENOTFOUND'。

在node.js项目中有一个问题已经关闭,似乎建议您需要将dns.lookup的实现替换为jile(或者将/etc/resolv.conf复制到jail中(对我来说都不起作用):{{ 3}}

还有一个Google网上论坛帖子:https://github.com/joyent/node/issues/3399

这似乎建议您应该将绑定库及其所有依赖项也放入jail中。"我不理解这句话。

任何人都认为这可以正常工作,可以分享他们所做的事情吗?

2 个答案:

答案 0 :(得分:2)

也许它没有回答你的问题,但我想提供我的研究结果。

var ls = require('child_process').spawn('chroot', ['/mnt/chroot/wheezy-chroot', 'node', '/root/simple-server.js']);

ls.stdout.on('data', function (data) {
  console.log('stdout: ' + data);
});

ls.stderr.on('data', function (data) {
  console.log('stderr: ' + data);
});

ls.on('close', function (code) {
  console.log('child process exited with code ' + code);
});

这个脚本正常工作 - simple-server.js应该监听并回答帖子查询,所以我想问:你如何创建你的chroot环境?我用Debian的debootstrap实用程序创建了我的

cd /mnt/chroot/
debootstrap wheezy ./wheezy-chroot http://ftp.us.debian.org/debian
cd wheezy-chroot
然后像往常一样mount proc,sys和dev:

mount -t proc none proc
mount --rbind /dev dev
mount --rbind /sys sys

我也挂载/usr/local/以访问node。我建议"将绑定库及其所有依赖项也放入jail。"声明意味着安装你需要的所有东西,例如mount -o bind /usr/local /mnt/chroot/wheezy-chroot/usr/local就我而言。

如果我完全错过了我的回答,我会留下这个链接:https://github.com/magne4000/node-jail - 你可能觉得这个包很有用。

最后一件事:据我所知chroot在某些情况下不是安全的解决方案(http://en.wikipedia.org/wiki/Chroot#Limitations)。也许你应该看看像FreeBSD Jail甚至LXC这样的机制。

答案 1 :(得分:1)

我不了解儿童过程中的chroot。

但是对于使用chroot npm包,我发现如果我在chroot之前做了dns.lookup(),那么即使在chroot之后,dns查找也能正常工作。

dns.lookup()会在chroot之前将getaddrinfo()调用所需的库加载到内存中。