Najlepsze praktyki podczas uruchamiania Node.js z portem 80 (Ubuntu / Linode) [zamknięty]

Konfiguruję swój pierwszy serwer Node.js Na cloud Linux node i jestem całkiem nowy w szczegółach Linux admin. (BTW nie próbuję jednocześnie używać Apache ' a.)

Wszystko jest zainstalowane poprawnie, ale odkryłem, że jeśli nie użyję root login, nie jestem w stanie słuchać na port 80 z node. Jednak wolałbym nie uruchamiać go jako root ze względów bezpieczeństwa.

Jaka jest najlepsza praktyka:

  1. Ustaw dobre uprawnienia / użytkownika dla węzła tak, aby był bezpieczny / piaskownica?
  2. Zezwalaj na użycie portu 80 W ramach tych ograniczeń.
  3. Uruchom węzeł i uruchom go automatycznie.
  4. obsługuje informacje dziennika wysyłane do konsoli.
  5. Wszelkie inne ogólne problemy związane z konserwacją i bezpieczeństwem.

Czy powinienem przekierowywać ruch na port 80 do innego portu nasłuchowego?

Dzięki

Author: mujaffars, 2013-05-15

5 answers

Port 80

To, co robię na moich instancjach chmurowych, to przekierowanie portu 80 do portu 3000 za pomocą tego polecenia:

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

Potem uruchamiam mój węzeł.js na porcie 3000. Żądania do Portu 80 zostaną zmapowane do portu 3000.

Należy również edytować plik /etc/rc.local i dodać tę linię minus sudo. To doda przekierowanie, gdy maszyna uruchomi się. Nie potrzebujesz sudo w /etc/rc.local, ponieważ komendy są uruchamiane jako root, gdy system się uruchamia.

Logi

Użyj na zawsze moduł do uruchomienia węzła.js z. Upewni się, że uruchomi się ponownie, jeśli kiedykolwiek ulegnie awarii i przekieruje dzienniki konsoli do pliku.

Uruchom na Boot

Dodaj swój węzeł.js uruchamia skrypt do pliku edytowanego w celu przekierowania portu, /etc/rc.local. To uruchomi Twój węzeł.js uruchamia skrypt po uruchomieniu systemu.

Digital Ocean & other VPS

Dotyczy to nie tylko Linode, ale także Digital Ocean, AWS EC2 i innych dostawców VPS. Jednakże, na systemach opartych o RedHat /etc/rc.local jest /ect/rc.d/local.
 468
Author: Daniel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-14 00:18:27

Dać Bezpiecznemu Użytkownikowi Uprawnienia Do Korzystania Z Portu 80

Pamiętaj, że nie chcemy uruchamiać aplikacji jako użytkownik root, ale jest pewien problem: twój bezpieczny użytkownik nie ma uprawnień do używania domyślnego portu HTTP (80). Celem jest możliwość publikowania strony internetowej, z której odwiedzający mogą korzystać, przechodząc do łatwego w użyciu adresu URL, takiego jak http://ip:port/

Niestety, jeśli nie zalogujesz się jako root, zwykle będziesz musiał użyć adresu URL, takiego jak http://ip:port - Gdzie numer portu > 1024.

Wiele osób dostaje utknął tutaj, ale rozwiązanie jest łatwe. Jest kilka opcji, ale to jest ten, który lubię. Wpisz następujące polecenia:

sudo apt-get install libcap2-bin
sudo setcap cap_net_bind_service=+ep `readlink -f \`which node\``

Teraz, kiedy powiesz aplikacji węzła, że chcesz, aby działała na porcie 80, nie będzie narzekać.

Sprawdź to odnośnik

 94
Author: Meet Mehta,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-29 06:41:48

Upuść uprawnienia roota po powiązaniu z portem 80 (lub 443).

Pozwala to port 80/443 pozostać chroniony, jednocześnie uniemożliwiając obsługę żądań jako root:

function drop_root() {
    process.setgid('nobody');
    process.setuid('nobody');
}

Pełny przykład pracy przy użyciu powyższej funkcji:

var process = require('process');
var http = require('http');
var server = http.createServer(function(req, res) {
    res.write("Success!");
    res.end();
});

server.listen(80, null, null, function() {
    console.log('User ID:',process.getuid()+', Group ID:',process.getgid());
    drop_root();
    console.log('User ID:',process.getuid()+', Group ID:',process.getgid());
});

Zobacz więcej szczegółów w tym pełne odniesienie.

 11
Author: slund,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-22 19:28:22

Dla Portu 80 (co było pierwotnym pytaniem), Daniel ma rację. Ostatnio przeniosłem się do https i musiałem przełączyć się z iptables na lekki serwer proxy nginx zarządzający certami SSL. Znalazłem przydatną odpowiedź wraz z gist przez gabrielhpugliese Jak sobie z tym poradzić. Zasadniczo I

Mam nadzieję, że to uratuje komuś ból głowy. Jestem pewien, że jest czysty węzeł sposób na to, ale nginx był szybki i zadziałał.
 7
Author: Nick Benes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:10:47

Czy Linode udostępnia jakąś "front wall" lub firewall gdzie trzeba otworzyć port dla maszyny? Może będzie to dobre miejsce, aby znaleźć lepsze rozwiązanie niż routing na każdej maszynie? Gdy wdrażam serwer na platformie Azure, muszę zdefiniować tzw. punkty końcowe. Endpoint zawiera port publiczny, Port prywatny (na komputerze) i protokół (TCP / UDP). Więc jeśli używasz aplikacji na porcie 3000 na serwerze, jest ona osiągalna na porcie 80, a routing jest wykonywany przez Platformę, a nie maszynę. Mogę również ustawić ACLs na punktach końcowych.

 0
Author: Michał Smereczyński,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-29 11:20:34