2014-04-03 3 views
2

chroot jail에서 node.js 하위 프로세스를 실행하여 디렉토리 외부의 파일 시스템에 액세스하지 못하게하려고합니다.node.js 오류 : getaddrinfo ENOTFOUND chroot jail에서 http 요청하기

그러나 이렇게하면 응용 프로그램이 더 이상 '요청'모듈을 통해 http 요청을 할 수 없습니다. 내가 한 모든 요청은 '오류 : getaddrinfo ENOTFOUND'로 끝납니다.

node.js 프로젝트에서 dns.lookup 또는 copy /etc/resolv.conf의 구현을 교도소로 바꾸는 것이 좋습니다 (폐쇄적 인 경우) : https://github.com/joyent/node/issues/3399

또한 구글 그룹 스레드있다 ". 감옥에 또한 바인딩 라이브러리와 모든 종속성을 넣어"https://groups.google.com/forum/#!topic/nodejs/Qb_LMLulZS4

이것은 당신이해야하는 것이 좋습니다 것 나는 그 진술을 이해하지 못한다.

누구나 올바르게 작동하여 어떤 작업을 공유 할 수 있습니까?

답변

2

어쩌면 당신의 질문에 대답하지 않을지도 모르지만, 나는 나의 연구 결과를 제공하고 싶다. 어떻게 당신이 당신의 chroot 환경을 만들려면 어떻게해야합니까 : 그래서 내가 물어보고 싶은 예상대로 간단 server.js 듣고 응답 후 쿼리 -

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

이 스크립트는 제대로 작동? 평소와 같이

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

다음 mount 시저, SYS 및 dev에 :

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

을하고도 나는 node에 대한 액세스를 얻을 수 /usr/local/ 마운트 나는 데비안에서 debootstrap 유틸리티를 사용하여 내를 만들었습니다. 나는 "바인딩 라이브러리와 모든 의존성을 감옥에 넣으십시오"라고 제안합니다. 성명서는 필요한 물건을 모두 마운트하는 것을 의미합니다. 내 경우에는 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을 어떻게 사용하고 proc/sys/dev에 마운트했는지에 대한 자세한 내용을 (줄 단위로) 줄 수 있습니까? – outside2344

+0

'var request = require ('request'), postRequest = request.post ('http://www.google.com', {form : {key : 'val'}}); process.stdin.pipe (postRequest) .pipe (process.stdout); ' 이 코드는 작동합니다. chroot에서 결과를 얻었습니다. – zarkone

+0

chroot 명령으로 업데이트 된 답변 – zarkone

1

나는 자식 프로세스에서 chroot에 관해 모른다.

chroot npm 패키지를 사용하면 chroot 바로 전에 dns.lookup()을 실행하면 chroot 후에도 DNS 조회가 제대로 작동한다는 것을 알았습니다.

dns.lookup()은 chroot 전에 메모리에 getaddrinfo() 호출에 필요한 라이브러리를로드합니다.