我试图在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中。"我不理解这句话。
任何人都认为这可以正常工作,可以分享他们所做的事情吗?
答案 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()
调用所需的库加载到内存中。