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:
- Anda memerlukan setidaknya kernel 2.6.24
- 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.
- Linux akan menonaktifkan LD_LIBRARY_PATH pada
program
apa pun yang memiliki hak tinggi sepertisetcap
atausuid
. Jadi jikaprogram
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.