GNU/Linux >> Belajar Linux >  >> Linux

Apakah ada cara untuk proses non-root untuk mengikat ke port istimewa di Linux?

Oke, terima kasih kepada orang-orang yang menunjukkan kemampuan sistem dan CAP_NET_BIND_SERVICE kemampuan. Jika Anda memiliki kernel terbaru, memang mungkin untuk menggunakan ini untuk memulai layanan sebagai non-root tetapi mengikat port rendah. Jawaban singkatnya adalah Anda melakukannya:

setcap 'cap_net_bind_service=+ep' /path/to/program

Lalu kapan saja program dieksekusi setelah itu akan memiliki CAP_NET_BIND_SERVICE kemampuan. setcap ada di dalam paket debian libcap2-bin .

Sekarang untuk peringatannya:

  1. Anda memerlukan setidaknya kernel 2.6.24
  2. Ini tidak akan berfungsi jika file Anda adalah skrip. (yaitu, menggunakan baris #! untuk meluncurkan juru bahasa). Dalam hal ini, sejauh yang saya mengerti, Anda harus menerapkan kemampuan untuk mengeksekusi juru bahasa itu sendiri, yang tentu saja merupakan mimpi buruk keamanan, karena program apa pun yang menggunakan juru bahasa itu akan memiliki kemampuan tersebut. Saya tidak dapat menemukan cara yang bersih dan mudah untuk mengatasi masalah ini.
  3. Linux akan menonaktifkan LD_LIBRARY_PATH pada program apa pun yang memiliki hak tinggi seperti setcap atau suid . Jadi jika program Anda menggunakan .../lib/ sendiri , Anda mungkin harus melihat opsi lain seperti penerusan porta.

Sumber daya:

  • kemampuan(7) halaman manual. Baca ini panjang dan keras jika Anda akan menggunakan kemampuan dalam lingkungan produksi. Ada beberapa detail rumit tentang bagaimana kemampuan diwarisi di seluruh panggilan exec() yang dirinci di sini.
  • halaman manual setcap
  • "Bind ports below 1024 without root on GNU/Linux":Dokumen yang pertama kali mengarahkan saya ke setcap .

Catatan:RHEL pertama kali menambahkan ini di v6.


Anda dapat melakukan pengalihan port. Inilah yang saya lakukan untuk server kebijakan Silverlight yang berjalan di kotak Linux

iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 943 -j REDIRECT --to-port 1300

Cara standarnya adalah menjadikannya "setuid" sehingga mereka mulai sebagai root, dan kemudian mereka membuang hak istimewa root itu segera setelah mereka terikat ke port tetapi sebelum mereka mulai menerima koneksi ke port tersebut. Anda dapat melihat contoh bagusnya di kode sumber untuk Apache dan INN. Saya diberi tahu bahwa Lighttpd adalah contoh bagus lainnya.

Contoh lain adalah Postfix, yang menggunakan banyak daemon yang berkomunikasi melalui pipa, dan hanya satu atau dua di antaranya (yang sangat sedikit kecuali menerima atau memancarkan byte) dijalankan sebagai root dan sisanya dijalankan dengan hak istimewa yang lebih rendah.


Linux
  1. Mengapa tidak ada API DirectX untuk Linux?

  2. Apakah ada cara untuk meningkatkan kinerja pipa linux?

  3. Apakah ada Flash Player mandiri untuk Linux?

  1. Linux – Alat Untuk Mengukur Kualitas Entropi?

  2. Layanan Linux:apakah ada GUI untuk layanan?

  3. Apakah ada cara untuk mendapatkan rasio Cache Hit/Miss untuk memblokir perangkat di Linux?

  1. 30 Latihan Proses Linux Untuk Sysadmin

  2. Apakah ada cara untuk memeriksa rpath saat ini di Linux?

  3. Apakah ada cara untuk membuat ext-filesystem menggunakan lebih sedikit ruang untuk dirinya sendiri di Linux?