Как запустить 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 или исполняемый файл перезаписывается по какой-либо другой причине, вам придется снова выполнить ту же самую команду.
Источники: