una - listar usuarios linux
¿Es posible configurar las capacidades de Linux por usuario? (5)
Parece que hay soporte para capacidades de grano fino en el kernel de Linux, que permite otorgar privilegios a un proceso para hacer cosas como, por ejemplo, abrir sockets sin formato o aumentar la prioridad de subprocesos sin otorgar privilegios de raíz de proceso.
Sin embargo, me gustaría saber si hay una forma de otorgar capacidades por usuario . Es decir, permitir que los procesos no root y no suid adquieran esas capacidades.
Eche un vistazo a CapOver - debería hacer lo que quiera.
Nota: no he usado esto porque no ha sido (¿aún?) Portado a la API del kernel 2.6.30ish.
Hay limits.conf, es posible restringir algunos recursos para un usuario o un grupo a través de él.
Echa un vistazo a man limits.conf
No lo he confirmado, pero creo que este aspecto de SELinux puede ser su respuesta:
http://www.lurking-grue.org/writingselinuxpolicyHOWTO.html#userpol5.1
Sí, puede usar setcap
para especificar un conjunto de capacidades para un ejecutable, que puede otorgar capacidades específicas cuando se ejecuta ese ejecutable.
De la página del manual de capabilities(7) :
Capacidades de archivo Desde el kernel 2.6.24, el kernel admite la asociación de conjuntos de capacidades con un archivo ejecutable utilizando setcap (8). Los conjuntos de capacidades de archivos se almacenan en un atributo extendido (consulte setxattr (2)) denominado security.capability. Escribir en este atributo extendido requiere la capacidad CAP_SETFCAP. Los conjuntos de capacidades de archivos, junto con los conjuntos de capacidades del subproceso, determinan las capacidades de un subproceso después de un execve (2).
La forma de otorgar capacidades por usuario (o incluso por grupo) sería con un módulo PAM. La respuesta de sqweek muestra cómo hacerlo usando pam_cap
.
Se puede hacer con libcap; proporciona un módulo PAM pam_cap.so. Sin embargo, no es tan simple :)
Cada proceso tiene tres conjuntos de capacidades:
- Efectivo (las tapas que este proceso tiene en realidad)
- Permitido (los límites que este proceso puede tener - un superconjunto de Efectivo)
- Heredable (los límites que este proceso puede pasar a un proceso hijo)
Cada archivo tiene los mismos conjuntos de capacidades. Cuando un nuevo binario es exec () ''d, las capacidades del proceso cambian de acuerdo con las siguientes reglas, donde:
- pI / pP son las capacidades iniciales heredadas / permitidas del proceso
- pI ''/ pP'' / pE ''son las nuevas capacidades Heredadas / Permitidas / Eficaces del proceso
- fI / fP / fE son las capacidades Heredadas / Permitidas / Eficaces del archivo
- y representa la intersección
| representa sindicato
pI'' = pI pP'' = fP | (pI & fI) pE'' = fE & pP''
(simplificado desde http://www.friedhoff.org/posixfilecaps.html )
En la mayoría de los escenarios, pE ''es el único resultado que nos importa. Los programas que están vinculados con libcap pueden llamar a setcap () para cambiar sus límites efectivos (siempre que los límites que intenten solicitar estén en el conjunto permitido), pero la gran mayoría de los programas no los tocan explícitamente, por lo que debemos disponer que la tapa sea efectiva post-exec ().
Tener un ejemplo concreto ayudará a comprender aquí ... Me harté de tener que ''su'' para ejecutar openvpn, así que quería concederme la capacidad de CAP_NET_ADMIN para permitir la configuración de rutas y demás.
Mirando la última regla ( pE'' = fE & pP''
) está claro que para tener CAP_NET_ADMIN en el conjunto efectivo del proceso, CAP_NET_ADMIN debe estar en el conjunto efectivo del archivo . Por lo tanto, el sistema de capacidades no nos permite simplemente decir "conceder CAP_NET_ADMIN al usuario de semana", ya que las capacidades del programa son siempre importantes.
Estar en el conjunto de archivos efectivos no es suficiente, sin embargo, el límite también debe estar en el nuevo conjunto permitido del proceso. Veamos esa regla: pP'' = fP | (pI & fI)
pP'' = fP | (pI & fI)
. Entonces, hay dos maneras en que podemos obtener el límite en pP''
, agregamos CAP_NET_ADMIN al conjunto permitido del archivo, o lo agregamos al conjunto hereditario del archivo y nos aseguramos de que esté en el conjunto heredable del proceso.
Si lo agregamos al conjunto Permitido del archivo, las capacidades iniciales del proceso se vuelven irrelevantes: openvpn obtendrá CAP_NET_ADMIN cada vez que se ejecuta, independientemente de quién lo ejecute. Esto es similar a setuid, pero proporciona un enfoque más detallado. Aún así, no es una granularidad por usuario, así que echemos un vistazo a la otra opción.
Tenga en cuenta la primera regla, pI'' = pI
. Las capacidades hereditarias del proceso no se ven afectadas por exec (). Lo que esto significa es que todo lo que necesitamos es un único programa compatible con libcap para establecer CAP_NET_ADMIN como un límite hereditario, y cada proceso generado a partir de ahí también tendrá CAP_NET_ADMIN hereditario. Esta es la función que desempeña el módulo pam: modifica el conjunto hereditario durante el inicio de sesión, que luego se hereda para todos los procesos de ese usuario.
Resumir:
- Instalar libcap
- Configure el módulo pam_cap (agregue la línea
cap_net_admin sqweek
a/etc/security/capability.conf
. Si el archivo no existía anteriormente, agregue otra líneanone *
para obtener un valor predeterminado razonable. - Habilite el módulo PAM durante el inicio de sesión (agregue la
auth required pam_cap.so
a/etc/pam.d/login
). ¡Asegúrese de probar su inicio de sesión en un terminal separado ANTES de cerrar la sesión cuando realice cambios PAM para que no se bloquee! - Agregue CAP_NET_ADMIN a los conjuntos efectivos e
setcap cap_net_admin+ie /usr/sbin/openvpn
para openvpn (setcap cap_net_admin+ie /usr/sbin/openvpn
) -
openvpn
llama aip
para cambiar la tabla de enrutamiento y demás, por lo que necesita el mismo tratamiento (setcap cap_net_admin+ie /sbin/ip
)