Có phải quản lý cgroups yêu cầu quyền truy cập root?


12

Tôi đang cố gắng làm việc với các nhóm kiểm soát trên hai hệ điều hành khác nhau (Ubuntu và CentOS). Có vài mối quan tâm mà tôi muốn hỏi.

Tôi đang cố gắng tạo một nhóm điều khiển bằng cgcreatelệnh và có vẻ như nó yêu cầu quyền truy cập root trên máy. Tất cả các ví dụ mà tôi đã thấy cho đến nay không nói gì về việc cần phải là người dùng root để tạo hoặc sửa đổi các nhóm điều khiển.

Có thực sự cần thiết phải là người dùng root? Mục tiêu cuối cùng là viết một ứng dụng C ++ để tạo và quản lý các nhóm kiểm soát để kiểm soát tài nguyên bằng API libcgroup. Nhưng ứng dụng C ++ sẽ không được chạy bởi bất kỳ người dùng root nào. Nó có thể là bất kỳ người dùng bình thường.


1
wiki.archlinux.org/index.php/Cgroups có một số thông tin, bạn sẽ cần một số thiết lập bằng root rõ ràng (bản thân tôi chưa xem chi tiết về các cgroups).
Mat

Trang web đó không giúp với các chi tiết mặc dù. Nó chỉ là một tổng quan cấp cao.
Rambo

1
Vâng, nó cho bạn biết rằng root có thể thiết lập các nhóm mà người dùng không phải root có thể quản lý được.
Mat

Tôi đã nhìn vào các nhóm rộng rãi một thời gian trước đây; thông tin đó có thể được sử dụng cho bạn. Tuy nhiên tôi đã làm tất cả với tư cách là root, vì vậy tôi không có câu trả lời cho câu hỏi cụ thể này.
tự đại diện

Bạn có thể tạo một nhóm 'nhóm chỉnh sửa', sau đó cho phép mọi người trong nhóm đó thực hiện 'sudo cgcreate' và 'sudo cgdelete'
John Militer

Câu trả lời:


4

Kịch bản bình thường là bạn thiết lập cgcreate, cgset, cgdelete, cggetvv lên như rễ . Cuối cùng, chương trình / tập lệnh có nghĩa là bị hạn chế từ việc hút vào nhiều tài nguyên sẽ được thực thi như một người dùng bình thường. Vì vậy, thiết lập như root, sử dụng và thực thi như người dùng.

Điều này đang được thực hiện với -a-tcác tham số của cgcreatelệnh (được thực thi như root). Vì vậy, khi bạn thiết lập một nhóm. Trong trường hợp của tôi:

cgcreate -t ​​monero: monero -a monero: monero -g memory, cpu: monerogroup

trong đó monero là tên người dùng của người dùng trong tương lai sẽ thực thi và chạy chương trình với các hạn chế của nhóm. Đối với sự khác biệt tốt giữa -avà các -ttiểu phần tham khảo các trang man của cgcreate.

người đàn ông cgcreate

Trong hầu hết các trường hợp đó là cả hai người dùng giống nhau.

Sau đó, thiết lập các hạn chế (vẫn là root):

cgset -r memory.limit_in_bytes = $ ((4 * 1024 * 1024 * 1024)) monerogroup

cgset -r cpu.shares = 128 nhóm đơn

Kiểm tra các mục của bạn nếu bạn muốn:

bộ nhớ cgget -g: / monerogroup | grep byte

Và cuối cùng chuyển người dùng, trong trường hợp của tôi là người dùng monero và từ thư mục bên phải:

bộ nhớ cgexec -g, cpu: monerogroup ./monerod

Người dùng sẽ không gặp bất kỳ khó khăn nào với quyền hoặc vì vậy khi bạn thiết lập riêng cho anh ta.


2

Ý nghĩa bảo mật của điều này sang một bên, bạn có thể đặt setuidbit

chmod +s /bin/cgcreate
chmod +s /bin/cgdelete

để cung cấp cho người dùng không phải root chạy chương trình gốc.

Việc giới thiệu sẽ là sau đó loại bỏ quyền truy cập bình thường của người dùng

chmod 550 /bin/cgcreate
chmod 550 /bin/cgdelete

và tạo một nhóm đặc biệt mà bạn muốn cho phép sử dụng cgcreate IE cgusers,

groupadd cgusers

và thay đổi thành viên nhóm trên các tệp đó thành nhóm đó:

chgrp cgusers /bin/cgcreate
chgrp cgusers /bin/cgdelete

Tất cả điều đó sẽ được chạy bởi root, sau đó tất cả người dùng trong cgusersnhóm, sẽ chạy cgcreatecgdeleteroot thay vì như chính họ. Bạn chỉ cần có các thành viên mà bạn muốn có sức mạnh này theo đúng nhóm.


1

Các nhóm cuối cùng được xử lý thông qua (các) hệ thống tập tin cgroup. Khả năng tạo các nhóm chỉ nên là khả năng tạo các thư mục theo đó / ghi và ghi vào các tệp. Nếu bạn gắn kết các nhóm cgroup với các quyền phức tạp hơn hoặc nếu bạn thay đổi quyền của họ một cách nhanh chóng, thì một số người dùng nhất định sẽ có thể thực hiện công cụ. Rõ ràng là bạn sẽ không thể thêm ID quy trình của quy trình của người dùng khác vào tệp tác vụ. Bạn sẽ chỉ có thể thêm người dùng của bạn.

Phải nói rằng, tôi không chắc những điều trên là toàn cầu. Tức là có một số nhóm nhất định không hỗ trợ điều này.

Nhìn chung, cách tiếp cận tốt nhất là sử dụng trình quản lý nhóm, sau đó có thể được hướng dẫn để liên kết các tác vụ với một nhóm. Tôi tin rằng cgmanager làm một cái gì đó như thế này.


1

Câu trả lời ngắn gọn là không.

Để tạo và gán quyền sở hữu của một nhóm, bạn phụ thuộc vào quyền root. Không có cách đáng tin cậy để có được xung quanh nó.

Tuy nhiên, bạn có thể tạo một nhóm và gán quyền sở hữu cho một người dùng hoặc nhóm nhất định.

Người sử dụng

$ u=$(whoami)
$ sudo mkdir /sys/fs/cgroup/cpuset/${u}
$ sudo chown -R ${u}: /sys/fs/cgroup/cpuset/${u}

Nhóm

$ g=MYGROUP && grep ^${g}: /etc/group || echo "Your group doesn't exist. Run \"mkgroup $g\" and repeat this command before you continue." 
$ sudo mkdir /sys/fs/cgroup/cpuset/${g}
$ sudo chgrp -R ${g} /sys/fs/cgroup/cpuset/${g}
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.