Pertanyaan Menggunakan su - (pengguna) untuk membuka port privileged tidak berfungsi


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 skrip selamanya untuk menjalankan'

Namun saya mendapatkan kesalahan EACCESS tetapi menjalankan skrip secara langsung karena root baik-baik saja. Saya mendengar orang lain melakukan hal yang sama dan bekerja untuk mereka sehingga mungkinkah saya melakukan sesuatu yang berbeda?

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


2
2017-09-20 10:29


asal


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


Jawaban:


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

3
2017-09-20 11:21



+1 untuk tautan, meskipun saya tidak menggunakan kode di atas, tautan mengarahkan saya ke alat 'authbind'. Jadi akan menguji nanti dan melihat bagaimana kelanjutannya. - iQ.


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 berhasil.

Ada dua cara untuk mengatasi hal ini yang dapat saya pikirkan dari atas kepala saya:

  1. Menggunakan sebuah kemampuan file yang akan membiarkan pengguna unprivileged membuka port istimewa. Meskipun mereka umumnya tidak bekerja pada skrip dalam hal ini mereka seharusnya sejak, sejauh yang saya tahu, Anda mulai menggunakan server node <filename>. (Koreksi saya jika saya salah.)

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


2
2017-09-20 11:35





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 pengenalan yang sangat dasar 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. Di Solaris, gunakan PRIV_NET_PRIVADDR. Untuk informasi lebih rinci, lihat kapabilitas manusia (7) (Linux) atau hak istimewa pria (5) (Solaris).


0
2017-09-20 11:34