Saya telah mencari Google tentang solusi untuk beberapa waktu, tetapi tidak dapat menemukan jawaban.
Saya di Ubuntu Linux dan ingin menjalankan server pada port 80, tetapi karena mekanisme keamanan Ubuntu, saya mendapatkan kesalahan berikut:
java.net.BindException: Izin ditolak: 80
Saya pikir itu harus cukup sederhana untuk menonaktifkan mekanisme keamanan ini sehingga port 80 tersedia untuk semua pengguna atau untuk menetapkan hak yang diperlukan untuk pengguna saat ini untuk mengakses port 80.
Jawaban:
Jawaban singkat: Anda tidak bisa. Port di bawah 1024 hanya bisa dibuka oleh root. Sesuai komentar - well, Anda bisa, menggunakan CAP_NET_BIND_SERVICE , tetapi pendekatan itu, yang diterapkan ke java bin akan membuat program java apa pun untuk dijalankan dengan pengaturan ini, yang tidak diinginkan, jika bukan risiko keamanan.
Jawaban panjangnya: Anda dapat mengalihkan koneksi pada port 80 ke beberapa port lain yang dapat Anda buka sebagai pengguna normal.
Jalankan sebagai root:
Karena perangkat loopback (seperti localhost) tidak menggunakan aturan prerouting, jika Anda perlu menggunakan localhost, dll., Tambahkan aturan ini juga ( terima kasih @Francesco ):
CATATAN: Solusi di atas tidak cocok untuk sistem multi-pengguna, karena setiap pengguna dapat membuka port 8080 (atau port tinggi lainnya yang Anda putuskan untuk digunakan), sehingga mengganggu lalu lintas. (Kredit untuk CesarB ).
EDIT: sesuai pertanyaan komentar - untuk menghapus aturan di atas:
Ini akan menampilkan sesuatu seperti:
Aturan yang Anda minati adalah nr. 2, jadi untuk menghapusnya:
sumber
sudo iptables --list
. Saya tahu apa itu iptables dan apa yang saya lakukan, tetapi saya belum pernah menggunakannya sebelumnya.Gunakan authbind .
Ia bahkan bekerja dengan Java jika Anda mengaktifkan stack Java-IPv4 saja. Saya menggunakan:
sumber
AUTHBIND=yes
di / etc / default / tomcat6authbind
untuk benar-benar membiarkan ini terjadi. Dari halaman manual: "/ etc / authbind / byport / port diuji. Jika file ini dapat diakses untuk dieksekusi ke pengguna panggilan, sesuai dengan akses (2), maka mengikat ke port itu sah." , misalnya untuk port 80sudo touch /etc/authbind/byport/80 ; sudo chmod 777 /etc/authbind/byport/80
,. Pemasangan awalauthbind
umumnya tidak memiliki otorisasi pra-konfigurasi.Jika sistem Anda mendukungnya, Anda mungkin dapat menggunakan kapabilitas. Lihat kapabilitas man, yang Anda butuhkan adalah CAP_NET_BIND_SERVICE.
Pada Debian / Ubuntu yang lebih baru Anda dapat menjalankan:
sumber
Solusi lain adalah membuat setuid aplikasi Anda sehingga dapat mengikat dengan port 80. Sebagai root, lakukan hal berikut
Ingatlah bahwa melakukan hal ini, kecuali jika dilakukan dengan benar, akan membuat Anda menghadapi celah keamanan potensial, karena aplikasi Anda akan berbicara dengan jaringan, dan akan berjalan dengan hak root penuh. Jika Anda mengambil solusi ini, Anda harus melihat kode sumber untuk Apache atau Lighttpd atau yang serupa, di mana mereka menggunakan hak akses root untuk membuka port, tetapi kemudian segera menyerahkan privs itu dan "menjadi" pengguna dengan hak istimewa lebih rendah sehingga pembajak tidak dapat mengambil alih seluruh komputer Anda.
Pembaruan: Seperti yang terlihat dalam pertanyaan ini , tampaknya kernel Linux sejak 2.6.24 memiliki kemampuan baru yang memungkinkan Anda untuk menandai sebuah executable (tapi bukan skrip, tentu saja) sebagai memiliki
CAP_NET_BIND_SERVICE
kapabilitas " ". Jika Anda menginstal paket debian "libcap2-bin", Anda dapat melakukannya dengan mengeluarkan perintahsumber
Saya cukup menggunakan Nginx di depan. Itu dapat berjalan di localhost juga.
apt-get install nginx
.. atau ..
pkg_add -r nginx
.. atau apa pun yang sesuai dengan OS Anda.
Yang Anda butuhkan di nginx.conf, jika dijalankan di localhost, adalah:
sumber
Pendekatan yang diajukan oleh Sunny dan CesarB:
berfungsi dengan baik tetapi memiliki kelemahan kecil - itu tidak mencegah pengguna untuk terhubung langsung ke port 8080, bukan 80.
Pertimbangkan skenario berikut ketika ini bisa menjadi masalah.
Katakanlah kita memiliki server yang menerima koneksi HTTP pada port 8080 dan koneksi HTTPS pada port 8181.
Kami menggunakan iptables untuk menetapkan pengalihan berikut:
Sekarang, misalkan server kami memutuskan untuk mengalihkan pengguna dari halaman HTTP ke halaman HTTPS. Kecuali jika kita dengan hati-hati menulis ulang responsnya, itu akan dialihkan ke
https://host:8181/
. Pada titik ini, kita kacau:https://host:8181/
URL dan kami perlu mempertahankan URL ini untuk menghindari melanggar bookmark mereka.Saya menggunakan pendekatan berikut:
Digabungkan dengan aturan REJECT default pada rantai INPUT, pendekatan ini mencegah pengguna untuk terhubung langsung ke port 8080, 8181
sumber
Secara tradisional pada Unix, hanya root yang dapat mengikat port rendah (<1024).
Cara paling sederhana untuk mengatasi ini adalah dengan menjalankan server Anda pada port tinggi (misalnya, 8080) dan menggunakan aturan iptables sederhana untuk meneruskan koneksi dari port 80 ke port 8080. Perhatikan bahwa dengan ini Anda kehilangan perlindungan ekstra dari port rendah; setiap pengguna di komputer Anda dapat mengikat ke port 8080.
sumber
Jika sistem Anda mendukungnya, Anda mungkin dapat menggunakan kapabilitas. Lihat
man capabilities
, yang Anda butuhkan adalahCAP_NET_BIND_SERVICE
. Tidak, saya belum pernah menggunakannya sendiri dan saya tidak tahu apakah mereka benar-benar berfungsi :-)sumber
Gunakan proxy terbalik (nginx, apache + mod_proxy) atau proxy reverse caching (Squid, Varnish) di depan server aplikasi Anda!
Dengan proxy terbalik Anda dapat mencapai banyak hal menarik seperti:
sumber
Anda dapat menggunakan program redir:
sumber
Gunakan sudo.
Konfigurasikan sudo agar pengguna biasa dapat menjalankan perintah yang sesuai:
Atau
Atau
Atau
(Atau perintah / skrip apa pun yang Anda gunakan untuk memulai / menghentikan server / aplikasi tertentu Anda)
sumber
jawaban cerah benar, tetapi Anda mungkin menghadapi masalah tambahan karena antarmuka loopback tidak menggunakan tabel PREROUTING,
jadi aturan iptables yang ditambahkan adalah dua:
sumber
Dengan Linux, Anda memiliki dua opsi lain:
Kedua ekstensi ke kernel Linux memungkinkan untuk memberikan hak akses pada tingkat yang sangat halus. Ini akan memungkinkan Anda untuk memberikan proses ini untuk membuka port 80 tetapi tidak akan mewarisi hak root lainnya.
Dari apa yang saya dengar, grsecurity jauh lebih mudah digunakan tetapi SELinux lebih aman.
sumber
Salah satu solusinya adalah dengan menggunakan iptables untuk melakukan PAT pada paket untuk port 80. Anda dapat menggunakan ini untuk merutekan paket ke port 8080 lokal, misalnya. Pastikan dan sesuaikan paket keluar kembali ke port 80.
Dalam pengalaman saya, fitur perizinan berbutir halus dari Linux tidak dikompilasi menjadi kernel standar karena masalah keamanan.
sumber
Jika Anda mencoba melakukan ini sehingga perintah yang dijalankan pengguna dapat menggunakan port 80, maka satu-satunya solusi Anda adalah trik iptables atau pengaturan setuid-to-root yang dapat dieksekusi.
Cara sesuatu seperti Apache melakukan ini (ia mengikat ke port 80, tetapi berjalan sebagai orang lain selain root) adalah menjalankan sebagai root, mengikat ke port, kemudian mengubah kepemilikan proses ke pengguna yang tidak memiliki hak istimewa setelah port. sudah diatur. Jika aplikasi yang Anda tulis dapat dijalankan oleh root, Anda dapat membuatnya mengubah pemilik menjadi pengguna non-privat setelah port diatur. Tetapi jika ini hanya untuk pengguna biasa berjalan dari baris perintah, maka Anda harus menggunakan salah satu solusi lain.
sumber
Ketika saya memiliki berbagai aplikasi penyajian web (skrip python, mesin kucing jantan, ...) yang saya tidak ingin jalankan sebagai root, saya biasanya mengkonfigurasi server web apache di depannya. Apache mendengarkan port 80, dan kucing jantan mendengarkan 8080.
Di apache: s config:
Lihat dokumentasi mod-proxy untuk info lebih lanjut: http://httpd.apache.org/docs/2.2/mod/mod_proxy.html
sumber
Saya pikir solusi terbaik adalah dengan sgid aplikasi Anda dan segera setelah port-nya terikat, ia harus melepaskan hak istimewa dengan beralih ke pengguna lain.
sumber
Beberapa sistem host tidak memungkinkan untuk menggunakan modul NAT, 'iptables' tidak menyelesaikan masalah dalam kasus ini.
Bagaimana dengan xinetd?
Dalam kasus saya (ubuntu 10.04)
Rekatkan konfigurasi:
Kemudian:
http://docs.codehaus.org/display/JETTY/port80 menjelaskan lebih baik.
sumber
Sebagai tambahan, FreeBSD dan Solaris (ada yang ingat itu ?) Membiarkan Anda melakukan ini (mengikat port rendah) tanpa eskalasi hak istimewa (yaitu, menggunakan program untuk beralih ke root). Karena Anda menentukan Linux, saya hanya memposting ini sebagai pemberitahuan kepada orang lain yang mungkin menemukan pertanyaan ini.
sumber
Necromancing.
Sederhana. Dengan kernel normal atau lama, Anda tidak.
Seperti yang ditunjukkan oleh yang lain, iptables dapat meneruskan sebuah port.
Seperti yang ditunjukkan oleh yang lain, CAP_NET_BIND_SERVICE juga dapat melakukan pekerjaan itu.
Tentu saja CAP_NET_BIND_SERVICE akan gagal jika Anda meluncurkan program Anda dari skrip, kecuali jika Anda menetapkan batas pada penerjemah shell, yang tidak ada gunanya, Anda bisa menjalankan layanan Anda sebagai root ...
misalnya untuk Java, Anda harus menerapkannya ke JAVA JVM
Jelas, itu berarti setiap program Java dapat mengikat port sistem.
Dito untuk mono / .NET.
Saya juga cukup yakin xinetd bukan yang terbaik dari ide.
Tetapi karena kedua metode ini adalah peretasan, mengapa tidak hanya mengangkat batas dengan mengangkat batasan?
Tidak ada yang mengatakan Anda harus menjalankan kernel normal, jadi Anda bisa menjalankan kernel Anda sendiri.
Anda cukup mengunduh sumber untuk kernel terbaru (atau yang sama dengan yang Anda miliki saat ini). Setelah itu, Anda pergi ke:
Di sana Anda mencari baris ini
dan ubah ke
jika Anda tidak ingin memiliki situasi ssh tidak aman, Anda mengubahnya menjadi ini: #define PROT_SOCK 24
Secara umum, saya akan menggunakan pengaturan terendah yang Anda butuhkan, misalnya 79 untuk http, atau 24 saat menggunakan SMTP pada port 25.
Itu saja.
Kompilasi kernel, dan instal.
Mulai ulang.
Selesai - batas bodoh itu PERLU, dan itu juga berfungsi untuk skrip.
Inilah cara Anda mengompilasi kernel:
https://help.ubuntu.com/community/Kernel/Compile
Singkatnya, gunakan iptables jika Anda ingin tetap aman, kompilasi kernel jika Anda ingin memastikan pembatasan ini tidak pernah mengganggu Anda lagi.
sumber
sudo setcap cap_net_bind_service=+ep /path-to-java/java
) tetapi saya selalu mengertijava: error while loading shared libraries: libjli.so: cannot open shared object file: No such file or directory
jika java memiliki set caps. lihat juga bagian pertama dari unix.stackexchange.com/a/16670/55508<javahome>/lib/amd64/jli/
keld.so.conf
dan berjalansudo ldconfig