เว็บเซิร์ฟเวอร์โหมดเคอร์เนล: การเพิ่มประสิทธิภาพที่ฉลาดหรือฝันร้ายด้านความปลอดภัย?


28

ฉันอ่านเธรด Hacker Newsที่ผู้ใช้รายหนึ่งโพสต์ลิงก์จาก 2011 อธิบายว่าIIS เร็วกว่าเว็บเซิร์ฟเวอร์ (* nix) ส่วนใหญ่ ตอบกลับผู้ใช้คนอื่นอธิบายว่า IIS ได้รับประโยชน์ที่โดยมีเคอร์เนลโมดูลที่เรียกว่า HTTP.sys ตามความรู้ของฉันเว็บเซิร์ฟเวอร์ยอดนิยมอื่น ๆ ส่วนใหญ่ในปี 2015 ไม่ได้ทำเช่นนี้

ฉันจะไม่ต้องการเขียนเว็บเซิร์ฟเวอร์ในโหมดเคอร์เนลเพราะฉันไม่สามารถเชื่อใจตัวเองได้ว่าจะทำให้ปราศจากช่องโหว่ด้านความปลอดภัย (ซึ่งจะทำงานน้อยลงในวงแหวนป้องกันที่ต่ำกว่า)

จากมุมมองของวิศวกรซอฟต์แวร์ (เมื่อเทียบกับลูกค้าสำหรับเว็บเซิร์ฟเวอร์) การทำงานในโหมดเคอร์เนลเป็นการตัดสินใจที่มีประสิทธิภาพหรือไม่? ความกังวลด้านความปลอดภัยสามารถลดลงในการพัฒนาแอปพลิเคชันจนถึงจุดที่ทำให้เซิร์ฟเวอร์โหมดเคอร์เนลเป็นกำไรสุทธิสำหรับผู้บริโภคได้หรือไม่?


5
"Server Fault เป็นคำถามและคำตอบสำหรับผู้ดูแลระบบและเครือข่าย" Sysadmins และผู้ดูแลระบบเครือข่ายไม่ได้เขียนเว็บเซิร์ฟเวอร์ พวกเขาติดตั้งและบำรุงรักษา ฉันคิดว่าคำถามของโหมดเคอร์เนล / โหมดผู้ใช้มีความเกี่ยวข้องในเวลาการพัฒนามากกว่าเวลาการติดตั้ง ฉันไม่สนใจที่คำถามจะถูกย้ายไปที่ไหนสักแห่งที่มีความเกี่ยวข้องมากกว่า แต่ฉันรู้สึกว่า Server Fault ไม่สามารถหาได้ในหัวข้อเดียวกัน
James Mishra

ตกลงอ่านคำถามอีกครั้งฉันคิดว่ามันสามารถตีความได้ว่าเป็นคำถามสถาปัตยกรรมซอฟต์แวร์ทั่วไปและไม่ใช่คำถามเกี่ยวกับข้อดีข้อเสียของเว็บเซิร์ฟเวอร์ที่มีอยู่ดังนั้นจึงถอนการโหวตอย่างใกล้ชิดของฉัน แต่คุณอาจพิจารณาแก้ไขคำถามของคุณเพื่อเน้นด้านสถาปัตยกรรมซอฟต์แวร์ทั่วไป
Doc Brown

2
ใครก็ตามที่คิดว่าเว็บโหมดเคอร์เนลเซิร์ฟเวอร์สามารถปรับปรุงประสิทธิภาพเพราะมันไม่ได้มีการเปลี่ยนบริบทควรอ่าน: ตัวเลขแฝงโปรแกรมเมอร์ทุกคนควรรู้ การสลับบริบทแบบเต็มใน Linux มีราคาประมาณ 3000ns (ที่มา ) แต่ syscalls จำนวนมากไม่จำเป็นต้องใช้การสลับบริบทแบบเต็มและสามารถไปได้ต่ำสุดถึง 50ns ฉันไม่มีตัวเลขสำหรับ Windows นี่คือที่ใดที่หนึ่งในคอลัมน์ที่ 2/3 สรุป: ลดคำขอเครือข่ายและดิสก์ไม่ต้องกังวลกับการสลับบริบท
โกหกไรอัน

คำตอบ:


24

