Tại sao sudo bắt buộc phải khởi động máy chủ web trên một cổng ip: cho trước?


9

Tôi đang thiết lập một máy chủ web dựa trên Python trên hộp Debian của mình.

Thiết lập:

  • Hệ điều hành Debian dựa trên VM, nhưng tôi đã chuyển VirtualBox từ NAT sang Bridged.
  • IP của thiết lập VM = 192.168.1.7(trên màn hình quản trị bộ định tuyến của tôi hoặc ifconfig).
  • Tôi đã thiết lập chuyển tiếp cổng của bộ định tuyến cho cả ssh và HTTP.
  • Tôi đã thiết lập thành công dns động của bộ định tuyến bằng dyndns.com.

Bất kể máy chủ web Python cụ thể nào tôi đang sử dụng (Django, CherryPy, thư viện chuẩn), tôi phải khởi động máy chủ web @ 192.168.1.7:80 bằng cách sử dụng sudo. Nếu không, tôi nhận được một lỗi về việc không có quyền truy cập vào cổng. Không có hướng dẫn máy chủ web nào đề cập đến việc cần sử dụng sudokhi chỉ định một cổng ip :.

Câu hỏi: tại sao tôi cần sử dụng sudođể khởi động các máy chủ web này? Có phải đó là một dấu hiệu cho thấy tôi không nên sử dụng 192.168.1.7? Hoặc là tôi không thiết lập một tập tin cấu hình đúng cách ở đâu đó?

Câu trả lời:


11

Chỉ các quy trình có quyền root mới có thể lắng nghe trên các cổng đặc quyền. Đây là một quy ước bảo mật Unix tiêu chuẩn.


Có phổ biến để bắt đầu máy chủ web bằng sudo trên 80 không? Hoặc có một số chiến lược khác để sử dụng một cổng> 1024 (ví dụ 8000, 8080)?
Begbie00

@ Begbie00 Có, việc chạy máy chủ web trên các cổng cao hơn là điều khá phổ biến. Nhưng nó được sử dụng chủ yếu cho các máy chủ web không thể truy cập công khai trên internet hoặc đang chạy trên các máy mà người dùng không có quyền root. Các máy chủ web được sử dụng để phát triển và thử nghiệm hầu như chỉ chạy trên các cổng không có đặc quyền.
Šimon Tóth

2
Thật không may, tuyên bố này không hoàn toàn đúng với các hệ thống unix hiện đại. Xem câu trả lời của tôi để biết chi tiết nhưng ví dụ Linux hiện đại cho phép kiểm soát cấp phép chi tiết hơn bằng cách sử dụng NĂNG LỰC. Ngoài ra Solaris có một hệ thống bảo mật hạt mịn gọi là RBAC. Các cơ chế này cho phép gán các quyền như ràng buộc với các cổng đặc quyền cho người dùng hoặc chương trình cụ thể.
SkyBeam

14

Đó là hành vi tiêu chuẩn mà người dùng không có đặc quyền không được phép liên kết với các cổng đặc quyền (số cổng dưới 1024). Do đó, một ứng dụng muốn liên kết với cổng 80 chẳng hạn sẽ phải chạy đặc quyền (thông thường điều này có nghĩa là chạy dưới quyền root) để liên kết với cổng này.

Một cách tiếp cận phổ biến là chạy một quy trình "người nghe" nhỏ với người dùng đặc quyền chấp nhận kết nối và sau đó sinh ra một quy trình không có đặc quyền để xử lý yêu cầu. Bỏ đặc quyền để xử lý yêu cầu được thực hiện vì lý do bảo mật. Nếu ai đó có thể khai thác quy trình xử lý yêu cầu, thì thông thường, nó cho phép kẻ xâm nhập thực thi các lệnh bằng cách sử dụng các đặc quyền giống như quy trình xử lý. Do đó, sẽ rất tệ khi xử lý toàn bộ yêu cầu bằng quy trình đặc quyền.

Tuy nhiên, đối với nhiều ứng dụng, ngày nay nó chạy không phải là root; nhưng các quá trình như vậy tất nhiên không thể liên kết với các cổng đặc quyền sau đó trong cấu hình tiêu chuẩn. Vì vậy, các máy chủ như Tomcat hoặc JBoss được sử dụng để liên kết với các cổng cao như 8080 thay vào đó, vì vậy họ không cần một người nghe đặc quyền.

Tất nhiên, nếu bạn đưa ra một quy trình như vậy với internet, bạn có thể sẽ cung cấp quyền truy cập trên cổng 80 vì mỗi trình duyệt trước tiên sẽ cố gắng kết nối với cổng 80 khi sử dụng giao thức HTTP. Cách làm việc chung để cung cấp điều này là sử dụng tường lửa hoặc trình dịch cổng ở giữa ứng dụng và internet công cộng. Vì vậy, các yêu cầu tấn công tường lửa yêu cầu cổng 80 nhưng tường lửa chuyển tiếp yêu cầu đến một số máy chủ nội bộ trên cổng 8080. Bằng cách này, máy chủ web thực sự có thể hoạt động trên các cổng cao trong khi có sẵn công khai trên cổng 80.

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

Đôi khi việc chuyển hướng này được thực hiện đơn giản bằng cách sử dụng iptablesquy tắc NAT:

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

Điều này cho phép chạy một ứng dụng không có đặc quyền nghe trên cổng 8080 trong khi tất cả các yêu cầu đến cho cổng 80 chỉ được chuyển hướng đến cổng 8080.

Tuy nhiên, sử dụng các nhân Linux hiện đại, có một khả năng khác: Sử dụng các khả năng.

setcap CAP_NET_BIND_SERVICE=+ep /some/webserver/binary

Điều này sẽ cho phép binaryliên kết với các cổng đặc quyền ngay cả khi bắt đầu như từ người dùng không root. Xem man capabilitiesđể biết thêm chi tiết.


Các khả năng là một phần của POSIX, hay chỉ dành riêng cho Linux?
Šimon Tóth

@Let_Me_Be Theo tôi hiểu từ en.wikipedia.org/wiki/Capability-basing_security POSIX đã định nghĩa một khái niệm dựa trên khả năng, nhưng nó khác với những gì đã được triển khai trong Linux. Vì vậy, tôi nghĩ rằng các khả năng của Linux như CAP_NET_BIND_SERVICE chỉ dành riêng cho Linux.
SkyBeam
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.