Hộp cát an toàn đơn giản nhất có thể (cần nguồn lực hạn chế)


15

Tôi đang làm việc trên một dự án thực hiện các mô phỏng phân tán: mã tùy ý được thực thi trên nhiều nút và kết quả được thu thập và tổng hợp sau đó.

Mỗi nút là một phiên bản của máy ảo Ubuntu Linux và chạy một quy trình chính, đảm nhiệm việc chuyển tiếp mã được thực thi đến một số quy trình worker (1 cho mỗi lõi).

Câu hỏi này là về cách đảm bảo rằng mỗi công nhân hoạt động trong môi trường hộp cát mà không cần sử dụng một ví dụ máy ảo cho mỗi người trong số họ. Các yêu cầu chính xác cho người lao động là:

  • fs : không có quyền ghi, quyền chỉ đọc giới hạn trong một thư mục (và thư mục con)
  • net : chỉ cho phép truyền thông cục bộ (IPC, TCP, bất cứ điều gì ...)
  • mem : giới hạn sử dụng bộ nhớ (không có bộ nhớ trao đổi) giết nếu vượt quá giới hạn mem
  • cpu : chỉ cho phép 1 lõi, giết nếu quá thời gian giới hạn

Không có giới hạn nào khác được áp đặt: công nhân sẽ có thể tải các thư viện động (từ thư mục chỉ đọc), sinh ra các luồng hoặc tiến trình mới, chức năng hệ thống gọi, ecc ecc nhưng các giới hạn phải được kế thừa bởi các thực thể được sinh ra / tải và nên áp dụng một cách khôn ngoan (ví dụ: chúng ta không thể có một nhân viên sinh ra hai luồng sử dụng mỗi luồng 800 MB là giới hạn bộ nhớ cho nhân viên đó là 1GB).

Không cần phải nói rằng không có cách nào để người lao động nâng cao quyền của mình.

Tôi đã dành thời gian đáng kể để xem xét các lựa chọn thay thế có sẵn (SELinux, AppArmor, cgroups, ulimit, Linux không gian tên, LXC, Docker, ...) cho giải pháp đơn giản nhất đáp ứng yêu cầu của tôi nhưng kinh nghiệm của tôi về lĩnh vực này còn hạn chế.

Hiểu biết hiện tại: LXC và Docker một chút về mặt nặng cho trường hợp sử dụng của tôi và không hoàn toàn an toàn 1 . AppArmor thích hơn so với SELinux do cấu hình dễ dàng hơn, sử dụng nó cho các hạn chế fs và net; cgroups thích ulimit (hoạt động trên một quy trình duy nhất), đã sử dụng nó cho các hạn chế mem và cpu.

Đây có phải là cách đơn giản nhất để đạt được mục tiêu của tôi? Tôi có thể sử dụng AppArmor hoặc cgroups độc quyền không? Có một số lỗ hổng bảo mật rõ ràng trong mô hình của tôi? Hướng dẫn phải là "công nhân được phép tự hạ mình nhưng không có gì khác" .


2
Nếu tài nguyên giới hạn là mục tiêu của bạn, bạn có thể làm tốt hơn nhiều so với khách Ubuntu (hoặc thực sự là bất kỳ dẫn xuất Debian nào cho vấn đề đó) . Trong mọi trường hợp, bạn có thể muốn sử dụng chế độ linux và / hoặc (với hạt nhân gần đây) các tài namespace
mikeserv

2
LXC có vẻ như chính xác những gì bạn cần. Tại sao bạn nghĩ rằng nó ở phía nặng nề và không an toàn? (Chắc chắn, nó có lỗi, nhưng bạn cũng có thể sử dụng bất cứ thứ gì.)
Gilles 'SO- ngừng trở nên xấu xa'

Bản trình bày được liên kết (thừa nhận từ năm 2011) và phần Bảo mật của tài liệu Ubuntu LXC nói về 'rò rỉ không gian tên' không được yên tâm lắm. Có vẻ như LXC, chủ yếu dựa trên không gian tên và nhóm, có thể là lựa chọn tốt nhất ngay bây giờ. Tôi cũng tìm thấy Linux-Sandboxing , đọc thú vị
StephQ

Nó có thể yêu cầu một chút trang bị lại, nhưng bạn đã xem xét việc chạy trên các tù BSD chưa?
Ryder

Mặc dù LXC có thể 'nặng' ở chỗ nó giống như một loạt các VM, nhưng thực sự rất đơn giản để tạo ra chúng. Một số giải pháp này, trong khi 'nhẹ hơn' có thể yêu cầu rất nhiều cấu hình. Với LXC, bạn có thể không cần định cấu hình những thứ như viết, vì một ứng dụng sẽ có toàn bộ vùng chứa.
MikeP

Câu trả lời:


1

Có, bạn có thể sử dụng riêng các nhóm và SELinux / AppArmor để giám sát và kiểm soát mã tùy ý mà bạn sẽ thực thi.

