node.js Ошибка: getaddrinfo ENOTFOUND делает http-запрос в chroot-тюрьме

Я пытаюсь выполнить дочерний процесс node.js в тюрьме chroot, чтобы предотвратить доступ к файловой системе за пределами своего каталога.

Однако, когда я это делаю, приложение больше не может делать http-запросы через модуль «запрос». Любой запрос, который я делаю, заканчивается ошибкой: getaddrinfo ENOTFOUND.

Есть одна проблема, которая была закрыта в проекте node.js, которая, кажется, предполагает, что вам нужно заменить реализацию dns.lookup или скопировать /etc/resolv.conf в тюрьму (ни то, ни другое не сработало для меня): https://github.com/joyent/node/issues/3399

Существует также ветка групп Google: https://groups.google.com/forum/#!topic/nodejs/Qb_LMLulZS4

Кажется, это рекомендует вам «поместить библиотеки привязки и все их зависимости также в тюрьму». Я не понимаю этого утверждения.

Кто-нибудь заставил это работать правильно, кто может поделиться тем, что они сделали?


person outside2344    schedule 03.04.2014    source источник


Ответы (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? Я создал свой с помощью утилиты debootstrap от Debian:

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. Я предлагаю «поместить библиотеки привязки и все их зависимости также в джейл». заявление означает монтировать все, что вам нужно, например. 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.

person zarkone    schedule 09.04.2014
comment
Спасибо @zarkone! Есть ли шанс, что вы могли бы дать более подробную информацию (построчно), как вы использовали debootstrap и mount для proc/sys/dev? - person outside2344; 09.04.2014
comment
var request = require('request'), postRequest = request.post('http://www.google.com', {form: { key: 'val'}}); process.stdin.pipe(postRequest).pipe(process.stdout); этот код работает, я получил результат из chroot - person zarkone; 09.04.2014
comment
Спасибо, zarkone - это была подсказка, которая мне была нужна. Для будущих читателей, в связи с моей конкретной потребностью просто иметь работу поиска DNS-имен, я обнаружил, что могу просто решить, просто смонтировав '/etc', '/lib' и '/usr/local' в chroot-тюрьме. решение zarkone с использованием debootstrap является более общим решением. - person outside2344; 10.04.2014

Я не знаю о chroot в дочернем процессе.

Но для использования пакета chroot npm я обнаружил, что если я сделал dns.lookup() непосредственно перед chroot, поиск dns будет работать хорошо даже после chroot.

dns.lookup() загрузит необходимые библиотеки для вызова getaddrinfo() в память перед chroot.

person user3718041    schedule 07.06.2014