¿La gestión de cgroups requiere acceso de root?


12

Estoy tratando de trabajar con grupos de control en dos sistemas operativos diferentes (Ubuntu y CentOS). Hay pocas preocupaciones que me gustaría preguntar.

Estoy tratando de crear un grupo de control usando el cgcreatecomando, y parece que requiere acceso de root en la máquina. Todos los ejemplos que he visto hasta ahora no dicen nada sobre la necesidad de ser el usuario raíz para crear o modificar grupos de control.

¿Es realmente necesario ser el usuario root? El objetivo final es escribir una aplicación C ++ que cree y administre grupos de control para controlar recursos utilizando la API libcgroup. Pero la aplicación C ++ no será ejecutada por ningún usuario root. Podría ser cualquier usuario normal.


1
wiki.archlinux.org/index.php/Cgroups tiene alguna información, aparentemente necesitará algo de configuración por root (no he mirado en detalle en cgroups todavía).
Mat

Sin embargo, ese sitio web no ayuda con los detalles. Es solo una descripción general de alto nivel.
Rambo

1
Bueno, le dice que la raíz puede configurar grupos que sean manejables por usuarios no root.
Mat

Me miraba en cgroups ampliamente hace un tiempo; esa información puede ser de utilidad para usted. Sin embargo, lo estaba haciendo todo como root, por lo que no tengo la respuesta a esta pregunta en particular.
Comodín el

Puede crear un grupo 'editcgroup', luego permitir que todos en ese grupo hagan 'sudo cgcreate' y 'sudo cgdelete'
John Militer

Respuestas:


4

El escenario normal es que se establece cgcreate, cgset, cgdelete, cgget, etc., hasta que la raíz . Eventualmente, el programa / script destinado a restringir la succión de muchos recursos se ejecutará como un usuario normal. Entonces, configurar como root, usar y ejecutar como usuario.

Esto se está haciendo con los parámetros -ay -tdel cgcreatecomando (ejecutado como root). Entonces ya cuando estableces un grupo. En mi caso:

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

donde monero es el nombre de usuario del futuro usuario que ejecutará y ejecutará el programa con las restricciones de cgroup. Para la fina diferencia entre los subparámetros -ay -tconsulte las páginas de manual de cgcreate.

hombre cgcreate

En la mayoría de los casos, es el mismo usuario.

Luego, configure las restricciones (aún como root):

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

cgset -r cpu.shares = 128 monerogroup

Verifique sus entradas si desea:

cgget -g memoria: / monerogroup | grep bytes

Y luego eventualmente cambiar de usuario, en mi caso usuario monero, y de la carpeta correcta:

cgexec -g memory, cpu: monerogroup ./monerod

El usuario no tendrá ninguna dificultad con los permisos más o menos, ya que lo configura específicamente para él.


2

Implicaciones de seguridad de este lado, se puede establecer el setuidbit

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

dar a los usuarios no root que ejecutan ese programa poder raíz.

La recomendación sería eliminar el acceso normal del usuario.

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

y cree un grupo especial que desee permitir que use cgcreate IE cgusers,

groupadd cgusers

y cambie la membresía del grupo en esos archivos a ese grupo:

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

Todo eso se ejecutará por root, después de eso, todos los usuarios del cgusersgrupo se ejecutarán cgcreatey cgdeletecomo root en lugar de como ellos mismos. Solo necesitaría tener miembros a los que les gustaría tener este poder bajo el grupo correcto.


1

Los grupos C se manejan en última instancia a través de los sistemas de archivos cgroup. La capacidad de crear cgroups debería ser simplemente la capacidad de crear directorios bajo esos / ellos y escribir en archivos. Si monta los FS de cgroup con permisos más elaborados, o si cambia sus permisos sobre la marcha, entonces ciertos usuarios deberían poder hacer cosas. Obviamente, no podrá agregar las ID de proceso del proceso de otros usuarios al archivo de tareas. Solo podrá agregar su usuario.

Dicho esto, no estoy seguro de que lo anterior sea global. Es decir, existe la posibilidad de que ciertos grupos c no admitan esto.

En general, el mejor enfoque es usar un administrador de cgroup que luego pueda recibir instrucciones para asociar tareas a un cgroup. Creo que cgmanager hace algo como esto.


1

La respuesta corta es no.

Para la creación y la asignación de propiedad de un cgroup, depende de los privilegios de root. No hay una forma confiable de evitarlo.

Sin embargo, puede crear un cgroup y asignar la propiedad a un determinado usuario o grupo.

Usuario

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

Grupo

$ 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}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.