Apakah mengelola cgroup memerlukan akses root?


12

Saya mencoba bekerja dengan grup kontrol pada dua sistem operasi yang berbeda (Ubuntu dan CentOS). Ada beberapa masalah yang ingin saya tanyakan.

Saya mencoba membuat grup kontrol menggunakan cgcreateperintah, dan sepertinya itu membutuhkan akses root pada mesin. Semua contoh yang saya lihat sejauh ini tidak mengatakan apa-apa tentang perlunya menjadi pengguna root untuk membuat atau memodifikasi grup kontrol.

Apakah benar-benar perlu untuk menjadi pengguna root? Tujuan akhirnya adalah untuk menulis aplikasi C ++ yang membuat dan mengelola grup kontrol untuk mengontrol sumber daya menggunakan API libcgroup. Tetapi aplikasi C ++ tidak akan dijalankan oleh pengguna root mana pun. Bisa jadi pengguna biasa.


1
wiki.archlinux.org/index.php/Cgroups memiliki beberapa info, Anda akan memerlukan beberapa setup oleh root rupanya (belum melihat secara detail di cgroups sendiri).
Mat

Situs web itu tidak membantu dengan rinciannya. Itu hanya gambaran tingkat tinggi.
Rambo

1
Ya, itu memberi tahu Anda bahwa root dapat mengatur grup yang dapat dikelola oleh pengguna non-root.
Mat

Saya melihat ke dalam kelompok secara luas beberapa waktu yang lalu; info itu mungkin berguna bagi Anda. Namun saya melakukan semuanya sebagai root, jadi saya tidak punya jawaban untuk pertanyaan khusus ini.
Wildcard

Anda dapat membuat grup 'editcgroup', lalu izinkan semua orang di grup itu melakukan 'sudo cgcreate' dan 'sudo cgdelete'
John Militer

Jawaban:


4

Skenario normal adalah bahwa Anda mengatur cgcreate, cgset, cgdelete, cgget, dll sebagai akar . Akhirnya program / skrip yang dimaksudkan untuk menahan diri dari mengisap ke banyak sumber daya akan dieksekusi sebagai pengguna normal. Jadi, atur sebagai root, gunakan dan eksekusi sebagai pengguna.

Ini dilakukan dengan parameter -adan perintah (dieksekusi sebagai root). Jadi sudah ketika Anda mengatur grup. Dalam kasus saya:-tcgcreate

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

di mana monero adalah nama pengguna pengguna masa depan yang akan menjalankan dan menjalankan program dengan pembatasan cgroup. Untuk perbedaan yang baik antara -adan -tsubparameter lihat halaman manual cgcreate.

man cgcreate

Dalam kebanyakan kasus, keduanya adalah pengguna yang sama.

Kemudian, siapkan batasan (masih sebagai root):

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

cgset -r cpu.shares = 128 monerogroup

Periksa entri Anda jika Anda ingin:

cgget -g memory: / monerogroup | grep byte

Dan akhirnya beralih pengguna, dalam kasus saya pengguna monero, dan dari folder kanan:

cgexec -g memory, cpu: monerogroup ./monerod

Pengguna tidak akan mengalami kesulitan dengan izin atau jadi ketika Anda mengaturnya khusus untuknya.


2

Implikasi keamanan selain ini, Anda dapat mengatur setuidbit

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

untuk memberikan pengguna non root yang menjalankan kekuatan root program itu.

Rekomendasi adalah untuk kemudian menghapus akses pengguna normal

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

dan membuat grup khusus yang ingin Anda izinkan untuk menggunakan cgcreate IE cgusers,

groupadd cgusers

dan ubah keanggotaan grup pada file-file itu ke grup itu:

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

Semua itu akan dijalankan oleh root, setelah itu semua pengguna dalam cgusersgrup, akan berjalan cgcreatedan cgdeletesebagai root alih-alih sebagai diri mereka sendiri. Anda hanya perlu memiliki anggota yang ingin memiliki kekuatan ini di bawah grup yang tepat.


1

Cgroup akhirnya ditangani melalui sistem file cgroup. Kemampuan untuk membuat cgroup seharusnya hanya menjadi kemampuan untuk membuat direktori di bawahnya dan menulis ke file. Jika Anda memasang FS cgroup dengan izin yang lebih rumit, atau jika Anda mengubah izin mereka dengan cepat, maka pengguna tertentu harus dapat melakukan hal-hal. Jelas Anda tidak akan dapat menambahkan ID proses dari proses pengguna lain ke file tugas. Anda hanya dapat menambahkan pengguna Anda.

Karena itu, saya tidak yakin hal di atas bersifat global. Yaitu ada kemungkinan cgroup tertentu tidak mendukung ini.

Secara keseluruhan, pendekatan terbaik adalah menggunakan manajer cgroup yang kemudian dapat diinstruksikan untuk mengaitkan tugas ke cgroup. Saya percaya cgmanager melakukan sesuatu seperti ini.


1

Jawaban singkatnya adalah tidak.

Untuk pembuatan, dan penugasan kepemilikan suatu cgroup, Anda bergantung pada hak akses root. Tidak ada cara yang dapat diandalkan untuk menyiasatinya.

Namun, Anda dapat membuat cgroup dan menetapkan kepemilikan kepada pengguna atau grup tertentu.

Pengguna

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

Kelompok

$ 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}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.