Cấu hình AppArmor trong Docker / LXC


11

Tôi có một Docker container (LXC) chạy MySQL. Vì ý tưởng đằng sau Docker thường là "một quy trình đang chạy trên một container", nếu tôi xác định các cấu hình AppArmor nhắm mục tiêu nhị phân MySQL, liệu chúng có được thực thi không? Có cách nào để tôi kiểm tra điều này?


Tại sao bạn muốn sử dụng apparmor bên trong container?
c4f4t0r

3
Trong trường hợp một ngày không hoặc khai thác khác được chạy dựa trên cơ sở dữ liệu để ngăn chặn nó truy cập bất cứ điều gì khác. Tôi tin tưởng Linux cgroups, nhưng không nhiều . Tốt hơn hết là bạn nên an toàn hơn là xin lỗi, tôi muốn khóa MySQL hơn là không có ngày nào MySQL tìm cách thoát ra khỏi một nhóm.
Naftuli Kay

Câu trả lời:


8

Đầu tiên, các nhóm không được sử dụng để tách ứng dụng khỏi các ứng dụng khác trên hệ thống. Chúng được sử dụng để quản lý việc sử dụng tài nguyên và truy cập thiết bị. Đó là các không gian tên khác nhau (PID, UTS, mount, user ...) cung cấp một số cách ly (giới hạn).

Hơn nữa, một quy trình được khởi chạy bên trong một Docker container có thể sẽ không thể quản lý hồ sơ AppArmor mà nó đang chạy. Cách tiếp cận hiện được thực hiện là thiết lập một hồ sơ AppArmor cụ thể trước khi khởi chạy container.

Có vẻ như trình điều khiển thực thi libcontainer trong Docker hỗ trợ thiết lập hồ sơ AppArmor cho các thùng chứa , nhưng tôi không thể tìm thấy bất kỳ ví dụ hoặc tham chiếu nào trong tài liệu.

Rõ ràng AppArmor cũng được hỗ trợ với LXC trong Ubuntu .

Bạn nên viết một hồ sơ AppArmor cho ứng dụng của mình và đảm bảo LXC / libcontainer / Docker / ... tải nó trước khi bắt đầu các quy trình bên trong container.

Hồ sơ được sử dụng theo cách này nên được thi hành và để kiểm tra nó, bạn nên thử truy cập bất hợp pháp và đảm bảo rằng nó không thành công.

Không có liên kết giữa nhị phân và hồ sơ thực thi trong trường hợp này. Bạn phải thông báo rõ ràng cho Docker / LXC sử dụng hồ sơ này cho thùng chứa của bạn. Viết một hồ sơ cho nhị phân MySQL sẽ chỉ thực thi nó trên máy chủ, không phải trong thùng chứa.


Đây là kinh nghiệm (hạn chế) của tôi cho đến nay. Tôi đã gặp sự cố khi tạo hồ sơ từ trong bộ chứa Docker, nhưng nếu một cấu hình được tạo bên ngoài vùng chứa và sau đó được sao chép, thì nó sẽ hoạt động ™, tất nhiên là bạn phải khởi động AppArmor trong vùng chứa trước khi chạy tệp thực thi.
Naftuli Kay

@Siosm: LCX! = Libcontainer. Câu hỏi là về trình điều khiển LXC.
0xC0000022L

@ 0xC0000022L: Mô hình thực thi hồ sơ AppArmor là giống nhau cho bất kỳ công cụ nào được sử dụng để giới hạn các quy trình trong các thùng chứa.
Siosm

3

Câu trả lời rất có thể: không.

Các Ubuntu Server hướng dẫn chủ đề LXC thảo luận khá nhiều câu hỏi chính xác của bạn và làm cho các tuyên bố sau:

Các chương trình trong một container không thể bị giới hạn hơn nữa - ví dụ, MySQL chạy trong hồ sơ container (bảo vệ máy chủ) nhưng sẽ không thể vào hồ sơ MySQL (để bảo vệ container).

Một lựa chọn tốt hơn để khai thác tránh có tác dụng không mong muốn là để hạn chế người sử dụng chạy các container userspace LXC container và sử dụng rằng đòn bẩy các đặc trưng của hạt nhân. Tuy nhiên, dockerhiện tại - theo hiểu biết của tôi - không hỗ trợ userns.

Trong trường hợp như vậy, MySQL sẽ - từ góc độ máy chủ - chạy như người dùng không có đặc quyền, trong khi bên trong container, nó có thể được chạy như root. Sau đó, bạn có thể sử dụng iptablesđể liên kết MySQL với một cổng bên ngoài của máy chủ, nếu cần.

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.