Tôi nghĩ rằng nhiều chi tiết của câu hỏi của bạn có thể áp dụng như nhau avahi-daemon
, mà tôi đã xem xét gần đây. (Tôi có thể đã bỏ lỡ một chi tiết khác mà mặc dù). Chạy avahi-daemon trong chroot có nhiều lợi thế, trong trường hợp avahi-daemon bị xâm phạm. Bao gồm các:
- nó không thể đọc bất kỳ thư mục nhà của người dùng và lọc thông tin cá nhân.
- nó không thể khai thác lỗi trong các chương trình khác bằng cách viết vào / tmp. Có ít nhất một loại toàn bộ các lỗi như vậy. Ví dụ: https://www.google.co.uk/search?q=tmp+race+security+orms
- nó không thể mở bất kỳ tập tin ổ cắm unix nào bên ngoài chroot, mà các trình tiện ích khác có thể đang nghe và đọc tin nhắn trên đó.
Điểm 3 có thể đặc biệt tốt khi bạn không sử dụng dbus hoặc tương tự ... Tôi nghĩ avahi-daemon sử dụng dbus, vì vậy nó đảm bảo giữ quyền truy cập vào dbus hệ thống ngay cả từ bên trong chroot. Nếu bạn không cần khả năng gửi tin nhắn trên hệ thống dbus, việc từ chối khả năng đó có thể là một tính năng bảo mật khá hay.
quản lý nó với tập tin đơn vị systemd
Lưu ý rằng nếu avahi-daemon được viết lại, nó có khả năng có thể chọn dựa vào systemd để bảo mật và sử dụng, vd ProtectHome
. Tôi đã đề xuất một thay đổi cho avahi-daemon để thêm các biện pháp bảo vệ này như một lớp bổ sung, cùng với một số biện pháp bảo vệ bổ sung không được bảo đảm bởi chroot. Bạn có thể xem danh sách đầy đủ các tùy chọn tôi đề xuất ở đây:
https://github.com/lathiat/avahi/pull/181/commits/67a7b10049c58d6afeebdc64ffd2023c5a93d49a
Có vẻ như có nhiều hạn chế hơn mà tôi có thể đã sử dụng nếu avahi-daemon không sử dụng chroot, một số trong đó được đề cập trong thông điệp cam kết. Tôi không chắc chắn bao nhiêu điều này áp dụng mặc dù.
Lưu ý, các biện pháp bảo vệ mà tôi đã sử dụng sẽ không giới hạn trình nền mở các tệp ổ cắm unix (điểm 3 ở trên).
Một cách tiếp cận khác là sử dụng SELinux. Tuy nhiên, bạn sẽ buộc ứng dụng của mình vào tập hợp phân phối Linux đó. Lý do tôi nghĩ về SELinux một cách tích cực ở đây, đó là vì Selinux hạn chế quyền truy cập mà các quy trình có trên dbus, theo cách chi tiết. Ví dụ: tôi nghĩ bạn thường có thể mong đợi rằng nó systemd
sẽ không nằm trong danh sách tên xe buýt mà bạn cần để có thể gửi tin nhắn đến :-).
"Tôi đã tự hỏi, nếu sử dụng systemd sandbox an toàn hơn chroot / setuid / umask / ..."
Tóm tắt: tại sao không phải cả hai? Hãy giải mã những điều trên một chút :-).
Nếu bạn nghĩ về điểm 3, sử dụng chroot cung cấp nhiều hạn chế hơn. ProtectHome = và bạn bè của nó thậm chí không cố gắng hạn chế như chroot. (Ví dụ, không có danh sách đen tùy chọn systemd nào được đặt tên /run
, trong đó chúng tôi có xu hướng đặt các tệp ổ cắm unix).
chroot cho thấy rằng việc hạn chế quyền truy cập hệ thống tệp có thể rất mạnh mẽ, nhưng không phải mọi thứ trên Linux đều là một tệp :-). Có các tùy chọn systemd có thể hạn chế những thứ khác, đó không phải là tập tin. Điều này hữu ích nếu chương trình bị xâm phạm, bạn có thể giảm các tính năng kernel có sẵn cho nó, chương trình có thể cố gắng khai thác lỗ hổng. Ví dụ: avahi-daemon không cần ổ cắm bluetooth và tôi đoán máy chủ web của bạn cũng không :-). Vì vậy, đừng cấp cho nó quyền truy cập vào họ địa chỉ AF_BLUETOOTH. Chỉ cần liệt kê danh sách trắng AF_INET, AF_INET6 và có thể AF_UNIX bằng cách sử dụng RestrictAddressFamilies=
tùy chọn.
Vui lòng đọc tài liệu cho từng tùy chọn bạn sử dụng. Một số tùy chọn có hiệu quả hơn khi kết hợp với các tùy chọn khác và một số tùy chọn không khả dụng trên tất cả các kiến trúc CPU. (Không phải vì CPU kém, mà vì cổng Linux cho CPU đó không được thiết kế độc đáo. Tôi nghĩ vậy).
(Có một nguyên tắc chung ở đây. An toàn hơn nếu bạn có thể viết danh sách những gì bạn muốn cho phép, không phải những gì bạn muốn từ chối. Giống như xác định một chroot cung cấp cho bạn một danh sách các tệp bạn được phép truy cập, và điều này mạnh mẽ hơn hơn là nói bạn muốn chặn /home
).
Về nguyên tắc, bạn có thể tự áp dụng tất cả các hạn chế tương tự trước khi setuid (). Tất cả chỉ là mã mà bạn có thể sao chép từ systemd. Tuy nhiên, các tùy chọn đơn vị systemd nên dễ viết hơn đáng kể và vì chúng ở định dạng chuẩn nên sẽ dễ đọc và xem lại hơn.
Vì vậy, tôi rất có thể khuyên bạn chỉ nên đọc qua phần hộp cát man systemd.exec
trên nền tảng mục tiêu của bạn. Nhưng nếu bạn muốn thiết kế an toàn nhất có thể, tôi sẽ không ngại thử chroot
(và sau đó thả root
vào) trong chương trình của bạn cũng . Có một sự đánh đổi ở đây. Sử dụng chroot
áp đặt một số hạn chế trên thiết kế tổng thể của bạn. Nếu bạn đã có một thiết kế sử dụng chroot, và nó dường như làm những gì bạn cần, điều đó nghe có vẻ khá tuyệt vời.