it-swarm-id.com

Mengizinkan pengguna membiarkan mendengarkan port di bawah 1024

Saya perlu mengizinkan pengguna (berbeda dari root) untuk menjalankan server mendengarkan pada port 80.

Apakah ada cara untuk melakukan ini?

65
peoro

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

ini akan bekerja untuk proses spesifik. Tetapi untuk memungkinkan pengguna tertentu untuk mengikat port di bawah 1024 Anda harus menambahkannya ke sudoers.

Lihat ini diskusi untuk lebih.

53
Rohan Monga

(Beberapa metode ini telah disebutkan dalam jawaban lain; Saya memberikan beberapa pilihan yang mungkin dalam urutan kasar preferensi.)

Anda dapat mengalihkan port rendah ke port tinggi dan mendengarkan pada port tinggi.

iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 1080

Anda dapat menjalankan server sebagai hak istimewa root dan drop setelah mulai mendengarkan pada port yang diistimewakan. Lebih disukai, daripada mengkodekannya sendiri, mulai server Anda dari pembungkus yang melakukan pekerjaan untuk Anda. Jika server Anda memulai satu instance per koneksi, mulai dari inetd (atau program serupa seperti xinetd ). Untuk inetd, gunakan baris seperti ini di /etc/inetd.conf:

http  stream  tcp  nowait  username:groupname  /path/to/server/executable  argv[0] argv[1]…

Jika server Anda mendengarkan dalam satu contoh, mulai dari program seperti authbind . Buat file kosong /etc/authbind/byport/80 dan membuatnya dapat dieksekusi untuk pengguna yang menjalankan server; atau buat /etc/authbind/byuid/1234, di mana 1234 adalah UID yang menjalankan server, berisi baris 0.0.0.0/0:80,80.

Jika server Anda dapat dieksekusi disimpan pada sistem file yang mendukung kemampuan, Anda dapat memberikannya cap_net_bind_servicekemampuan . Berhati-hatilah karena kemampuannya masih relatif baru dan masih memiliki beberapa kekusutan .

setcap cap_net_bind_service=ep /path/to/server/executable

Authbind , @Gilles sudah menyebutkannya, tapi saya ingin sedikit mengembangkannya.

Ini memiliki kontrol akses yang mudah (detail di halaman manual): Anda dapat memfilter akses berdasarkan port, alamat antarmuka, uid, rentang alamat atau port dan kombinasi dari semuanya.

Ini memiliki parameter yang sangat berguna --depth:

--depth level

Menyebabkan authbind mempengaruhi program yang levelnya jauh di dalam grafik panggilan. Standarnya adalah 1.

"Levels deep" artinya ketika skrip (atau program), menjalankan skrip lain, skrip ini turun satu level. Jadi, jika Anda memiliki --depth 5 artinya pada level 1 (atau 0?) sampai 5 Anda memiliki izin untuk mengikat, sedangkan pada level 6 dan seterusnya, Anda tidak. Berguna saat Anda ingin skrip memiliki akses, tetapi bukan program yang dijalankan dengan atau tanpa sepengetahuan Anda.


Sebagai ilustrasi, Anda dapat memiliki sesuatu seperti ini: demi keamanan, Anda memiliki pengguna Java yang dimaksudkan hanya menjalankan Java dan Anda ingin memberinya akses ke port 80:

echo > /etc/authbind/byport/80
chown root:Java /etc/authbind/byport/80
chmod 710 /etc/authbind/byport/80

Saya telah membuat ../byport/80 file, memberikannya kepada Java grup pengguna (setiap pengguna memiliki grup sendiri), dan menjadikannya dapat dieksekusi oleh grup, yang berarti itu dapat dijalankan oleh pengguna Java. Jika Anda memberikan akses dengan port, file harus dapat dieksekusi oleh pengguna yang seharusnya memiliki akses, jadi kami melakukannya.

Ini mungkin cukup untuk rata-rata Joe, tetapi karena Anda tahu cara menggunakan --depth parameter, Anda menjalankan (sebagai Java pengguna) authbind --depth [depth] my_web_app's_start_script mulai dari --depth 1 dan lanjutkan hingga Anda menemukan kedalaman terkecil yang berfungsi dan gunakan itu.

Baca halaman manual untuk detail .

4

Jawaban singkatnya adalah bahwa ini tidak dimungkinkan oleh desain.

Jawaban panjangnya adalah bahwa di dunia open source ada banyak orang bermain dengan desain dan datang dengan metode alternatif. Secara umum adalah praktik yang diterima secara luas bahwa ini seharusnya tidak mungkin. Fakta bahwa Anda mencoba mungkin berarti Anda memiliki kesalahan desain lain di sistem Anda dan harus mempertimbangkan kembali arsitektur sistem Anda secara keseluruhan mengingat praktik terbaik dan implikasi keamanan.

Yang mengatakan, satu program untuk mengotorisasi akses non-root ke port rendah adalah authbind . Baik selinux dan grsecurity juga menyediakan kerangka kerja untuk otentikasi yang disetel dengan baik.

Terakhir, jika Anda ingin pengguna tertentu menjalankan program tertentu sebagai root dan yang benar-benar Anda butuhkan hanyalah mengizinkan pengguna untuk memulai kembali Apache atau sesuatu seperti itu, Sudo adalah teman Anda!

4
Caleb

Anda dapat menggunakan netcat atau xinetd atau penerusan port iptables, atau menggunakan Apache sebagai proksi ujung depan dan menjalankan proses pada port yang tidak memiliki hak istimewa.

3
jamespo

Saya mencoba metode iptables PREROUTING REDIRECT, tetapi ternyata itu juga mempengaruhi paket yang diteruskan. Yaitu, jika mesin juga meneruskan paket antar antarmuka (mis. Jika itu bertindak sebagai titik akses Wi-Fi yang terhubung ke jaringan Ethernet), maka aturan iptables juga akan menangkap koneksi klien yang terhubung ke tujuan Internet, dan mengarahkan mereka ke mesin. Bukan itu yang saya inginkan — saya hanya ingin mengarahkan kembali koneksi yang diarahkan ke mesin itu sendiri.

Satu kemungkinan adalah menggunakan TCP penerusan port. E.g menggunakan socat:

socat TCP4-LISTEN:www,reuseaddr,fork TCP4:localhost:8080

Namun satu kelemahan dengan metode itu adalah, aplikasi yang mendengarkan pada port 8080 kemudian tidak tahu alamat sumber koneksi masuk (mis. Untuk pencatatan atau tujuan identifikasi lainnya).

1
Craig McQueen