Najlepsze praktyki dotyczące uruchamiania Node.js z portem 80 (Ubuntu / Linode) [zamknięte]

260

Konfiguruję mój pierwszy Node.jsserwer na cloud Linux nodei jestem dość nowy w szczegółach Linux admin. (BTW, nie próbuję jednocześnie używać Apache.)

Wszystko jest zainstalowane poprawnie, ale okazało się, że dopóki nie użyję root login, nie będę mógł nasłuchiwać w port 80węźle. Jednak wolę 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, aby był bezpieczny / w trybie piaskownicy?
  2. Zezwól na użycie portu 80 w tych ograniczeniach.
  3. Uruchom węzeł i uruchom go automatycznie.
  4. Obsługa informacji dziennika wysłanych do konsoli.
  5. Wszelkie inne ogólne problemy związane z konserwacją i bezpieczeństwem.

Czy powinienem przekierowywać ruch z portu 80 do innego portu nasłuchującego?

Dzięki

Roboty
źródło

Odpowiedzi:

532

Port 80

W instancjach chmurowych wykonuję przekierowanie portu 80 na port 3000 za pomocą tego polecenia:

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

Następnie uruchamiam Node.js na porcie 3000. Żądania na porcie 80 zostaną zmapowane na port 3000.

Powinieneś także edytować /etc/rc.localplik i dodać ten wiersz minus sudo. To doda przekierowanie po uruchomieniu komputera. Nie trzeba sudosię /etc/rc.localponieważ polecenia nie są prowadzone jak rootpodczas uruchamiania systemu.

Kłody

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

Uruchom przy starcie systemu

Dodaj swoją node.js uruchomić skrypt do pliku edytowanego do portu przekierowania /etc/rc.local. Spowoduje to uruchomienie skryptu uruchamiania Node.js podczas uruchamiania systemu.

Digital Ocean i inne VPS

Dotyczy to nie tylko Linode, ale również Digital Ocean, AWS EC2 i innych dostawców VPS. Jednak w systemach opartych na RedHat /etc/rc.localjest /ect/rc.d/local.

Daniel
źródło
3
Dzięki za tę odpowiedź, miło i do rzeczy.
Robotbugs
21
BTW, na Ubuntu, jest /etc/rc.local
kehers
12
Często flaga „-i eth0” będzie problemem dla wirtualnych serwerów prywatnych. W razie potrzeby wymień eth0.
JHAWN
7
Jeśli dodam mój skrypt startowy do Node.js /etc/rc.local, czy nie będzie on wykonywany jak rootpodczas uruchamiania systemu? To pokonałoby cel przekierowania portu 80.
jamix
4
Pamiętaj, że aby przekierowanie portu działało, port docelowy musi być również otwarty na zaporze. WRT uruchamiając instancję węzła podczas rozruchu, po prostu korzystamy ze skryptów inicjujących / plików systemowych dystrybucji, które pozwalają określić użytkownika.
bk138,
116

Zezwól bezpiecznemu użytkownikowi na korzystanie z portu 80

Pamiętaj, że NIE chcemy uruchamiać twoich aplikacji jako użytkownik root, ale jest pewien problem: twój bezpieczny użytkownik nie ma uprawnień do korzystania z domyślnego portu HTTP (80). Twoim celem jest opublikowanie witryny internetowej, z której użytkownicy mogą korzystać, przechodząc do łatwego w użyciu adresu URL, takiego jakhttp://ip:port/

Niestety, chyba że zalogujesz się jako root, zwykle będziesz musiał użyć adresu URL typu http://ip:port- gdzie numer portu> 1024.

Utknęło tu wiele osób, ale rozwiązanie jest łatwe. Jest kilka opcji, ale to mi się podoba. Wpisz następujące polecenia:

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

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

Sprawdź ten link referencyjny

Poznaj Mehta
źródło
9
To jest lepsza, prostsza odpowiedź.
Kyle Chadha,
2
Dodano także szczegółową odpowiedź tutaj stackoverflow.com/questions/23281895/…
Poznaj Mehta
1
W jaki sposób serwer WWW taki jak NGINX działa na porcie 80? Czy robi coś podobnego?
Eric Andrew Lewis,
1
@EricAndrewLewis: Powiem, że to zależy. Ten błąd pojawi się, gdy serwer będzie działał w trybie innym niż root. Co jeśli korzystasz z serwera Nginx jako użytkownik root! Ponadto, jeśli działa jako zwykły użytkownik i pojawia się błąd. Uruchom powyższe polecenia, aby dać bezpieczne uprawnienia dostępu do portu. Zobacz także stackoverflow.com/questions/31369480/...
Spotkaj się z Mehtą
16

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

Pozwala to na ochronę portu 80/443, a jednocześnie uniemożliwia wyświetlanie żądań jako root:

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

Pełny działający przykład 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 pod tym pełnym odniesieniem .

powolny
źródło
9

W przypadku portu 80 (które było pierwotnym pytaniem) Daniel ma dokładnie rację. Niedawno przeprowadziłem się httpsi musiałem przełączyć iptablessię na lekki serwer proxy Nginx zarządzający certyfikatami SSL. Znalazłem użyteczną odpowiedź wraz z GIST przez gabrielhpugliese , w jaki sposób sobie z tym poradzić. Zasadniczo ja

Mam nadzieję, że uratuje to komuś ból głowy. Jestem pewien, że jest na to sposób z czystym węzłem, ale nginx był szybki i działał.

Nick Benes
źródło