Tại sao các máy chủ web theo truyền thống bắt đầu như siêu người dùng?


8

Suy nghĩ về một thiết lập máy chủ web trong tương lai, tôi nhận ra rằng vì một số lý do, các máy chủ web thường bắt đầu với quyền root và sau đó bỏ một số quyền nhất định ( setuid) cho các quy trình worker. Ngoài ra, thường chrootcó liên quan, mà chính xác không có nghĩa là một biện pháp bảo mật.

Điều tôi đã tự hỏi, tại sao các máy chủ web (tôi đã quản trị mọi thứ từ Apache, lighttpd đến nginx) không sử dụng hệ thống khả năng ( capabilities(7)), như CAP_NET_BIND_SERVICEtrên Linux và chỉ đơn giản là bắt đầu với tư cách là người dùng không root? ... cách này vẫn nghe trên một cổng đặc quyền dưới 1024.

Hoặc tốt hơn, tôi nghĩ rằng hầu hết trong số họ có thể, nhưng tại sao đó không phải là thông lệ? Tại sao không ...

  • sử dụng setcap(8)với CAP_NET_BIND_SERVICEtrên nhị phân đang chạy?
  • thiết lập các thư mục nhật ký để cho phép người dùng (không phải root) viết ở đó
  • ..., Nếu bạn cảm thấy muốn chrootgiúp đỡ, hãy sử dụng chroothoặc lxc"bỏ tù" máy chủ web?

Không có gì khác ngoài quá trình (công nhân) con có thể giết cha mẹ mà tôi có thể nghĩ ra sẽ làm cho việc này ít có lợi hơn là bắt đầu hoàn toàn như root.

Vậy tại sao họ theo truyền thống được bắt đầu như root khi sau đó mọi thứ được thực hiện để thoát khỏi các vấn đề bảo mật ngụ ý đi kèm với nó?


Để biết giá trị của nó, sản phẩm WebSphere của IBM có thể cài đặt như một dịch vụ cấp hệ thống hoặc ứng dụng người dùng và thậm chí ở chế độ hệ thống có thể được cấu hình để khởi chạy như một người dùng và / hoặc ID nhóm cụ thể.
keshlam

Tôi không chắc tại sao không có câu trả lời nào nói về khóa SSL ở đây. Nếu máy chủ web cần máy chủ https (443) thì nó cần tải chứng chỉ SSL và khóa trong bộ nhớ. tập tin chính chủ yếu được lưu trữ với 600 quyền để chỉ root mới có thể đọc. Giống như trong (các) tệp khóa Ubuntu được lưu trữ trong / etc / ssl / private / dir. Tôi đang viết một máy chủ web (phát minh lại một bánh xe vuông :-) đó là lý do tại sao tôi đến trang này.
Mera Ấn Độ

@MeraẤn Độ: mặc dù chế độ tệp thường có thể là 600, nhưng không có lý do gì mà một người dùng không có đặc quyền cụ thể (ví dụ nginxhoặc www-data) nên sở hữu tệp nói. Vì vậy, đó không phải là một lý do tốt cả. Và nó đã được đặt tên trước trong một câu trả lời.
0xC0000022L

Câu trả lời:


8

Mặc dù POSIX có một tiêu chuẩn cho các khả năng mà tôi nghĩ bao gồm CAP_NET_BIND_SERVICE, những điều này không bắt buộc để tuân thủ và trong một số trường hợp có thể không tương thích với việc triển khai trên, ví dụ như linux.

Vì các máy chủ web như apache không chỉ được viết cho một nền tảng, nên sử dụng quyền root là phương thức di động nhất. Tôi cho rằng nó có thể làm điều này cụ thể trên linux và BSD (hoặc bất cứ nơi nào phát hiện hỗ trợ), nhưng điều này có nghĩa là hành vi sẽ thay đổi tùy theo nền tảng, v.v.

Dường như với tôi bạn có thể cấu hình hệ thống của mình để bất kỳ máy chủ web nào cũng có thể được sử dụng theo cách này; có một số gợi ý (có lẽ vụng về) về apache WRT này ở đây: NonRootPortBinding .

Vậy tại sao họ theo truyền thống được bắt đầu như root khi sau đó mọi thứ được thực hiện để thoát khỏi các vấn đề bảo mật ngụ ý đi kèm với nó?

