การเรียกใช้บริการบนเว็บที่ผูกกับพอร์ต 80 มักไม่ต้องการสิทธิ์พิเศษของ sudoer เนื่องจากพอร์ต 80/443 เป็นพอร์ตระบบหมายความว่าพวกเขาสามารถใช้งานได้โดยผู้ใช้ที่มีสิทธิ์เท่านั้นบริการเหล่านั้นยังสามารถผูกเข้ากับพอร์ตเหล่านี้ได้อย่างไร
การเรียกใช้บริการบนเว็บที่ผูกกับพอร์ต 80 มักไม่ต้องการสิทธิ์พิเศษของ sudoer เนื่องจากพอร์ต 80/443 เป็นพอร์ตระบบหมายความว่าพวกเขาสามารถใช้งานได้โดยผู้ใช้ที่มีสิทธิ์เท่านั้นบริการเหล่านั้นยังสามารถผูกเข้ากับพอร์ตเหล่านี้ได้อย่างไร
คำตอบ:
โดยทั่วไปมีสองวิธีที่แตกต่าง:
เริ่มแรกเริ่มทำงานในฐานะรูทผูกเข้ากับพอร์ตที่มีสิทธิใช้งานจากนั้นเลื่อนลงไปที่ผู้ใช้ที่ไม่มีสิทธิพิเศษ
inetd หรือ xinetd เรียกใช้สิทธิพิเศษและส่งต่อคำขอไปยังเว็บเซิร์ฟเวอร์ที่ทำงานโดยไม่มีสิทธิ์
เนื่องจากพอร์ต 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 อาจไม่สามารถเริ่มต้นได้