ทำไม sudo จึงต้องเริ่มต้นเว็บเซิร์ฟเวอร์บนพอร์ต ip:


9

ฉันตั้งค่าเว็บเซิร์ฟเวอร์ที่ใช้ Python ในกล่อง Debian ของฉัน

ติดตั้ง:

  • Debian OS นั้นใช้ VM แต่ฉันได้เปลี่ยน VirtualBox จาก NAT เป็น Bridged
  • IP ของการตั้งค่า VM = 192.168.1.7(สำหรับหน้าจอผู้ดูแลระบบของเราเตอร์หรือifconfig)
  • ฉันได้ตั้งค่าการส่งต่อพอร์ตเราเตอร์ของฉันสำหรับทั้ง ssh และ HTTP สำเร็จแล้ว
  • ฉันตั้งค่าไดนามิก DNS ของเราเตอร์เรียบร้อยแล้วโดยใช้ dyndns.com

โดยไม่คำนึงถึงเฉพาะหลามเว็บเซิร์ฟเวอร์ของฉันใช้ (Django, CherryPy ห้องสมุดมาตรฐาน) ฉันต้องเริ่มต้นเว็บเซิร์ฟเวอร์ @ 192.168.1.7:80 sudoใช้ มิฉะนั้นฉันได้รับข้อผิดพลาดเกี่ยวกับการไม่ได้รับอนุญาตให้เข้าถึงพอร์ต ไม่มีบทเรียนเว็บเซิร์ฟเวอร์ที่กล่าวถึงจำเป็นต้องใช้sudoเมื่อระบุ ip: พอร์ต

คำถาม: ทำไมฉันต้องใช้sudoเพื่อเริ่มต้นเว็บเซิร์ฟเวอร์เหล่านี้? มันเป็นข้อบ่งชี้ว่าฉันไม่ควรใช้192.168.1.7? หรือว่าฉันไม่ได้ตั้งค่าไฟล์ config อย่างเหมาะสมที่ไหน?

คำตอบ:


11

กระบวนการที่มีสิทธิ์รูทเท่านั้นที่สามารถรับฟังพอร์ตที่มีสิทธิพิเศษได้ นี่คือการประชุมความปลอดภัย Unix มาตรฐาน


เป็นเรื่องปกติหรือไม่ที่จะเริ่มใช้เว็บเซิร์ฟเวอร์โดยใช้ sudo บน 80? หรือมีกลยุทธ์อื่นที่ใช้พอร์ต> 1024 (เช่น 8000, 8080)
Begbie00

@ Begbie00 ใช่เป็นเรื่องปกติที่จะเรียกใช้ webservers บนพอร์ตที่สูงกว่า แต่ส่วนใหญ่จะใช้สำหรับเว็บเซิร์ฟเวอร์ที่ไม่สามารถเข้าถึงได้แบบสาธารณะบนอินเทอร์เน็ตหรือทำงานบนเครื่องที่ผู้ใช้ไม่ได้รับอนุญาตรูท เว็บเซิร์ฟเวอร์ที่ใช้สำหรับการพัฒนาและทดสอบใช้งานบนพอร์ตที่ไม่มีสิทธิพิเศษเกือบทั้งหมด
ŠimonTóth

2
น่าเสียดายที่ข้อความนี้ไม่เป็นความจริงอย่างสมบูรณ์สำหรับระบบยูนิกซ์ที่ทันสมัย ดูคำตอบของฉันสำหรับรายละเอียด แต่ลีนุกซ์รุ่นใหม่อนุญาตการควบคุมสิทธิ์ที่ละเอียดยิ่งขึ้นโดยใช้ความสามารถ Solaris ยังมีระบบรักษาความปลอดภัยที่เรียกว่า RBAC กลไกเหล่านี้อนุญาตให้กำหนดสิทธิ์เช่นเชื่อมโยงกับพอร์ตพิเศษให้กับผู้ใช้หรือโปรแกรมที่ต้องการ
SkyBeam

14

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

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

อย่างไรก็ตามสำหรับหลาย ๆ แอปพลิเคชั่นมันเป็นเรื่องธรรมดาในปัจจุบันที่จะทำงานแบบไม่ใช้รูท แต่กระบวนการดังกล่าวแน่นอนไม่สามารถผูกกับพอร์ตที่มีสิทธิ์แล้วในการกำหนดค่ามาตรฐาน ดังนั้นเซิร์ฟเวอร์เช่น Tomcat หรือ JBoss เคยผูกเข้ากับพอร์ตสูงเช่น 8080 แทนดังนั้นพวกเขาจึงไม่ต้องการผู้ฟังที่มีสิทธิพิเศษ

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

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

บางครั้งการเปลี่ยนเส้นทางนี้ทำได้โดยใช้iptablesกฎ NAT:

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

สิ่งนี้ช่วยให้เรียกใช้แอปพลิเคชั่นที่ไม่มีสิทธิพิเศษบนพอร์ต 8080 ในขณะที่คำร้องขอขาเข้าทั้งหมดสำหรับพอร์ต 80 ถูกเปลี่ยนเส้นทางไปยังพอร์ต 8080

อย่างไรก็ตามการใช้เมล็ด Linux ที่ทันสมัยมีความเป็นไปได้อื่น: ใช้ความสามารถ

setcap CAP_NET_BIND_SERVICE=+ep /some/webserver/binary

สิ่งนี้จะอนุญาตให้binaryผูกกับพอร์ตที่มีสิทธิพิเศษแม้เมื่อเริ่มต้นจากผู้ใช้ที่ไม่ใช่รูท ดูman capabilitiesรายละเอียดเพิ่มเติมได้ที่


ความสามารถเป็นส่วนหนึ่งของ POSIX หรือเฉพาะลีนุกซ์เท่านั้น?
ŠimonTóth

@Let_Me_Be ตามที่ฉันเข้าใจจากen.wikipedia.org/wiki/Capability-based_security POSIX กำหนดแนวคิดเกี่ยวกับความสามารถ แต่แตกต่างจากสิ่งที่ใช้ใน Linux ดังนั้นฉันคิดว่าความสามารถของ Linux เช่น CAP_NET_BIND_SERVICE เป็นเฉพาะสำหรับ Linux เท่านั้น
SkyBeam
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.