Menggunakan su - (pengguna) untuk membuka port istimewa tidak berfungsi

2

Jadi saya ingin menjalankan server Node pada port 80 tetapi saya tidak ingin menjalankan seluruh proses pada hak akses root, untuk keamanan saya pikir ini akan menjadi yang terbaik.

Jadi saya pikir solusi yang baik akan digunakan sebagai root:

su - (myuser) -c 'node forever script to run'

Namun saya mendapatkan kesalahan EACCESS tetapi menjalankan skrip secara langsung karena root tidak masalah. Saya mendengar orang lain melakukan hal yang sama dan bekerja untuk mereka, jadi mungkinkah saya melakukan sesuatu yang berbeda?

Apakah ada strategi yang lebih baik untuk melakukan ini, untuk membuka port pada root privilege dan kemudian drop privilege root setelah aplikasi berjalan?

iQ.
sumber
Sistem operasi apa yang Anda gunakan? (Saya bisa melihat itu adalah Unix, tapi yang mana?)
ctrl-alt-delor

Jawaban:

3

ya, bisa melakukan ini. lihat posting blog ini yang menjelaskan lebih baik daripada yang saya bisa.

https://thomashunter.name/blog/drop-root-privileges-in-node-js/

Saya menyalin kode yang relevan di sini jika blog menjadi tidak tersedia

app.listen(80, 'localhost', null, function() {
  // Listening
  try {
    console.log('Old User ID: ' + process.getuid() + ', Old Group ID: ' + process.getgid());
    process.setgid('users');
    process.setuid('tlhunter');
    console.log('New User ID: ' + process.getuid() + ', New Group ID: ' + process.getgid());
  } catch (err) {
    console.log('Cowardly refusing to keep the process alive as root.');
    process.exit(1);
  }
});
johnshen64
sumber
+1 untuk tautan, meskipun saya mungkin tidak menggunakan kode di atas, tautan itu mengarahkan saya ke alat 'authbind'. Jadi akan menguji itu nanti dan lihat bagaimana hasilnya.
iQ.
2

su - <user> beralih ke <user> sebelum melakukan hal lain, sehingga server NodeJS akan dimulai sebagai pengguna Anda dan tidak memiliki petunjuk tentang root menjalankan su perintah, dan karena pengguna tidak diizinkan untuk menggunakan port istimewa ini tidak akan pernah berfungsi.

Ada dua cara untuk mengatasi hal ini yang bisa saya pikirkan di atas kepala saya:

  1. Menggunakan sebuah kemampuan file yang akan memungkinkan pengguna yang tidak berkepentingan membuka port istimewa. Meskipun mereka umumnya tidak bekerja pada skrip dalam hal ini mereka harus sejak itu, sejauh yang saya tahu, Anda memulai menggunakan server node <filename>. (Koreksi saya jika saya salah tho.)

  2. Menggunakan reverse-proxy like NGINX yang berada di depan server aplikasi, berjalan sebagai root. Dalam hal ini pengguna terhubung langsung ke NGINX yang kemudian proksi koneksi ke server aplikasi, tetapi lebih mudah memungkinkan Anda menjalankan beberapa server / instance dan memungkinkan sumber cache NGINX. Ini cenderung menjadi pendekatan yang umumnya disukai ketika datang untuk menggunakan server aplikasi.

kyrias
sumber
0

Jika menggunakan Gnu / Linux maka Anda dapat menggunakan kemampuan untuk memberikan aplikasi kemampuan untuk membuka port istimewa, dan tidak ada kemampuan lain (root memberikan semua kemampuan).

Lihat di sini untuk pengantar yang sangat mendasar https://unix.stackexchange.com/questions/101263/what-are-the-different-ways-to-set-file-permissions-etc-on-gnu-linux

[sunting] Kemampuan GNU / Linux yang Anda cari adalah cap_net_bind_service. Pada Solaris, gunakan PRIV_NET_PRIVADDR. Untuk informasi lebih rinci, lihat kapabilitas man (7) (Linux) atau privilege man (5) (Solaris).

ctrl-alt-delor
sumber