Với các nhóm, bạn có thể làm như sau:

  1. Giới hạn sử dụng lõi CPU xuống 1 CPU với cpusethệ thống con
  2. Đặt giới hạn sử dụng bộ nhớ với memoryhệ thống con, theo dõi ngay cả các nhánh. Xem https://github.com/gsauthof/cgmemtime để biết ví dụ.
  3. Ngăn chặn truy cập mạng vào bất cứ thứ gì không locó trong net_priohệ thống con.

Và với SELinux / AppArmor, bạn có thể giới hạn quyền truy cập đọc / ghi của quá trình.

Lưu ý: Tôi không quen với AppArmor, nhưng đây là hệ thống Kiểm soát truy cập bắt buộc (MAC), có nghĩa là bảo vệ việc viết và đọc là công việc.

Sử dụng các hệ thống này là một vấn đề của việc viết các cấu hình thích hợp. Tất nhiên, tất cả điều này nói dễ hơn nhiều so với thực hiện. Vì vậy, đây là một vài liên kết tham khảo để giúp bạn bắt đầu:

Chúc may mắn!


1

Tôi sẽ loại bỏ SELinux cho AppArmor chỉ khi tôi đang sử dụng Ubuntu . (thực sự khá khó khăn)

LXC không tự bảo mật Nếu bạn cần bảo mật, bạn phải sử dụng chúng thông qua libvirt (dựa trên SELinux MLS ).

Vấn đề của bạn là vô hạn, vì vậy đừng cố gắng tìm bất kỳ giải pháp nào ngoài giá và không có thời gian vô hạn, hãy nhớ rằng ngay cả kernel.org cũng bị loại bỏ và gần đây FBI đã tuyên bố rằng ai đó đã sử dụng hệ thống của họ trong nhiều năm mà không bị phát hiện cho đến bây giờ.

Tôi sẽ sử dụng LXC / libvirt để bảo mật khá tốt hoặc tôi sẽ thử các thùng chứa intel "mới" , sử dụng VM rất nhẹ cho thùng chứa của bạn với việc sử dụng DAX / KSM rõ ràng (Tôi đã thử nghiệm chúng nhưng chúng trông rất thực sự hứa hẹn).

Nếu bạn đang lo ngại về khai thác hạt nhân, grsecurity là giải pháp của bạn, nhưng bạn sẽ phải tích hợp nó với dung dịch chứa của bạn (đau đầu cho chắc chắn).

Vì vậy, nhiệm vụ không dễ dàng cho chắc chắn, LXC / libvirt thực sự gọn gàng nhưng có lẽ các container rõ ràng là con đường để đi.

Docker? Tôi đã không / sẽ không sử dụng docker cho nhiều hơn thử nghiệm cục bộ khi không có hộp mơ hồ, họ cần cách làm việc nhiều hơn và cộng đồng tốt hơn.

Tất nhiên các thùng chứa systemd cũng tốt nhưng tôi cho rằng bạn không thích / muốn chúng vì bạn thậm chí không đề cập đến chúng và chúng không phải là giải pháp bất khả tri của nhà cung cấp.

Nếu bạn muốn một cái gì đó "dễ dàng" hơn và nghiệp dư hơn, bạn có thể kiểm tra firejail , tôi đã sử dụng nó cho một số "ứng dụng" trên máy tính để bàn và nó thực hiện công việc (khá dễ dàng để tạo mẫu cho ứng dụng tùy chỉnh của bạn, hãy sử dụng "riêng tư" gắn kết trên đầu trang của bạn và hạn chế mạng chỉ sử dụng cục bộ, các quy trình được sinh ra thừa kế cho cha mẹ và tiếp tục ...).

Chúc mừng và vui vẻ mà không phát điên. ;)


0

seccomp-bpf là một tùy chọn khác hoạt động tốt cho OpenSSH, vsftpd và Chromium, nó chỉ có exit (), sigreturn (), read () nó cũng sử dụng write () mặc dù nó cho phép lọc các lệnh gọi hệ thống bằng cách sử dụng quy tắc Bộ lọc gói Berkeley có thể định cấu hình. Nó cũng có thể được sử dụng cùng với các nhóm cho bộ nhớ, cpu, v.v.

https://wiki.mozilla.org/Security/Sandbox/Seccomp


0

Bạn có thể muốn xem xét các hệ thống điện toán lưới. Cụ thể, BOINC ( http : //boinc.ber siêu.edu ) kiểm tra hầu hết tất cả các hộp của bạn.

Tôi tin rằng nó hoạt động trên các tham số của bạn như vậy:

fs: có thể đọc / ghi vào thư mục riêng của nó, không ở đâu khác

net: có thể được cấu hình để chỉ cho phép truy cập mạng vào máy chủ BOINC của bạn, nhưng không được mặc định ra khỏi hộp IIRC

mem: có, giới hạn bộ nhớ riêng cho máy nhàn rỗi và không nhàn rỗi

cpu: có, thậm chí có thể nói "không chạy nếu máy tính không hoạt động"

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.