Họ bắt đầu với quyền root vì họ thường cần truy cập vào một cổng đặc quyền và theo truyền thống, đây là cách duy nhất để làm điều đó. Lý do họ hạ cấp sau đó là vì sau đó họ không cần đặc quyền và để hạn chế khả năng thiệt hại do vô số phần mềm bổ trợ của bên thứ ba thường sử dụng bởi máy chủ.

Điều này không phải là không có lý, vì hoạt động đặc quyền rất hạn chế và theo quy ước, nhiều trình nền hệ thống khác chạy root liên tục, bao gồm cả các trình tiện ích inet khác (ví dụ sshd:).

Hãy nhớ rằng nếu máy chủ được đóng gói để có thể chạy như một người dùng không có đặc quyền với CAP_NET_BIND_SERVICE, thì điều này sẽ cho phép bất kỳ người dùng không có đặc quyền nào bắt đầu dịch vụ HTTP (S), điều này có thể có rủi ro cao hơn.


Cảm ơn, trước hết. Được rồi, điều này giải thích nó cho phi Linux. Tuy nhiên, với các hệ thống quản lý gói, có thể cho rằng nó có thể và gần như không đáng kể để hỗ trợ. Ngoài ra, tôi đã thêm linux đặc biệt vì câu hỏi của tôi đề cập đến một cơ sở dành riêng cho Linux. Điều đó có nghĩa là, câu trả lời của bạn tránh được điểm chính của câu hỏi của tôi (hoặc có thể nó thực sự không, nhưng đây là cách nó đi qua) :)
0xC0000022L

@ 0xC0000022L Điều này sẽ sớm thay đổi và bạn có thể tiếp tục và bắt đầu ngay bây giờ. Với unsharensentertrong util-linuxbây giờ bạn có thể sử dụng netkhông gian tên như một người dùng không có đặc quyền. Vì vậy, bạn có thể gán một cổng đặc quyền cho một không gian tên là root và khởi động máy chủ web của bạn trong netkhông gian tên không được ưu tiên. CAPDù sao cũng là một nỗi đau.
mikeerv

"được cung cấp hệ thống quản lý gói" -> nếu bạn muốn nói, bằng cách thêm một tính năng ở cấp độ đó, không, nó sẽ không tầm thường (hoặc lành mạnh). Tuy nhiên, nếu bạn muốn nói, chỉ cần cấu hình máy chủ theo mặc định để sử dụng các khả năng thay vào đó, vâng, tôi nghĩ rằng điều đó có thể được thực hiện trong nhiều trường hợp (tôi đã thêm một nhận xét về apache WRT này). ý chính của câu hỏi của tôi -> Nếu bạn muốn nói, câu hỏi in đậm ở phía dưới, tôi đã thêm một câu trả lời rõ ràng cho câu hỏi đó.
goldilocks

@mikeerv: bạn có phiền khi đưa nó vào câu trả lời không? Cảm ơn :)
0xC0000022L

1
@ 0xC0000022L Vâng, tôi sẽ làm vậy. Tôi biết nó có thể được thực hiện, nhưng tôi không quen với các chi tiết cụ thể về cách làm điều này. Cho đến nay tôi chỉ chơi với pidkhông gian tên - và chỉ cuối tuần này. Nhưng bạn có thể thấy: lwn.net/Articles/531114unix.stackexchange.com/questions/124162/iêu
mikeerv

1

Trên các hệ thống dựa trên Unix, các dịch vụ nghe trên các cổng đặc quyền đòi hỏi sự ban phước của quản trị viên hệ thống. Điều này cho thấy rằng dịch vụ đang được điều hành bởi người dùng đáng tin cậy (ít nhất là bởi quản trị viên). Người dùng các dịch vụ như vậy sau đó có thể tin tưởng rằng có một số giám sát quản trị của ứng dụng máy chủ. Giá trị của sự tin tưởng này có thể không lớn như trong những thập kỷ trước.

Nhiều máy chủ web chạy trên các hạt nhân hệ điều hành cũ hơn có thể không hỗ trợ các khả năng yêu cầu cho phép nó khởi động và chạy như một người dùng không có đặc quyền. Các thay đổi nhân cần thiết là tương đối mới và không được chuẩn hóa trên các nhân hệ điều hành. Có thể biên dịch có điều kiện phần mềm cho các môi trường như vậy. Tuy nhiên, những thay đổi như vậy không thể được sử dụng trong hầu hết các nền tảng và có thể không được kiểm tra tốt hoặc an toàn như mong muốn.

