Mengapa sudo diperlukan untuk memulai server web pada ip: port yang diberikan?


9

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 atau ifconfig).
  • 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 sudosaat menentukan ip: port.

Pertanyaan: mengapa saya harus menggunakan sudountuk 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?

Jawaban:


11

Hanya proses dengan izin root yang dapat mendengarkan pada port istimewa. Ini adalah konvensi keamanan Unix standar.


Apakah umum untuk memulai webservers menggunakan sudo pada 80? Atau adakah strategi lain untuk menggunakan port> 1024 (mis. 8000, 8080)?
Pemula

@ Begbie00 Ya cukup umum untuk menjalankan server web pada port yang lebih tinggi. Tetapi sebagian besar digunakan untuk server web yang tidak dapat diakses publik di internet, atau berjalan pada mesin di mana pengguna tidak memiliki izin root. Server web yang digunakan untuk pengembangan dan pengujian berjalan hampir secara eksklusif pada port yang tidak memiliki hak istimewa.
Šimon Tóth

2
Sayangnya pernyataan ini tidak sepenuhnya benar untuk sistem unix modern. Lihat jawaban saya untuk detail, tetapi Linux modern misalnya memungkinkan kontrol izin yang lebih halus menggunakan KAPABILITAS. Solaris juga memiliki sistem keamanan berbutir halus yang disebut RBAC. Mekanisme ini memungkinkan untuk menetapkan izin seperti pengikatan ke port khusus untuk pengguna atau program tertentu.
SkyBeam

14

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.

- (internet request) ----> (port 80)[Firewall] ------> (port 8080)[Webserver]

Terkadang pengalihan ini dilakukan dengan menggunakan iptablesaturan NAT:

iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080

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.

setcap CAP_NET_BIND_SERVICE=+ep /some/webserver/binary

Ini akan memungkinkan binaryuntuk mengikat port istimewa bahkan ketika dimulai sebagai dari pengguna non-root. Lihat man capabilitiesuntuk lebih jelasnya.


Apakah kemampuan bagian dari POSIX, atau hanya Linux yang spesifik?
Šimon Tóth

@Let_Me_Be Seperti yang saya mengerti dari en.wikipedia.org/wiki/Capability-based_security POSIX mendefinisikan konsep berbasis kemampuan, tetapi berbeda dengan apa yang telah diterapkan di Linux. Jadi saya pikir kemampuan Linux seperti CAP_NET_BIND_SERVICE hanya untuk Linux.
SkyBeam
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.