Praktik terbaik saat menjalankan Node.js dengan port 80 (Ubuntu / Linode) [ditutup]

260

Saya menyiapkan Node.jsserver pertama saya pada cloud Linux nodedan saya cukup baru untuk rincian Linux admin. (BTW saya tidak mencoba menggunakan Apache pada saat yang bersamaan.)

Semuanya terpasang dengan benar, tetapi saya menemukan bahwa kecuali saya menggunakan root login, saya tidak dapat mendengarkan port 80dengan simpul. Namun saya lebih suka tidak menjalankannya sebagai root untuk alasan keamanan.

Apa praktik terbaik untuk:

  1. Tetapkan izin / pengguna yang baik untuk simpul sehingga aman / dikotak pasir?
  2. Izinkan port 80 digunakan dalam batasan ini.
  3. Mulai simpul dan jalankan secara otomatis.
  4. Menangani informasi log yang dikirim ke konsol.
  5. Masalah pemeliharaan dan keamanan umum lainnya.

Haruskah saya meneruskan lalu lintas port 80 ke port mendengarkan yang berbeda?

Terima kasih

Robotbugs
sumber

Jawaban:

532

Port 80

Apa yang saya lakukan pada instance cloud saya adalah saya mengarahkan ulang port 80 ke port 3000 dengan perintah ini:

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

Kemudian saya meluncurkan Node.js saya di port 3000. Permintaan ke port 80 akan dipetakan ke port 3000.

Anda juga harus mengedit /etc/rc.localfile Anda dan menambahkan baris itu minus sudo. Itu akan menambah arahan ulang ketika mesin dinyalakan. Anda tidak perlu sudomasuk /etc/rc.localkarena perintah di sana dijalankan seperti rootketika sistem melakukan boot.

Log

Gunakan modul selamanya untuk meluncurkan Node.js Anda dengan. Ini akan memastikan bahwa itu restart jika pernah crash dan itu akan mengarahkan log konsol ke file.

Luncurkan saat Boot

Tambahkan skrip mulai Node.js Anda ke file yang Anda edit untuk pengalihan port /etc/rc.local,. Itu akan menjalankan skrip peluncuran Node.js Anda ketika sistem dimulai.

Digital Ocean & VPS lainnya

Ini tidak hanya berlaku untuk Linode, tetapi juga Digital Ocean, AWS EC2, dan penyedia VPS lainnya. Namun, pada sistem berbasis RedHat /etc/rc.localadalah /ect/rc.d/local.

Daniel
sumber
3
Terima kasih atas jawabannya, bagus dan to the point.
Robotbugs
21
BTW, di Ubuntu, itu adalah /etc/rc.local
kehers
12
Seringkali flag "-i eth0" akan menjadi masalah untuk server pribadi virtual. Ganti eth0 sesuai kebutuhan.
JHAWN
7
Jika saya menambahkan skrip mulai Node.js saya /etc/rc.local, bukankah itu akan dijalankan seperti rootpada boot sistem? Itu akan mengalahkan tujuan redirect port 80.
jamix
4
Perhatikan bahwa agar pengalihan port berfungsi, port tujuan juga perlu di-firewall. WRT memulai turunan simpul saat boot, kami cukup memanfaatkan skrip init / file systemd distribusi yang memungkinkan Anda menentukan pengguna.
bk138
116

Berikan Izin Pengguna Aman Untuk Menggunakan Port 80

Ingat, kami TIDAK ingin menjalankan aplikasi Anda sebagai pengguna root, tetapi ada halangan: pengguna aman Anda tidak memiliki izin untuk menggunakan port HTTP default (80). Tujuan Anda adalah untuk dapat menerbitkan situs web yang dapat digunakan pengunjung dengan menavigasi ke URL yang mudah digunakan sepertihttp://ip:port/

Sayangnya, kecuali jika Anda masuk sebagai root, Anda biasanya harus menggunakan URL like http://ip:port- di mana nomor port> 1024.

Banyak orang terjebak di sini, tetapi solusinya mudah. Ada beberapa opsi tapi ini yang saya suka. Ketikkan perintah berikut:

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

Sekarang, ketika Anda memberi tahu aplikasi Node bahwa Anda ingin dijalankan pada port 80, itu tidak akan mengeluh.

Periksa tautan referensi ini

Temui Mehta
sumber
9
Ini adalah jawaban yang lebih baik, lebih sederhana.
Kyle Chadha
2
Juga, tambahkan jawaban terinci di sini stackoverflow.com/questions/23281895/…
Temui Mehta
1
Bagaimana server web seperti NGINX berjalan pada port 80? Apakah itu melakukan hal yang serupa?
Eric Andrew Lewis
1
@EricAndrewLewis: Saya akan mengatakan itu tergantung. Kesalahan ini akan muncul ketika Anda menjalankan server dalam mode non-root. Bagaimana jika Anda menjalankan server Nginx sebagai pengguna root! Juga, jika berjalan seperti pengguna normal dan mendapatkan kesalahan. Jalankan perintah di atas untuk memberikan izin aman untuk mengakses porta. Lihat juga stackoverflow.com/questions/31369480/…
Temui Mehta
16

Jatuhkan hak akses root setelah Anda mengikat ke port 80 (atau 443).

Ini memungkinkan port 80/443 tetap terlindungi, sambil tetap mencegah Anda melayani permintaan sebagai root:

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

Contoh kerja lengkap menggunakan fungsi di atas:

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());
});

Lihat lebih detail di referensi lengkap ini .

lamban
sumber
9

Untuk port 80 (yang merupakan pertanyaan awal), Daniel benar. Baru-baru ini saya pindah ke httpsdan harus beralih dari iptablesproxy nginx ringan yang mengelola sertifikat SSL. Saya menemukan jawaban yang berguna bersama dengan intisari oleh gabrielhpugliese tentang cara menanganinya. Pada dasarnya saya

Semoga itu bisa menyelamatkan orang lain beberapa sakit kepala. Saya yakin ada cara simpul murni untuk melakukan ini, tetapi nginx cepat dan berhasil.

Nick Benes
sumber