Thông thường các quy trình daemon chạy dưới quyền root để thực hiện mọi thứ yêu cầu quyền truy cập root và sau đó chuyển sang UID không có đặc quyền. Điều này cho phép các tài nguyên được bảo mật, đồng thời ngăn chương trình gây ra nhiều thiệt hại một khi nó đang chạy. Trong trường hợp máy chủ web, các khóa SSL phải được bảo mật khỏi bị đọc bởi ứng dụng máy chủ rouge, nhưng phải được đọc để định cấu hình trình nghe SSL. Đặc quyền phân chia cho phép truy cập phân tách vào các tài nguyên có thể được sử dụng để tăng đáng kể bảo mật.

Mặc dù có thể bẻ khóa một máy chủ web, nhưng trên nhiều hệ thống, nhà tù có thể chứa các phần quan trọng của hệ thống tệp. Điều này có thể vừa khó cấu hình vừa dễ bị lỗi. Bỏ qua một ứng dụng thường ngụ ý rằng đó là một cấu hình an toàn hơn. Trong trường hợp này, sự tin tưởng đó có thể bị đặt sai chỗ do rủi ro trong đó nhà tù được cấu hình không chính xác. Ngay cả khi không có nhà tù, có thể khó chẩn đoán các vấn đề truy cập. Có khối lượng lớn của hệ thống tập tin được loại trừ khỏi nhà tù sẽ làm cho điều này trở nên khó khăn hơn.


0

Có một số lý do để bắt đầu một máy chủ web là root:

  • để liên kết với cổng 80 (các cổng dưới 1024 được dành riêng cho root, để nếu người dùng từ xa đang kết nối với dịch vụ trên một cổng thấp, họ biết rằng dịch vụ này được root chấp thuận);
  • để thiết lập sự giam cầm, ví dụ như chroot;
  • để đọc và phục vụ các trang web của người dùng, nếu có.

Lý do tối thiểu đó là một thiết lập kém; cách đơn giản nhất để bảo mật thiết lập như vậy là yêu cầu người dùng đặt trang web ở chế độ công khai. Điều này không hoạt động khi người dùng có thể muốn có các trang web riêng có kiểm soát truy cập (ví dụ: máy đại học nơi các giáo sư muốn chia sẻ văn bản bài kiểm tra qua web nhưng không muốn cho sinh viên xem chúng). Trong trường hợp này, cần một cách tiếp cận tinh vi hơn (ví dụ: yêu cầu các trang web có ACL cho phép máy chủ web đọc chúng).

Các máy chủ web được khởi động như root thường chỉ bắt đầu bằng root, nhưng sau đó thả đặc quyền xuống cho người dùng dành riêng. Trước khi bỏ các đặc quyền, họ liên kết cổng 80, có thể đọc một số tệp (ví dụ: tệp khóa riêng SSL) và có thể thực hiện các ngăn chặn khác.

[Tại sao không] sử dụng setcap(8)với CAP_NET_BIND_SERVICEtrên nhị phân đang chạy?

Điều đó có thể được thực hiện, nhưng đòi hỏi một hệ thống hỗ trợ các khả năng. Liên quan đến lịch sử của Unix và thậm chí với các máy chủ web, điều này tương đối gần đây.

[Tại sao không] thiết lập các thư mục nhật ký để cho phép người dùng (không phải root) viết ở đó?

Điều đó thường được thực hiện; hoặc nếu không, máy chủ web sẽ xử lý nhật ký thông qua ổ cắm Unix hoặc Internet đến trình nền ghi nhật ký.

[Tại sao không] nếu bạn cảm thấy chroot giúp ích gì cả, hãy sử dụng chroot hoặc lxc để "tống giam" máy chủ web?

Điều này có nghĩa là máy chủ web sẽ có thể đọc tất cả các tệp cấu hình của nó, chẳng hạn như khóa riêng SSL. Đôi khi các lỗ hổng cho phép kẻ tấn công từ xa lấy các tệp tùy ý; giam giữ máy chủ theo cách ngăn nó truy cập các tệp cấu hình để tránh phơi nhiễm trong trường hợp này.

Đó là một điểm yếu của hầu hết các hệ thống unix mà chúng không cho phép một quy trình không có đặc quyền để thiết lập một khu vực giam cầm mà nó sẽ không thể thoát ra được. Trong Linux, điều này là có thể vì các cải tiến không gian tên trong kernel 3.8 , chưa được phổ biến rộng rãi.

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.