Nhiều câu hỏi tương tự hơn với nhiều câu trả lời đáng chú ý hơn:
LƯU Ý: Một số câu trả lời chỉ ra các giải pháp cụ thể chưa được đề cập ở đây.
Trên thực tế, có khá nhiều công cụ bỏ tù với cách triển khai khác nhau, nhưng nhiều trong số chúng không an toàn theo thiết kế (như fakeroot
, LD_PRELOAD
dựa trên cơ sở) hoặc không hoàn chỉnh (như fakeroot-ng
, ptrace
dựa trên cơ sở) hoặc sẽ yêu cầu root ( chroot
hoặc plash
được đề cập tại fakechroot nhãn cảnh báo ).
Đây chỉ là những ví dụ; Tôi đã nghĩ đến việc liệt kê tất cả chúng cạnh nhau, với dấu hiệu của 2 tính năng này ("có thể tin cậy được không?", "Có yêu cầu root để thiết lập không?"), Có lẽ tại Triển khai ảo hóa ở cấp hệ điều hành .
Nói chung, các câu trả lời bao gồm đầy đủ các khả năng được mô tả và thậm chí nhiều hơn:
máy ảo / HĐH
phần mở rộng kernel (như SELinux)
- (được đề cập trong các ý kiến ở đây),
chroot
Các trình trợ giúp dựa trên Chroot (tuy nhiên phải là root setUID, vì chroot
yêu cầu root; hoặc có chroot
thể có thể hoạt động trong một không gian tên bị cô lập - xem bên dưới):
[để nói thêm một chút về họ!]
Các công cụ cách ly dựa trên chroot được biết đến:
- hasher với nó
hsh-run
và hsh-shell
lệnh. ( Hasher được thiết kế để xây dựng phần mềm theo cách an toàn và có thể lặp lại.)
- schroot được đề cập trong một câu trả lời khác
- ...
ptrace
Một giải pháp cách ly đáng tin cậy khác (ngoài mộtseccomp
giải pháp dựa trên cơ sở ) sẽ là việc ngăn chặn hoàn toàn tòa nhà thông qua ptrace
, như được giải thích trong trang hướng dẫn cho fakeroot-ng
:
Không giống như các triển khai trước đó, fakeroot-ng sử dụng một công nghệ khiến quá trình theo dõi không còn lựa chọn nào liên quan đến việc liệu nó có sử dụng "dịch vụ" của fakeroot-ng hay không. Biên dịch chương trình một cách tĩnh, gọi trực tiếp kernel và thao tác không gian địa chỉ của chính chúng là tất cả các kỹ thuật có thể được sử dụng một cách tầm thường để vượt qua sự kiểm soát dựa trên LD_PRELOAD đối với một quy trình và không áp dụng cho fakeroot-ng. Về mặt lý thuyết, có thể tạo khuôn fakeroot-ng theo cách để có toàn quyền kiểm soát quá trình truy tìm.
Trong khi về mặt lý thuyết là có thể, nó đã không được thực hiện. F. ng. Do đó, bạn được cảnh báo mạnh mẽ về việc sử dụng fakeroot-ng như một công cụ bảo mật. Bug báo cáo rằng một quá trình có thể cố tình (trái ngược với vô tình) thoát khỏi sự kiểm soát của root-ng sẽ bị đóng là "không phải là lỗi" hoặc được đánh dấu là mức độ ưu tiên thấp.
Có thể chính sách này sẽ được xem xét lại trong tương lai. Hiện tại, bạn đã được cảnh báo.
Tuy nhiên, như bạn có thể đọc nó, fakeroot-ng
bản thân nó không được thiết kế cho mục đích này.
(BTW, tôi tự hỏi tại sao họ lại chọn sử dụng seccomp
phương pháp tiếp cận dựa trên Chromium thay vì ptrace
dựa trên ...)
Trong số các công cụ không được đề cập ở trên, tôi đã lưu ý Geordi cho chính mình, vì tôi thích rằng chương trình kiểm soát được viết bằng Haskell.
Các công cụ cách ly dựa trên ptrace được biết đến:
bí mật
Một cách được biết để đạt được sự cô lập là thông qua cách tiếp cận hộp cát seccomp được sử dụng trong Google Chromium . Nhưng phương pháp này cho rằng bạn viết một người trợ giúp sẽ xử lý một số (những người được phép) truy cập tệp "bị chặn" và các tòa nhà khác; và tất nhiên, cũng nỗ lực để "chặn" các tòa nhà và chuyển hướng chúng đến người trợ giúp (có lẽ, nó thậm chí còn có nghĩa là thay thế các tòa nhà bị chặn trong mã của quy trình được kiểm soát; vì vậy, nó không có âm thanh khá đơn giản, nếu bạn quan tâm, tốt hơn bạn nên đọc chi tiết thay vì chỉ câu trả lời của tôi).
Thông tin liên quan khác (từ Wikipedia):
(Mục cuối cùng có vẻ thú vị nếu một người đang tìm kiếm một seccomp
giải pháp dựa trên tổng thể bên ngoài Chromium. Ngoài ra còn có một bài đăng blog đáng đọc từ tác giả của "seccomp-y tá": SECCOMP là một giải pháp Sandboxing ? .)
Hình minh họa của phương pháp này từ dự án "seccomp-y tá" :
Một seccomp "linh hoạt" có thể có trong tương lai của Linux?
Đã từng xuất hiện vào năm 2009 cũng có đề xuất vá nhân Linux để có seccomp
chế độ linh hoạt hơn với chế độ - để "có thể tránh được nhiều trò nhào lộn mà chúng ta cần hiện nay". ( "Acrobatics" đề cập đến những biến chứng của việc viết một helper mà đã thực hiện nhiều syscalls có thể vô tội trên danh nghĩa của quá trình bị bỏ tù và thay thế các syscalls có thể vô tội trong quá trình bị bỏ tù.) Bài viết Một LWN viết đến thời điểm này:
Một đề xuất được đưa ra là thêm một "chế độ" mới vào seccomp. API được thiết kế với ý tưởng rằng các ứng dụng khác nhau có thể có các yêu cầu bảo mật khác nhau; nó bao gồm một giá trị "chế độ" chỉ định các hạn chế sẽ được đặt đúng chỗ. Chỉ có chế độ ban đầu đã được thực hiện, nhưng những người khác chắc chắn có thể được thêm vào. Tạo một chế độ mới cho phép quá trình khởi tạo chỉ định các cuộc gọi hệ thống nào sẽ được phép sẽ giúp thiết bị trở nên hữu ích hơn cho các tình huống như hộp cát Chrome.
Adam Langley (cũng của Google) đã đăng một bản vá thực hiện điều đó. Việc triển khai "chế độ 2" mới chấp nhận một bitmask mô tả các lệnh gọi hệ thống nào có thể truy cập được. Nếu một trong số đó là prctl (), thì mã hộp cát có thể hạn chế hơn các cuộc gọi hệ thống của chính nó (nhưng nó không thể khôi phục quyền truy cập vào các cuộc gọi hệ thống đã bị từ chối). Tất cả đã nói, có vẻ như một giải pháp hợp lý có thể giúp cuộc sống của các nhà phát triển hộp cát dễ dàng hơn.
Điều đó nói rằng, mã này có thể không bao giờ được hợp nhất bởi vì cuộc thảo luận đã chuyển sang các khả năng khác.
"Seccomp linh hoạt" này sẽ mang các khả năng của Linux đến gần hơn để cung cấp tính năng mong muốn trong HĐH, mà không cần phải viết các trợ giúp phức tạp.
(Một bài đăng blog với nội dung cơ bản giống như câu trả lời này: http://geofft.mit.edu/blog/sipb/33 .)
không gian tên ( unshare
)
Cô lập thông qua các không gian tên ( unshare
giải pháp dựa trên cơ sở ) - không được đề cập ở đây - ví dụ: các điểm gắn kết không rõ ràng (kết hợp với FUSE?) Có thể là một phần của giải pháp làm việc cho bạn muốn giới hạn truy cập hệ thống tệp của các quy trình không tin cậy của bạn.
Bây giờ, nhiều hơn về các không gian tên, vì việc triển khai của chúng đã được hoàn thành (kỹ thuật cách ly này cũng được biết đến trong "Bộ chứa Linux" hay "LXC" , phải không? ..):
"Một trong những mục tiêu chung của không gian tên là hỗ trợ triển khai các container, một công cụ để ảo hóa nhẹ (cũng như các mục đích khác)" .
Thậm chí có thể tạo một không gian tên người dùng mới, để "một quy trình có thể có ID người dùng không có đặc quyền bình thường bên ngoài không gian tên người dùng đồng thời có ID người dùng bằng 0 trong không gian tên. Điều này có nghĩa là quy trình có đặc quyền gốc đầy đủ cho các hoạt động bên trong không gian tên người dùng, nhưng không được ưu tiên cho các hoạt động bên ngoài không gian tên ".
Đối với các lệnh làm việc thực tế để làm điều này, xem câu trả lời tại:
và lập trình / biên dịch không gian người dùng đặc biệt
Tuy nhiên, tất nhiên, các đảm bảo "tù" mong muốn có thể được thực hiện bằng cách lập trình trong không gian người dùng ( không có hỗ trợ bổ sung cho tính năng này từ HĐH ; có lẽ đó là lý do tại sao tính năng này không được đưa vào vị trí đầu tiên trong thiết kế HĐH ); với các biến chứng nhiều hay ít.
Hộp cát được đề cập ptrace
- hoặc seccomp
dựa trên có thể được xem là một số biến thể của việc thực hiện bảo đảm bằng cách viết một trình trợ giúp hộp cát điều khiển các quy trình khác của bạn, được coi là "hộp đen", các chương trình Unix tùy ý.
Một cách tiếp cận khác có thể là sử dụng các kỹ thuật lập trình có thể quan tâm đến các hiệu ứng phải không được phép. (Phải là bạn đã viết chương trình sau đó; chúng không còn là hộp đen nữa.) Để đề cập đến một ngôn ngữ lập trình thuần túy (sẽ buộc bạn phải lập trình mà không có tác dụng phụ) như Haskell sẽ tạo ra tất cả các hiệu ứng của chương trình rõ ràng, vì vậy lập trình viên có thể dễ dàng đảm bảo sẽ không có hiệu ứng không được phép.
Tôi đoán, có những phương tiện hộp cát có sẵn cho những chương trình đó bằng một số ngôn ngữ khác, ví dụ, Java.
Một số trang tích lũy thông tin về chủ đề này cũng được chỉ ra trong các câu trả lời ở đó: