Có phải là một thực hành tốt để chạy một daemon dưới tài khoản người dùng không root?


13

Tôi đã phát triển một ứng dụng sử dụng NTP để thay đổi thời gian mạng, để đồng bộ hóa hai máy tính của tôi. Nó chạy như là root, vì chỉ có cái sau mới được phép thay đổi thời gian và ngày trên Linux (tôi đoán vậy).

Bây giờ, tôi muốn chạy nó như một người dùng. Nhưng, tôi cần truy cập thời gian.

  • Có phải là một thực hành tốt để chạy một daemon dưới tài khoản người dùng không root?
  • Tôi có nên cung cấp cho ứng dụng của mình một khả năng như CAP_SYS_TIMEkhông?
  • Nó không giới thiệu một lỗ hổng bảo mật?
  • Có cách nào tốt hơn?

Thông thường, trình nền NTP được cho là chạy dưới dạng ntptài khoản người dùng (ít nhất là trên các hệ thống Linux), do đó bạn không cần phải thực hiện thay đổi này. Bạn đã cài đặt gói NTP nào?

6
Chạy một daemon trong một tài khoản không root được gọi là "bỏ đặc quyền root" và là một cách làm tốt thường được biết đến vì nó hạn chế các thiệt hại tiềm ẩn của các lỗ hổng bảo mật trong daemon.

1
Xem wikipedia cho "Phân tách đặc quyền ".
Kusalananda

Tôi đã biên dịch NTP từ các nguồn. Tôi không có nhóm NTP
Anonymous12223

@xhaltar Bạn có thể tạo nhóm NTP và người dùng. Để định cấu hình cách dịch vụ được bắt đầu (người dùng, nhóm, v.v.), bạn có thể tạo / chỉnh sửa tập lệnh init dịch vụ, hoặc tạo / định cấu hình đơn vị systemd.
Pl4nk

Câu trả lời:


15

Có phải là một thực hành tốt để chạy một daemon dưới tài khoản người dùng không root?

Vâng, và điều này là phổ biến. Chẳng hạn, Apache bắt đầu với quyền root và sau đó chuyển tiến trình mới dưới dạng dữ liệu www (theo mặc định).
Như đã nói trước đây, nếu chương trình của bạn bị hack (ví dụ: tiêm mã), kẻ tấn công sẽ không có quyền truy cập root, nhưng sẽ bị giới hạn ở các đặc quyền bạn đã cung cấp cho người dùng cụ thể này.

Tôi có nên đưa ra "Khả năng" như "CAP_SYS_TIME" không?

Đó là một ý tưởng tốt vì bạn tránh sử dụng setuid và giới hạn quyền đối với khả năng rất cụ thể này.

Tôi có nên sử dụng một cách khác để làm như vậy sẽ được coi là "Thực hành tốt" không?

Bạn có thể tăng bảo mật, ví dụ:

  • Chạy dịch vụ với tư cách là người dùng không có đặc quyền, không có vỏ.
  • Sử dụng chroot để khóa người dùng trong thư mục chính của nó.

NB: Chroot không cung cấp bảo mật nếu bạn root và chạy trên Linux. Người dùng root có thể tạo một thư mục trong chroot, mở thư mục gốc của chroot, chroot vào thư mục mới, chdir quay trở lại root thực, và sau đó chroot vào root thực. BSD khắc phục điều này bằng cách không cho phép đưa thư mục fd vào một chroot.
Kevin

@Kevin Nếu bạn đã root, bạn cũng có thể xử lý các tiến trình bên ngoài chroot và có nhiều cách khác để phá vỡ nó. Một chroot đơn thuần không thể bám rễ.
Gilles 'SO- ngừng trở nên xấu xa'

//, emp.jar.st thực sự tạo ra một người dùng cho chính nó vì lý do bảo mật. Thực hành rất tốt.
Nathan Basan

Đợi đã, nếu tôi là NGƯỜI DÙNG, tôi có thể khóa NGƯỜI DÙNG vào một thư mục cụ thể không? Chẳng hạn như "/ opt" (ví dụ)?
Khuyết

@xhaltar Để khóa một tiến trình được chạy USERtrong một thư mục, bạn sử dụng chroot(chạy nó với tư cách người dùng root). Tuy nhiên, bạn phải tạo và khởi tạo một nhà tù (thư mục) trước đó. Nói tóm lại, bạn phải đặt các thư viện và nhị phân mà quá trình bạn cần vào nhà tù này, sau đó gọi chroot <path/to/jail> <command>. Một hướng dẫn tốt với một số ví dụ bạn cần có sẵn ở đây
Pl4nk

13
  • Tôi có nên sử dụng một cách khác để làm như vậy sẽ được coi là "Thực hành tốt" không?

Trừ khi bạn có những lý do mạnh mẽ, không thể bác bỏ nếu không, bạn chỉ nên sử dụng gói NTP đi kèm với bản phân phối GNU / Linux của bạn. Trình nền NTP tiêu chuẩn đã mất nhiều năm để hoàn thiện và đi kèm với các tính năng tinh vi như làm chậm hoặc tăng tốc đồng hồ hệ thống của bạn để đồng bộ hóa với mạng hoặc đồng hồ GPS. Nó được thiết kế để đồng bộ hóa đồng hồ, vì vậy rất có thể đây công cụ tốt nhất cho mục đích đó.

ntpdvẫn được duy trì, đánh giá bởi các bản cập nhật gần đây (khi viết bài này). Nếu bạn cần nhiều tính năng hơn, tôi khuyên bạn nên liên hệ trực tiếp với nhà phát triển, hãy tin vào những gì họ nói về điều đó.


5

Nếu bạn có một chương trình cần có khả năng thực hiện chức năng X (ví dụ: điều khiển đồng hồ) và bạn có thể cung cấp cho nó đặc quyền / sức mạnh để thực hiện chức năng X và không có gì khác, tốt hơn là cung cấp cho nó toàn bộ bảng chữ cái Súp. Điều này được gọi là nguyên tắc đặc quyền tối thiểu . Hãy xem xét, điều gì xảy ra nếu chương trình của bạn có lỗi - có thể là lỗi lập trình thông thường hoặc lỗ hổng bảo mật có thể khai thác. Nếu nó chạy dưới dạng "root", nó có thể xóa các tệp của mọi người - hoặc gửi chúng cho kẻ tấn công. Nếu điều duy nhất mà chương trình có thể làm là thao túng đồng hồ (và các chức năng không có đặc quyền, như thao tác các tệp trong thư mục bị khóa), thì đó là điều tồi tệ nhất có thể xảy ra nếu chương trình bị lừa đảo.

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.