2011-10-03 15 views
6

Mi programa está utilizando la llamada al sistema Linux setpriority() para cambiar las prioridades de los hilos que crea. Necesita establecer prioridades negativas (-10) pero, como se menciona en la documentación, esto falla cuando se ejecuta como un usuario normal.¿Cómo establecer la capacidad CAP_SYS_NICE para un usuario de Linux?

El usuario necesita la capacidad CAP_SYS_NICE para poder establecer las prioridades como lo desee, pero no tengo idea de cómo dar esa capacidad al usuario.

Así que mi pregunta: ¿cómo configurar la capacidad de CAP_SYS_NICE a un usuario de Linux?

+0

Niza -10 es una prioridad más alta, pero definitivamente nada remotamente en tiempo real. –

+0

Es solo un puntero, entonces agrego un comentario: verifique esta respuesta: http://stackoverflow.com/a/17685265/6899 – tzot

Respuesta

2

Jan Hudec tiene razón en que un proceso no puede darse a sí mismo una capacidad, y una envoltura setuid es la forma obvia de obtener la capacidad. Además, tenga en cuenta que necesitará prctl(PR_SET_KEEPCAPS, ...) cuando suelte la raíz. (Consulte la página del manual prctl para obtener más información). De lo contrario, abandonará la capacidad cuando haga la transición a su ID de usuario real no raíz.

Si realmente quiere poner en marcha sesiones de usuario con un buen nivel permitido diferente, usted podría ver las páginas man pam_limits y limits.conf, como el módulo pam_limits le permite cambiar el límite buen disco. Podría ser una línea como: sudo

yourspecialusername hard nice -10 
+2

Sé que esta respuesta es anterior a la suciedad, pero está el módulo pam_cap.so que leerá en '/ etc/security/capability.conf' y establecer capacidades en consecuencia – Bratchley

0

AFAIK No es posible obtener una capacidad. Los procesos raíz tienen todas las capacidades y pueden renunciar a ellos, pero una vez que se abandonan, no se pueden recuperar. Por lo tanto, necesitará un contenedor suid-root que ceda todas las demás capacidades y ejecute el proceso.

4

Hay una bonita utilidad práctica para establecer capacidades en un archivo binario: setcap. Esto debe ejecutarse como root en el binario de su aplicación, pero una vez configurado, puede ejecutarse como un usuario normal. Ejemplo:

$ sudo setcap 'cap_sys_nice=eip' <application> 

Puede confirmar qué capacidades están en una aplicación que utiliza getcap:

$ getcap <application> 
<application> = cap_sys_nice+eip 

me gustaría sugerir la integración de las capacidades en su makefile en la línea de instalar, lo que normalmente se ejecuta como root en cualquier caso . Tenga en cuenta que las capacidades no se pueden almacenar en un archivo TAR ni en ningún formato de paquete derivado. Si luego hace el paquete de su aplicación, necesitará un script (postinst para paquetes Debian) para aplicar la capacidad en el despliegue.

+0

Tu comando funciona, pero ¿puedo preguntar dónde encontraste' cap_sys_nice = eip', especialmente la parte '= eip'? No puedo verlo en 'man setcap'nor en' man capabilities'. – elmicha

+1

@elmicha En mi sistema al menos, la página setcap del hombre contiene la siguiente línea: _Las capacidades se especifican en la forma descrita en cap_from_text (3) _. Tenga en cuenta que la página de manual cap_from_text puede no estar disponible por defecto (incluso si tiene setcap).En CentOS, por ejemplo, está disponible en el paquete libcap-devel. Describe las letras adicionales como 'banderas del operador', donde e = efectivo, i = heredable yp = permitido, respectivamente. –

Cuestiones relacionadas