Http.sys ไม่ใช่เว็บเซิร์ฟเวอร์ในฐานะผู้ส่งต่อพร็อกซี มันออกแบบมาเพื่ออนุญาตให้เว็บเซิร์ฟเวอร์หลายตัวมีอยู่บนกล่อง Windows ดังนั้นคุณสามารถให้ IIS ใช้งานเว็บไซต์ได้ แต่ยังมีบริการ WCF หลายตัวที่ทำงานด้วยอินเตอร์เฟส HTTP / REST หรือ SOAP ทั้งหมดบนพอร์ตมาตรฐาน 80 (นี่คือเหตุผลที่คุณ ไม่สามารถเรียกใช้ Apache บน Windows โดยไม่มีการกระตุกเล็กน้อย Apache ไม่ได้รับการแก้ไขให้ทำงานกับระบบการลงทะเบียนนี้ได้เนื่องจากมันไม่ได้ทำให้แอพพลิเคชั่นมีความโปร่งใสมากขึ้น

วิธีการทำงานคือคุณลงทะเบียน URL ด้วยและแอพพลิเคชั่นที่เกี่ยวข้องตอบเมื่อมีการร้องขอ HTTP ในพอร์ต 80, http.sys ยอมรับ แต่จะส่งคำร้องขอไปยังแอปพลิเคชันที่ลงทะเบียนเพื่อจัดการกับเป้าหมาย URL นั้น


ฉันสงสัยว่าเว็บเซิร์ฟเวอร์ในโหมดเคอร์เนลไม่มีเหตุผล - แม้ว่าประสิทธิภาพของซ็อกเก็ตจะได้รับการปรับปรุงด้วยวิธีนี้เพื่อที่จะทำงานที่มีประโยชน์ใด ๆ ตรรกะของแอปพลิเคชันจะยังคงถูกดำเนินการในพื้นที่ของผู้ใช้ เพิ่งขยับมันไปตาม callstack นิดหน่อย


11
ประโยชน์หลักของเซิร์ฟเวอร์เต็มรูปแบบในโหมดเคอร์เนลอยู่ในการให้บริการไฟล์คงที่: สามารถทำได้โดยไม่ต้องเปลี่ยนไปใช้โหมดผู้ใช้ การแคชก็เป็นไปได้เช่นกัน
จูลส์

3
ฉันคิดว่า HTTP.sys มาจากช่วงเวลาที่รอบการทำงานของ CPU นั้นหายากมาก ... แม้ในขณะที่ให้บริการไฟล์สแตติกขนาดเล็ก (ซึ่งเป็นกรณีที่ได้เปรียบที่สุดสำหรับ HTTP.sys) เซิร์ฟเวอร์โหมดผู้ใช้ HTTP อย่างเต็มรูปแบบ .
usr

4
@usr Http.sys เป็นสิ่งที่ค่อนข้างใหม่นำมาใช้ใน Windows Server 2003 ฉันค่อนข้างแน่ใจว่ามันมีดังนั้นคุณสามารถเรียกใช้บริการเว็บ API จำนวนมากฟังบนพอร์ต 80 พร้อมกัน
gbjbaanb

2
@gbjbaanb เซิร์ฟเวอร์โหมดผู้ใช้สามารถอนุญาตได้เช่นกัน Windows มีความสามารถในการแบ่งปันหน่วยความจำ (สำหรับบัฟเฟอร์) และส่งผ่านหมายเลขอ้างอิงซ็อกเก็ตไปยังกระบวนการอื่น
usr

1
@ JamesMishra ในใจของฉันใช่ เมื่อก่อนซีพียูอาจมีพลังน้อยกว่าถึง 10 เท่า ความคิดเรื่องความปลอดภัยก็ไม่ได้อยู่ที่นั่นจริงๆ วันนี้มันแค่โทรไม่ดี
usr

14

Http.sys ไม่ได้เป็นโหมดเคอร์เนลเว็บเซิร์ฟเวอร์เดียวที่มีอยู่: ภายใต้ Linux นอกจากนี้ยังมีทักซิโด ตามที่คุณระบุไว้อย่างถูกต้องความปลอดภัยเป็นเรื่องเกี่ยวกับเซิร์ฟเวอร์ประเภทนี้ซึ่งนำไปสู่ ​​tux ที่ไม่ได้รวมอยู่ในเคอร์เนล mainline linux (และฉันเชื่อว่าไม่ได้รับการอัพเดตสำหรับเคอร์เนลเวอร์ชันล่าสุด)

ทางออกที่ดีกว่าคือการใช้ระบบปฏิบัติการที่ไม่ต้องอาศัยการป้องกันฮาร์ดแวร์ในการบังคับใช้กระบวนการรักษาความปลอดภัยเช่นเอกพจน์ของ Microsoft: ระบบดังกล่าวจะช่วยให้ประสิทธิภาพเพิ่มขึ้นของเซิร์ฟเวอร์โหมดเคอร์เนลโดยไม่มีความเสี่ยงด้านความปลอดภัย น่าเสียดายที่ไม่มีระบบปฏิบัติการที่พร้อมใช้งานจริงบนพื้นฐานของหลักการนี้ในปี 2558 และไม่มีใคร AFAIK ทำงานอย่างจริงจังกับระบบใดโครงการหนึ่ง (โครงการเอกพจน์ถูกยกเลิก)


ปัญหาใหญ่ด้วยวิธีเอกพจน์คือมันหมายความว่า แต่ใน JITter สามารถนำไปสู่การเพิ่มสิทธิพิเศษได้อย่างง่ายดาย
CodesInChaos

2
บทความ Tux Wikipedia เป็นการอ่านที่น่าสนใจ Tux สามารถส่งต่อคำขอ HTTP สำหรับเนื้อหาที่ไม่คงที่ไปยังเว็บเซิร์ฟเวอร์ "ของจริง" เช่น Apache ซึ่งฟังดูเหมือนว่า Http.sys ใช้สำหรับอะไร ฉันไม่สามารถบอกได้ว่าทักซ์เป็นนักแสดงเหมือน Http.sys แต่จากสิ่งที่ฉันอ่านมาเล็กน้อยดูเหมือนว่า Linux kernel devs จะไม่เห็นด้วยอย่างมากกับการตัดสินใจของ Microsoft
James Mishra

10

Http.sys มีความเสี่ยงต่ำเนื่องจากไม่สามารถเรียกใช้การรับมือใด ๆ จากบุคคลที่สามได้

Http.sys ทำงานบางอย่าง

  • มันทำหน้าที่เป็นผู้ส่งต่อพร็อกซีดังนั้นการอนุญาตให้หลายกระบวนการตอบสนองต่อการร้องขอไปยังส่วนต่าง ๆ ของพื้นที่ชื่อ HTTP คำตอบ gbjbaanb ครอบคลุมดีนี้

  • มันทำหน้าที่ไฟล์คงที่โดยตรงจากแคชไฟล์ windows สิ่งนี้ให้การเร่งความเร็วที่ยอดเยี่ยมสำหรับไฟล์สแตติกไฟล์ขนาดเล็กเนื่องจากไม่มีการสลับบริบท

  • มันจะแคชเอาต์พุตจากแอ็พพลิเคชันใด ๆ ที่ส่งต่อคำร้องขอ HTTP ไปที่และส่งคืนผลลัพธ์ที่เป็นเงินสด แอปพลิเคชั่นอยู่ในการควบคุมอย่างสมบูรณ์ว่าแคชนานเท่าใด (ถ้ามี)

Http.sys ถูกออกแบบมาเพื่อทำงานง่าย ๆ เร็วมากในขณะที่ส่งทุกอย่างไปยังกระบวนการในพื้นที่ของผู้ใช้

เพื่อตอบสนองต่อความคิดเห็น

"ความเสี่ยงต่ำเนื่องจากไม่สามารถเรียกใช้รหัสใด ๆ ที่จัดทำโดยบุคคลที่สาม" - นั่นคือสิ่งที่พวกเขาพูดเสมอและแทบไม่เคยเป็นจริงเลย

ปัญหาคือคุณต้องเชื่อว่า Microsoft จะเขียนรหัสเคอร์เนลที่ซับซ้อนเพื่อถามคำถามนี้มิฉะนั้นคุณตัดสินใจที่จะไม่ใช้ windows สำหรับการโฮสต์เว็บเลย Http.sys เพิ่มความเสี่ยงของข้อบกพร่องเคอร์เนลน้อยมากเนื่องจากความซับซ้อนของเคอร์เนลอยู่แล้ว

หากมีสิ่งใด Http.sys ช่วยลดความเสี่ยงเนื่องจากมีการแยกอย่างชัดเจนด้านล่าง "ระดับต่ำ" การให้บริการเว็บและรหัสแอปพลิเคชัน

ในการตั้งค่าที่ออกแบบมาอย่างดีเครื่อง (หรือเซิร์ฟเวอร์เสมือน) ที่เรียกใช้เว็บเซิร์ฟเวอร์นั้นมีการเข้าถึงเครือข่ายที่เหลือ จำกัด อย่าง จำกัด เนื่องจากเป็นเป้าหมายที่มีความเสี่ยงสูง มันแตกต่างกันเล็กน้อยหากเคอร์เนลหรือเว็บเซิร์ฟเวอร์โหมดผู้ใช้แฮ็กเนื่องจากเซิร์ฟเวอร์ไม่ควรมี "สิทธิ" เพิ่มเติมในเครือข่ายจากนั้นกระบวนการโหมดผู้ใช้เว็บเซิร์ฟเวอร์จะต้องทำงาน


1
แอ็พพลิเคชัน Usermode มักจะเขียนในภาษา typesafe ซึ่งออกกฎข้อบกพร่องส่วนใหญ่ของหน่วยความจำตามข้อบกพร่อง (เหล่านี้มักจะนำไปสู่
CodesInChaos

3
ฉันไม่แน่ใจว่าถ้าฉันซื้ออาร์กิวเมนต์ที่ถ้าฉันเชื่อว่า Microsoft จะเขียนรหัสเคอร์เนลมันเป็นกระโดดเล็ก ๆ ที่จะไว้วางใจพวกเขาในการเขียนรหัสโหมดเว็บเคอร์เนลเว็บเซิร์ฟเวอร์ ฉันค่อนข้างไร้เดียงสาจากมุมมองด้านความปลอดภัยของข้อมูล แต่ฉันคิดว่ามันจะง่ายกว่าการใช้อาวุธบัฟเฟอร์ล้นใน Http.sys ง่ายกว่าในไดรเวอร์อุปกรณ์หรือส่วนอื่น ๆ ของเคอร์เนลห่างจากอินเทอร์เน็ต
James Mishra
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.