แม้ว่า 80 และ 443 เป็นพอร์ตของระบบเว็บเซิร์ฟเวอร์ส่วนใหญ่สามารถผูกกับมันได้อย่างไร


18

การเรียกใช้บริการบนเว็บที่ผูกกับพอร์ต 80 มักไม่ต้องการสิทธิ์พิเศษของ sudoer เนื่องจากพอร์ต 80/443 เป็นพอร์ตระบบหมายความว่าพวกเขาสามารถใช้งานได้โดยผู้ใช้ที่มีสิทธิ์เท่านั้นบริการเหล่านั้นยังสามารถผูกเข้ากับพอร์ตเหล่านี้ได้อย่างไร



1
"โดยปกติไม่ต้องการสิทธิ์ sudoer" ไม่ถูกต้อง
tedder42

คำตอบ:


29

โดยทั่วไปมีสองวิธีที่แตกต่าง:

  1. เริ่มแรกเริ่มทำงานในฐานะรูทผูกเข้ากับพอร์ตที่มีสิทธิใช้งานจากนั้นเลื่อนลงไปที่ผู้ใช้ที่ไม่มีสิทธิพิเศษ

  2. inetd หรือ xinetd เรียกใช้สิทธิพิเศษและส่งต่อคำขอไปยังเว็บเซิร์ฟเวอร์ที่ทำงานโดยไม่มีสิทธิ์


3
บน Linux คุณยังสามารถใช้ความสามารถ CAP_NET_BIND_SERVICE กับโปรแกรมหรือคุณสามารถใช้ iptables เพื่อเปลี่ยนเส้นทางพอร์ตระบบไปยังพอร์ตปกติ
Zan Lynx

10
และเพียงชี้แจงให้ชัดเจนสำหรับ OP: เหตุผลที่ตัวเลือก # 1 ทำงานได้เนื่องจากเมื่อกระบวนการลดสิทธิพิเศษพวกเขาจะได้รับอนุญาตให้เก็บคำอธิบายไฟล์แบบเปิดแม้ว่าพวกเขาจะไม่ได้รับอนุญาตให้เปิดเป็นครั้งที่สองก็ตาม
strugee

นอกจากนี้ยังมีAuthbind
Boris the Spider

5

เนื่องจากพอร์ต 80/443 เป็นพอร์ตระบบหมายความว่าผู้ใช้ที่มีสิทธิใช้งานสามารถใช้งานได้เท่านั้น

ฉันคิดว่าคุณผิด ทุกคนสามารถใช้พอร์ตเหล่านี้ได้ การผูกไว้กับพวกเขาเป็นการดำเนินการที่ได้รับสิทธิพิเศษ

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

ฉันจะสาธิตด้วย netcat

ในฐานะผู้ใช้ธรรมดาฉันไม่สามารถผูกกับพอร์ต 80:

$ nc -l -p 80
Can't grab 0.0.0.0:80 with bind : Permission denied

ฉันสามารถผูกกับพอร์ต 8080:

$ nc -l -p 8080

ในอีกเทอร์มินัลอื่นฉันสามารถเชื่อมต่อกับพอร์ต 80 และส่งข้อมูลบางอย่างและเห็นมันปรากฏที่ส่วนท้ายของเซิร์ฟเวอร์ที่ฉันเพิ่งเริ่ม:

$ nc 127.0.0.1 8080 <<<"Hello world"

หากฉันต้องการผูกกับพอร์ต 80 ฉันต้องเป็นรูท:

$ sudo nc -l -p 80

หรือฉันสามารถกำหนดCAP_NET_BIND_SERVICEความสามารถให้กับncไบนารี:

$ cp `which nc` .
$ sudo setcap 'cap_net_bind_service=+ep' ./nc
$ ./nc -l -p 80

อีกทางเลือกหนึ่งคือการเขียนโปรแกรมเซิร์ฟเวอร์หลังจากนั้นจะเรียกว่าlisten()มันลดสิทธิ์ของรูท นี่เป็นวิธีการแก้ปัญหาที่ค่อนข้างธรรมดาและคุณจะเห็นด้วยดีมอนส่วนใหญ่ ตัวอย่างเช่น Apache เริ่มต้นจาก init เป็นรูทแล้วปล่อยสิทธิ์รูทและกลายเป็นผู้ใช้www-dataหรือสิ่งที่คล้ายกันเมื่อถูกผูกไว้กับพอร์ต 80 ลองใช้งาน/etc/init.d/apache startโดยไม่รูทและ Apache อาจไม่สามารถเริ่มต้นได้


คำถามที่ว่า "ผูกกับพอร์ตเหล่านี้" ทำไมคุณคิดว่าเขาผิด
บาร์มาร์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.