2013-07-04 28 views
16

Używam serwera node.js, który będzie obsługiwał żądania na porcie 80 między innymi. Oczywiście wymaga to, aby aplikacja działała jako root (w systemie Linux).Jak uruchomić plik node.js jako użytkownik inny niż root?

Patrząc na ten post (http://syskall.com/dont-run-node-dot-js-as-root) jako przykład jasne jest, że istnieją proste sposoby, aby umożliwić uruchamianie węzła jako użytkownik inny niż root, ale zastanawiam się, czy ktoś ma poglądy na temat zalet/wad różne metody sugerowane:

  1. Kod: używać setuid() rozwijanej od nasady do non-uprzywilejowanej użytkownika po nasłuchuje na porcie 80 jest ustalone.

  2. za pomocą serwera proxy jakiegoś przekierować żądania do portu> 1024 (a więc nie trzeba węzeł uruchomić jako root)

  3. użyciu tabel IP do przekazania do innego portu (węzła jw nie będzie działać jako root)

Dzięki

Odpowiedz

22

wymaga Wariant 1 uruchomieniu serwera węzła jako root. Nieidealny.

Opcja 2 dodaje narzut do każdego obsługiwanego żądania i dodaje kolejny punkt awarii do stosu.

Opcja 3 Jest najprostszą i najbardziej wydajną metodą.

Aby zaimplementować opcję 3, dodaj poniższe do skryptów startowych systemu. (/etc/rc.d/rc.local na systemach opartych na RedHat, takich jak AWS).

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

To będzie przekierować żądania od portu do portu 3000. 80

+1

Upvoted. Zwróć uwagę, że przynajmniej w systemie Ubuntu powyższe polecenie 'iptables' nie jest trwałe ... aby upewnić się, że reguła zostanie zachowana przy następnym uruchomieniu, musisz upewnić się, że istnieje skrypt startowy, który przywraca reguły' iptables' używając Komenda 'iptables-restore', jak opisano tutaj: http://www.rackspace.com/knowledge_center/article/ubuntu-setup –

+0

Czy opcja 3 jest sposobem, w jaki większość programistów NodeJS wdraża gotowe strony internetowe? Jeśli nie, jak zazwyczaj umożliwiają przeglądarkom klientów łączenie się z portem 80? – trysis

+0

Zależy od twojej sytuacji. Większe wdrożenia używają systemu równoważenia obciążenia z przodu, który jest taki sam, jak w opcji 2. Wiele osób używa Heroku, który używa load balancera z przodu; ponownie opcja 2. Jednakże, jeśli wdrażasz to na serwerze, na którym masz uprawnienia roota, polecam opcję 3. Jest to łatwe i nie musisz się martwić konfigurowaniem odwrotnego proxy. To powiedziawszy, zdecydowanie spójrz na Heroku, jeśli jest to opcja dla ciebie. Dzięki nim wdrożenie jest bardzo łatwe. – Daniel

4

(nie mam wystarczająco dużo reputacji, aby dodać komentarz The jedną z Mattem Browne, więc piszę to jako odpowiedź. Zapraszam swobodnie edytować)

jest prostszy sposób, aby załadować reguł iptables automatycznie po restarcie niż ten opisany w linku Matt Browne. można zainstalować iptables-persistent z repozytoriów za pomocą apt-get:

apt-get install iptables-persistent 

Zasady nadal muszą być zapisywane ręcznie tak:

IPv4:

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

IPv6:

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

(Źródło: http://www.thomas-krenn.com/de/wiki/Iptables_Firewall_Regeln_dauerhaft_speichern (niemiecki))

1

Kocham prostotę tego obejścia:

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

Działa również dla programów innych niż nodejs btw.

Zasadniczo jako drugi parametr wpisujemy ścieżkę do pliku wykonywalnego programu (np. /usr/bin/nodejs na Ubuntu), w powyższym przypadku which node powinien dostarczać go dynamicznie, dzięki czemu działa niezależnie od dystrybucji Linuksa.

Należy jednak pamiętać, że po uaktualnieniu nodejs lub gdy plik wykonywalny zostanie nadpisany z innego powodu, konieczne będzie ponowne wykonanie tego samego polecenia.

Źródła: