Mặc dù 80 và 443 là cổng hệ thống, làm thế nào hầu hết các máy chủ web có thể liên kết với chúng?


18

Chạy một dịch vụ web liên kết với cổng 80 thường không yêu cầu đặc quyền sudoer. Vì các cổng 80/443 là các cổng hệ thống, có nghĩa là chúng chỉ có thể được sử dụng bởi người dùng đặc quyền, tại sao các dịch vụ đó vẫn có thể liên kết với các cổng này?



1
"thường không yêu cầu đặc quyền sudoer" là không chính xác.
tedder42

Câu trả lời:


29

Về cơ bản có hai cách tiếp cận khác nhau:

  1. Ban đầu bắt đầu chạy với quyền root, liên kết với cổng đặc quyền và sau đó thả xuống một người dùng không có đặc quyền.

  2. inetd hoặc xinetd chạy đặc quyền và chuyển tiếp các yêu cầu đến máy chủ web chạy không có đặc quyền.


3
Trên Linux, bạn cũng có thể áp dụng khả năng của CAP_NET_BIND_SERVICE cho chương trình hoặc bạn có thể sử dụng iptables để chuyển hướng một cổng hệ thống sang một cổng thông thường.
Zan Lynx

10
và chỉ cần làm rõ cho OP: lý do mà tùy chọn # 1 hoạt động là vì khi các quy trình giảm đặc quyền, họ được phép giữ lại các mô tả tệp đang mở - ngay cả khi họ không được phép mở chúng lần thứ hai.
strugee

Ngoài ra còn có Authbind .
nhện của

5

Vì cổng 80/443 là cổng hệ thống, có nghĩa là chúng chỉ có thể được sử dụng bởi người dùng đặc quyền

Tôi nghĩ bạn có nó sai. Bất cứ ai cũng có thể sử dụng các cổng này. Liên kết với họ là một hoạt động đặc quyền.

Lý do ở đây là một số người dùng Joe không thể viết một máy chủ web độc hại và sau đó tạo một số máy chủ lưu trữ mà anh ta không có bất kỳ quyền quản trị nào. Tất nhiên đây là một mô hình khá yếu, thường không có gì ngăn cản Joe đưa máy tính của mình lên mạng và anh ta có thể có quyền quản trị đối với bất kỳ máy nào mà anh ta có quyền truy cập vật lý.

Tôi sẽ làm một cuộc biểu tình với netcat.

Là người dùng bình thường, tôi không thể liên kết với cổng 80:

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

Tôi có thể liên kết với cổng 8080:

$ nc -l -p 8080

Trong khi đó ở một thiết bị đầu cuối khác, tôi có thể kết nối với cổng 80 và gửi một số dữ liệu và thấy nó xuất hiện ở cuối máy chủ mà tôi mới bắt đầu:

$ nc 127.0.0.1 8080 <<<"Hello world"

Nếu tôi muốn liên kết với cổng 80, tôi cần phải root:

$ sudo nc -l -p 80

Hoặc tôi có thể gán CAP_NET_BIND_SERVICEkhả năng cho ncnhị phân:

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

Một tùy chọn khác là viết chương trình máy chủ sao cho sau khi nó được gọi là listen()bỏ quyền root. Đây là một giải pháp khá phổ biến, và bạn sẽ thấy nó với hầu hết các daemon. Ví dụ, Apache được bắt đầu từ init với quyền root, sau đó loại bỏ các đặc quyền gốc và trở thành người dùng www-datahoặc một cái gì đó tương tự khi nó bị ràng buộc với cổng 80. Hãy thử chạy /etc/init.d/apache startnhư không root và Apache có thể sẽ không khởi động.


Câu hỏi cho biết "liên kết với các cổng này". Tại sao bạn nghĩ rằng anh ấy đã sai?
Barmar
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.