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_SERVICE
khả năng cho nc
nhị 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-data
hoặ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 start
như không root và Apache có thể sẽ không khởi động.