2014-04-03 25 views
2

我試圖在chroot jail中執行一個node.js子進程,以阻止它訪問其目錄之外的文件系統。node.js錯誤:getaddrinfo ENOTFOUND在chroot jail中發出http請求

但是,當我這樣做時,應用程序不能再通過'request'模塊發出http請求。我所做的任何請求都以'錯誤:getaddrinfo ENOTFOUND'結束。

有一個問題是在Node.js的項目,似乎表明您需要更換dns.lookup實施或複製的/etc/resolv.conf到監獄關閉(沒有工作對我來說):https://github.com/joyent/node/issues/3399

還有一個谷歌組線程:https://groups.google.com/forum/#!topic/nodejs/Qb_LMLulZS4

這似乎是建議你應該「把綁定庫和其所有的依賴也進監獄。」我不明白這一說法。

任何人都可以得到這個正常工作,可以分享他們做了什麼?

回答

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); 
}); 

這個腳本工作正常 - 簡單server.js傾聽和回答後查詢,因爲它應該如此我要問:你如何創建你的chroot環境?我創建了礦用debootstrap工具從Debian的:

cd /mnt/chroot/ 
debootstrap wheezy ./wheezy-chroot http://ftp.us.debian.org/debian 
cd wheezy-chroot 

然後mount PROC,sys和開發像往常一樣:

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

,也是我安裝/usr/local/node訪問。我建議「將綁定庫及其所有依賴關係也放入監獄。」聲明意味着安裝你需要的所有東西,例如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這樣的機制。

+0

謝謝@zarkone!任何你可以給出更多細節的機會(一行一行)你如何使用debootstrap和mount proc/sys/dev? – outside2344

+0

'var request = require('request'), postRequest = request.post('http://www.google.com',{form:{key:'val'}});這個代碼可以工作,我從chroot得到了結果 – zarkone

+0

chroot命令更新的答案 – zarkone

1

我不知道chroot在子進程中。

但是,對於使用chroot npm包,我發現如果我在chroot之前做了dns.lookup(),那麼即使在chroot之後,dns查找也可以正常工作。

dns.lookup()將在chroot之前調用getaddrinfo()調用所需的庫。