Как запустить node.js как пользователь без полномочий root?

Я запускаю сервер node.js, который будет обслуживать запросы на порт 80 среди других. Очевидно, для этого требуется, чтобы приложение выполнялось как root (в Linux).

Глядя на это сообщение (http://syskall.com/dont-run-node-dot-js-as-root), в качестве примера ясно, что есть простые способы разрешить запуск node как пользователь без полномочий root, но мне интересно, есть ли у кого-нибудь мнения о преимуществах/недостатках различных предложенных методов:

  • code: использовать setuid() для выпадания из корня в непривилегированный пользователь после прослушивания на порту 80.

  • используя прокси-сервер какого-либо типа для перенаправления запросов на порт > 1024 (и поэтому не нужно node для запуска от имени пользователя root)

  • используя IP-таблицы для пересылки на другой порт (ditto node не запускается с правами root)

Спасибо

Ответы

Ответ 1

Вариант 1 требует, чтобы сервер node запускался с правами root. Не идеально.

Вариант 2 добавляет накладные расходы каждому обрабатываемому запросу и добавляет еще одну точку отказа в ваш стек.

Вариант 3 Самый простой и эффективный метод.

Чтобы реализовать вариант 3, добавьте следующие сценарии вашей системы. (/etc/rc.d/rc.local в системах на базе RedHat, таких как AWS).

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3000

Это будет перенаправлять запросы с порта 80 на порт 3000.

Ответ 2

(У меня недостаточно репутации, чтобы добавить комментарий к Мэтту Брауну, поэтому я пишу это как ответ. Не стесняйтесь редактировать.)

Существует более простой способ загрузки правил iptables автоматически после перезагрузки, чем тот, который описан в ссылке Matt Browne: можно установить iptables-persistent из репозиториев, используя apt-get:

apt-get install iptables-persistent

Правила по-прежнему необходимо сохранить вручную следующим образом:

IPv4:

iptables-save > /etc/iptables/rules.v4

IPv6:

iptables-save > /etc/iptables/rules.v6

(Источник: http://www.thomas-krenn.com/de/wiki/Iptables_Firewall_Regeln_dauerhaft_speichern (немецкий))

Ответ 3

Мне нравится простота этого обходного пути:

sudo setcap 'cap_net_bind_service=+ep' `which node`

Он также работает для других программ, кроме nodejs btw.

В основном как 2-й параметр вы вводите путь к исполняемому программному обеспечению (например, /usr/bin/nodejs в Ubuntu), в приведенном выше случае which node должен предоставлять его динамически, что делает эту работу независимо от дистрибутива Linux.

Помните, что при обновлении nodejs или исполняемый файл перезаписывается по какой-либо другой причине, вам придется снова выполнить ту же самую команду.

Источники: