Server web mode kernel: Optimalisasi pintar atau mimpi buruk keamanan?

28

Saya sedang membaca utas Peretas Berita di mana satu pengguna memposting tautan dari 2011 yang menjelaskan bahwa IIS jauh lebih cepat daripada kebanyakan server web lainnya (* nix). Pengguna lain menjawab, menjelaskan bahwa IIS mendapatkan keuntungan itu dengan memiliki modul kernel yang disebut HTTP.sys . Sepengetahuan saya, sebagian besar server web populer di 2015 tidak melakukan ini.

Saya tidak akan pernah mau menulis server web mode kernel, karena saya tidak pernah bisa mempercayai diri saya untuk membuatnya bebas dari eksploitasi keamanan (yang akan kurang serius berjalan di cincin perlindungan yang lebih rendah).

Dari sudut pandang insinyur perangkat lunak (berbeda dengan pelanggan untuk server web), apakah menjalankan dalam mode kernel merupakan keputusan kinerja yang cerdas? Bisakah masalah keamanan dikurangi dalam pengembangan aplikasi sampai membuat server mode kernel menjadi laba bersih bagi konsumen?

James Mishra
sumber
5
"Server Fault adalah situs tanya jawab untuk administrator sistem dan jaringan." Sysadmin dan administrator jaringan tidak menulis server web; mereka menginstal dan memeliharanya. Saya pikir pertanyaan tentang mode kernel / mode pengguna jauh lebih relevan pada waktu pengembangan daripada waktu instalasi. Saya tidak keberatan meminta pertanyaan dipindahkan ke tempat yang lebih relevan, tetapi saya merasa Server Fault juga tidak akan menemukannya pada topik.
James Mishra
Ok, membaca ulang pertanyaan itu lagi, saya kira itu dapat ditafsirkan sebagai pertanyaan arsitektur perangkat lunak umum, dan bukan sebagai pertanyaan tentang pro dan kontra dari server web yang ada, jadi menarik kembali suara dekat saya. Tetapi Anda dapat mempertimbangkan untuk mengedit pertanyaan Anda untuk menyoroti aspek arsitektur perangkat lunak umum.
Doc Brown
2
Siapa pun yang berpikir bahwa server web mode kernel dapat meningkatkan kinerja karena tidak harus beralih konteks harus membaca: Nomor latensi yang harus diketahui setiap programmer . Switch konteks penuh dalam Linux membutuhkan biaya sekitar 3000ns ( sumber ), tetapi banyak syscalls sebenarnya tidak memerlukan switch konteks penuh dan dapat mencapai serendah 50ns, saya tidak memiliki nomor untuk Windows. Ini ada di suatu tempat di sepanjang kolom 2/3. Kesimpulan: meminimalkan permintaan jaringan dan disk, jangan khawatir tentang sakelar konteks.
Lie Ryan

Jawaban:

24

Http.sys bukan server web sebagai proxy-forwarder. Dirancang untuk memungkinkan banyak server web hidup berdampingan pada kotak Windows, sehingga Anda dapat membuat IIS menjalankan situs web, tetapi juga beberapa layanan WCF yang berjalan dengan antarmuka http / REST atau SOAP, semuanya pada port standar 80. (inilah sebabnya Anda tidak dapat menjalankan Apache di Windows tanpa sedikit jiggling, Apache belum dimodifikasi untuk bekerja dengan sistem registrasi ini, sayang itu tidak dibuat lebih transparan untuk aplikasi dan memerlukan beberapa modifikasi yang cukup rumit untuk menghubungkannya).

Cara kerjanya adalah bahwa Anda mendaftarkan URL dengan itu dan aplikasi yang sesuai, dan ketika permintaan http dibuat pada port 80, http.sys menerimanya tetapi kemudian meneruskan permintaan ke aplikasi mana pun yang terdaftar untuk menangani target URL itu.


Saya ragu webserver mode kernel masuk akal - bahkan jika kinerja socket dapat ditingkatkan dengan cara ini, untuk melakukan pekerjaan yang bermanfaat, logika aplikasi masih akan dieksekusi di ruang pengguna, jadi selalu ada transisi - Anda ' Saya baru saja menggesernya di sepanjang callstack sedikit.

gbjbaanb
sumber
11
Manfaat utama dari server penuh dalam mode kernel adalah dalam menyajikan file statis: ini dapat dilakukan tanpa beralih ke mode pengguna. Cache juga dimungkinkan.
Jules
3
Saya pikir HTTP.sys berasal dari masa di mana siklus CPU jauh lebih langka ... Bahkan ketika menyajikan file statis kecil (yang merupakan kasus paling menguntungkan untuk HTTP.sys) mode pengguna penuh server HTTP mungkin akan memaksimalkan sebagian besar jaringan .
usr
4
@ usr Http.sys adalah hal yang relatif baru, diperkenalkan pada Windows Server 2003. Saya cukup yakin itu ada di sana sehingga Anda dapat menjalankan banyak layanan API web mendengarkan pada port 80 secara bersamaan.
gbjbaanb
2
@ gbjbaanb server mode pengguna dapat memungkinkan untuk itu juga. Windows memiliki kemampuan untuk berbagi memori (untuk buffer) dan meneruskan pegangan soket ke proses yang berbeda.
usr
1
@JamesMishra Dalam pikiranku, ya. Saat itu CPU mungkin> 10x kurang kuat. Juga, pola pikir keamanan tidak benar-benar ada. Hari ini itu hanya panggilan yang buruk.
usr
14

Http.sys bukan satu-satunya server web mode-kernel yang tersedia: di Linux juga ada tux . Seperti yang telah Anda identifikasi dengan benar, keamanan adalah masalah dengan jenis-jenis server ini, yang menyebabkan tux tidak dimasukkan dalam kernel linux mainline (dan saya percaya tidak diperbarui untuk versi kernel yang lebih baru).

Solusi yang lebih baik adalah penggunaan sistem operasi yang tidak bergantung pada perlindungan perangkat keras untuk menegakkan keamanan proses, misalnya singularitas Microsoft: sistem seperti itu akan memungkinkan peningkatan efisiensi server mode kernel tanpa risiko keamanan. Sayangnya, tidak ada sistem operasi siap produksi berdasarkan prinsip ini yang tersedia pada 2015, dan AFAIK juga tidak ada yang bekerja dengan baik (proyek Singularity dibatalkan).

Jules
sumber
Masalah besar dengan pendekatan Singularitas adalah bahwa itu berarti bahwa tetapi dalam JITter dapat dengan mudah menyebabkan eskalasi hak istimewa.
CodesInChaos
2
Artikel Tux Wikipedia adalah bacaan yang menarik. Tux dapat meneruskan permintaan HTTP untuk konten non-statis ke server web "nyata" seperti Apache, yang kedengarannya seperti apa yang digunakan oleh Http.sys. Saya tidak bisa memastikan apakah Tux sama performannya dengan Http.sys, tetapi berdasarkan sedikit yang saya baca, sepertinya Linux devs kernel akan sangat tidak setuju dengan keputusan Microsoft.
James Mishra
10

Http.sys berisiko rendah, karena tidak dapat menjalankan segala penanganan yang diberikan oleh pihak ke-3.

Http.sys melakukan beberapa tugas.

  • Ini bertindak sebagai proxy-forwarder, sehingga memungkinkan beberapa proses untuk menanggapi permintaan ke berbagai bagian ruang nama HTTP. Jawaban gbjbaanb mencakup ini dengan baik.

  • Ini melayani file statis, langsung dari cache file windows. Ini memberikan kecepatan yang luar biasa untuk file kecil file statis, karena tidak ada sakelar konteks.

  • Ini akan menyimpan hasil dari aplikasi apa pun yang meneruskan permintaan HTTP, dan mengembalikan hasil yang diuangkan. Aplikasi ini dalam kontrol penuh atas berapa lama (jika ada) caching berlangsung.

Http.sys dirancang untuk melakukan tugas-tugas sederhana SANGAT cepat, sambil meneruskan segala sesuatu yang lain ke proses di ruang pengguna.

Menanggapi komentar tersebut

"risiko rendah, karena tidak dapat menjalankan kode apa pun yang disediakan oleh pihak ke-3" - Itulah yang selalu mereka katakan, dan itu hampir tidak pernah benar.

Masalahnya adalah Anda harus mempercayai Microsoft untuk menulis kode kernel yang kompleks untuk mengajukan pertanyaan ini, jika tidak Anda memutuskan untuk tidak menggunakan windows untuk hosting web sama sekali . Http.sys menambahkan sangat sedikit pada risiko bug kernel, mengingat betapa rumitnya kernel itu.

Jika ada sesuatu, Http.sys mengurangi risiko, karena ada pemisahan yang jelas di bawah penyajian web "tingkat rendah" dan kode aplikasi.

Dalam pengaturan yang dirancang dengan baik, mesin (atau server virtual) yang menjalankan server web memiliki akses yang sangat terbatas ke seluruh jaringan, karena merupakan target risiko tinggi. Itu membuat sangat sedikit berbeda jika kernel atau server web mode pengguna diretas, karena server tidak boleh memiliki "hak" lagi di jaringan, maka proses mode pengguna server web perlu melakukan tugasnya.

Ian
sumber
1
Aplikasi Usermode sering ditulis dalam bahasa typesafe yang mengesampingkan sebagian besar bug berbasis kerusakan memori (ini biasanya yang mengarah pada eksekusi kode jauh).
CodesInChaos
3
Saya tidak yakin jika saya membeli argumen bahwa jika saya percaya Microsoft untuk menulis kode kernel, itu adalah lompatan kecil untuk mempercayai mereka untuk menulis kode server web mode kernel. Saya cukup naif dari perspektif keamanan informasi, tetapi saya membayangkan akan jauh lebih mudah untuk mempersenjatai buffer overflow di Http.sys daripada di driver perangkat atau bagian lain dari kernel yang jauh dari Internet.
James Mishra