Saya menyiapkan server web berbasis Python di kotak Debian saya.
Mendirikan:
- OS Debian adalah berbasis VM, tapi saya sudah mengubah VirtualBox dari NAT ke Bridged.
- IP pengaturan VM =
192.168.1.7
(per layar admin router saya atauifconfig
). - Saya telah berhasil mengatur penerusan port router saya untuk ssh dan HTTP.
- Saya telah berhasil mengatur dns dinamis router saya menggunakan dyndns.com.
Terlepas dari server web Python spesifik yang saya gunakan (Django, CherryPy, perpustakaan standar), saya harus memulai server web @ 192.168.1.7:80 menggunakan sudo
. Kalau tidak, saya mendapatkan kesalahan tentang tidak memiliki izin untuk mengakses port. Tidak ada tutorial webserver yang menyebutkan perlu digunakan sudo
saat menentukan ip: port.
Pertanyaan: mengapa saya harus menggunakan sudo
untuk memulai server web ini? Apakah ini merupakan indikasi bahwa saya seharusnya tidak menggunakan 192.168.1.7
? Atau saya tidak mengatur file konfigurasi dengan benar di suatu tempat?
sumber
Ini adalah perilaku standar yang tidak diizinkan bagi pengguna yang tidak memiliki hak istimewa untuk mengikat port istimewa (nomor port di bawah 1024). Oleh karena itu aplikasi yang ingin mengikat ke port 80 misalnya harus menjalankan privilege (biasanya ini berarti dijalankan sebagai root) untuk mengikat ke port ini.
Pendekatan umum adalah menjalankan proses "pendengar" kecil dengan pengguna istimewa yang menerima koneksi dan kemudian memunculkan proses non-istimewa untuk menangani permintaan. Menjatuhkan hak istimewa untuk pemrosesan permintaan dilakukan karena alasan keamanan. Jika seseorang dapat mengeksploitasi proses yang menangani permintaan, maka biasanya itu memungkinkan penyusup untuk mengeksekusi perintah menggunakan hak yang sama dengan proses pemrosesan. Oleh karena itu akan buruk untuk menangani seluruh permintaan menggunakan proses istimewa.
Namun untuk banyak aplikasi saat ini umum dijalankan sebagai non-root; tetapi proses seperti itu tentu saja tidak dapat mengikat ke port privilege kemudian dalam konfigurasi standar. Jadi server seperti Tomcat atau JBoss digunakan untuk mengikat ke port tinggi seperti 8080 sehingga mereka tidak perlu pendengar istimewa.
Tentu saja jika Anda mengekspos proses seperti itu ke internet, Anda kemungkinan besar akan memberikan akses pada port 80 karena setiap browser pertama-tama akan mencoba untuk terhubung ke port 80 ketika protokol HTTP digunakan. Cara umum untuk menyediakan ini adalah dengan menggunakan firewall atau port-translator di antara aplikasi dan internet publik. Jadi permintaan mengenai firewall meminta port 80 tetapi firewall meneruskan permintaan ke beberapa host internal pada port 8080. Dengan cara ini server web yang sebenarnya dapat beroperasi pada port-tinggi sementara tersedia untuk umum pada port 80.
Terkadang pengalihan ini dilakukan dengan menggunakan
iptables
aturan NAT:Ini memungkinkan menjalankan aplikasi yang tidak privat mendengarkan pada port 8080 sementara semua permintaan masuk untuk port 80 hanya dialihkan ke port 8080.
Namun menggunakan kernel Linux modern ada kemungkinan lain: Gunakan kemampuan.
Ini akan memungkinkan
binary
untuk mengikat port istimewa bahkan ketika dimulai sebagai dari pengguna non-root. Lihatman capabilities
untuk lebih jelasnya.sumber