Las capacidades permiten la evaluación de algunos privilegios importantes del sistema en un hilo separado diferente del proceso actual. De esta manera, no necesita ejecutar un programa como root para acceder a ciertas partes del sistema.

Como solución que surge de las necesidades, la sección 25 de POSIX.1e trata sobre este tema. El desarrollo de los privilegios definidos en esa sección y más se ha completado con el lanzamiento de la versión 2.6.26 del kernel de Linux. Aquí encontrará todo lo que necesita saber sobre las capacidades del kernel de Linux.

Comprensión de la lógica de la API de capacidades

El control de autorizaciones en sistemas basados ​​en Unix consta de dos pasos:

  • Si el propietario actual (ID de usuario efectivo, EUID) de la aplicación en ejecución es cero, entonces el sistema no verifica la autorización.
  • Si el valor de EUID es diferente de cero, el sistema realiza el proceso de control de acuerdo con las autorizaciones del usuario efectivo y el grupo de la aplicación relevante

Algunas aplicaciones necesitan tener privilegios más amplios (SUID, bits SGIT) mientras se ejecutan. Como el ejemplo más típico, puedes pensar en la aplicación de contraseña. Con esto, los usuarios de un sistema pueden cambiar sus contraseñas. Sin embargo, para escribir a la /etc/shadow archivo, donde se guardan las contraseñas encriptadas, es necesario trabajar con derechos de usuario root (es decir, ID de usuario = 0).

Para solucionar este problema, la aplicación passwd tiene un bit SUID. Cualquiera que sea el usuario que ejecute esta aplicación, el propietario activo (EUID) siempre será root:

ls -l /usr/bin/contraseña

# Producción
-rwsr-xr-x. 1 raíz raíz 32552 23 de julio de 2021 /usr/bin/passwd

La capacidad de ejecutar aplicaciones SUID en el modelo tradicional de autenticación de Unix parece haber resuelto el problema. Sin embargo, errores críticos en aplicaciones con bits SUID abren la puerta a la ejecución de códigos no deseados para usuarios con plena autoridad en el sistema. Una aplicación ideal debería poder ejecutarse sin necesidad de derechos de usuario raíz, si es posible.

El problema no termina solo con el bit SUID. También debe tener derechos de usuario raíz cuando desee escuchar en un puerto TCP o UDP privilegiado menos de 1024 en sistemas basados ​​en Unix. Por ejemplo, para poder escuchar el puerto TCP 80 de un servidor web, debe ejecutar la aplicación como usuario raíz.

A lo largo de los años, se ha comprendido lo devastador que es ejecutar software que brinda servicio al entorno de red con una cuenta de usuario totalmente autorizada. Como solución provisional, se adoptó que solo una cierta y más pequeña parte del programa escucha en el puerto privilegiado como root, y luego cambia el ID de usuario activo a otro usuario para procesos posteriores (por ejemplo, el usuario de nadie con derechos restringidos).

Este sistema, que se ha utilizado durante años, ha funcionado bien con su simplicidad y todavía se usa de manera eficiente. Sin embargo, hoy en día, es posible obtener algunas capacidades adicionales, específicas de la aplicación, a través de la API de capacidades de Linux, sin necesidad de derechos de root, además de lo mencionado anteriormente sistema.

¡El modelo de capacidad de Linux, explicado!

Puede encontrar la implementación más completa de la API de capacidades en el kernel de Linux. Las distribuciones modernas de Linux también intentan usar este nuevo modelo en todo el sistema tanto como sea posible.

Por ejemplo, para que la aplicación de ping funcione, debe poder abrir sockets RAW, que generalmente están reservados solo para usuarios root. En distribuciones antiguas de Linux, el problema es darle el bit SUID a la aplicación para que los usuarios normales puedan usarla. En estas versiones, cuando elimina el bit SUID de la aplicación e intenta ejecutar la aplicación como un usuario normal, obtiene el siguiente error:

silbido 8.8.8.8

# Producción
ping: socket abierto icmp: operación no permitida

Mientras que en las distribuciones modernas de Linux, la aplicación de ping probablemente no tenga el bit SUID:

ls -l /bin/ping 

# Producción
-rwxr-xr-x. 1 raíz raíz 95232 25 de julio de 2021 /bin/ping

Sin embargo, puede ejecutar la aplicación con éxito como un usuario normal. El mecanismo que hace esto posible es que la aplicación ping tiene la habilidad especial CAP_NET_RAW.

Puede aprender las capacidades adicionales de la aplicación con el obtener tapa comando de la siguiente manera:

sudo obtener tapa /bin/ping

# Producción
/bin/ping cap_net_raw=ep

Si el comando getcap devuelve una respuesta vacía, puede establecer manualmente este valor con:

sudo setcap cap_net_raw+ep /bin/ping

El modelo de capacidad de proceso

En la implementación de Linux, las capacidades de cada proceso se agrupan en tres encabezados:

Capacidad Declaración
permitido En este grupo, hay una lista de capacidades adicionales permitidas para el proceso relevante. Otorgar permiso no significa que se pueda usar activamente en ese momento. Es posible incluir las autorizaciones aquí en el conjunto de capacidades efectivas con una acción adicional.
eficaz Muestra la lista de capacidades actualmente activas del proceso relacionado. Con las funciones auxiliares que regulan el sistema de habilidades, es posible abandonar o recuperar una habilidad. En cualquier caso, sin embargo, esto sólo podrá hacerse entre los ya autorizados en el grupo permitido.
heredable Cuando una aplicación inicia un nuevo proceso, el proceso recién iniciado muestra la lista de capacidades que heredará de la lista permitida.

La lista de capacidades permitidas, efectivas y heredables para ejecutar procesos en cualquier momento se muestra como una máscara de bits en las líneas CapPrm, CapEff, y CapInh en el archivo /proc//status. además, el CapBnd contiene la máscara de bits utilizada en la operación de control de límite de capacidad.

Por ejemplo, intente leer los valores de su aplicación de shell en ejecución desde el /proc/self/status expediente:

gato /proc/uno mismo/estado | Gorra grep

# Producción
CapInh: 0000000000000000
CapPrm: 0000000000000000
CapEff: 0000000000000000
CapBnd: 000001ffffffffff
CapAmb: 0000000000000000

El modelo de capacidad de archivos en Linux

El funcionamiento del sistema de capacidad para archivos depende del requisito previo de que estas propiedades se puedan almacenar en la capa del sistema de archivos virtual (VFS). Al igual que el modelo de proceso, las capacidades de los archivos se dividen en tres encabezados:

1. Permitido

El sistema determina las capacidades permitidas del proceso cuando el ejecutable correspondiente se ejecuta en este clúster.

2. Eficaz

A diferencia del modelo de capacidad del proceso, este encabezado almacena un solo bit: activo o inactivo. Si el bit está activo, las capacidades definidas en la lista permitida del archivo se activan automáticamente. transferido a la lista de capacidades efectivas del proceso relevante cuando se ejecuta este archivo y se inicia un proceso. creado. Si el bit no está activo, no se realiza la transferencia automática de las capacidades permitidas en el archivo al proceso en ejecución.

Sin embargo, si el código de la aplicación relevante está integrado con el sistema de capacidad, puede activar los permisos en el conjunto permitido del archivo con llamadas al sistema. El objetivo principal de este comportamiento es garantizar que las aplicaciones antiguas que no incluyen capacidad específica del sistema código, el desarrollo a nivel de código de software puede funcionar con el sistema de capacidad sin necesidad de ningún código fuente cambios.

Puede pensar que las aplicaciones mejor escritas solo usarán capacidades cuando sea necesario. Si el bit está activo, todas las capacidades de la lista permitida se activan cuando se inicia la aplicación.

3. Heredable

Como en el modelo de proceso, se ejecuta el archivo relevante y se produce un proceso. Si otra aplicación se ejecuta desde dentro del proceso después de eso, se incluye en la lista permitida del nuevo proceso. En resumen, indica una lista de capacidades a heredar.

El papel de las capacidades en un sistema Linux

Cuando ejecuta un determinado proceso como un usuario normal, no tiene ningún privilegio. Como resultado, solo puede acceder a las particiones que el sistema permite a los usuarios normales. La razón principal detrás de esto es reforzar la seguridad del sistema e implementar tales medidas.

Permitir que todos los usuarios accedan a todos los recursos puede crear una grave vulnerabilidad de seguridad. Será muy fácil para las personas que usan el sistema con fines maliciosos explotar las vulnerabilidades del sistema. Las capacidades de Linux son útiles en tales asuntos. Puede fortalecer fácilmente la seguridad de sus aplicaciones con capacidades API impulsadas por el kernel.

Las capacidades de Linux son solo uno de los problemas que deben tenerse en cuenta para realizar métodos muy potentes, como dividir el usuario raíz permisos, asignando varios permisos a usuarios sin privilegios y tomando varias precauciones sobre puertos abiertos en servicios de Internet con servidores Linux.

Mejore la seguridad de su servidor Linux con estos 7 pasos de fortalecimiento

Leer siguiente

CuotaPíoCuotaCorreo electrónico

Temas relacionados

  • linux
  • Programación
  • Núcleo de Linux
  • Sistema operativo

Sobre el Autor

Fatih Küçükkarakurt (8 artículos publicados)

Ingeniero y desarrollador de software aficionado a las matemáticas y la tecnología. Siempre le ha gustado la informática, las matemáticas y la física. Ha desarrollado proyectos de motores de juegos, así como aprendizaje automático, redes neuronales artificiales y bibliotecas de álgebra lineal. Además continúa trabajando en aprendizaje automático y matrices lineales.

Más de Fatih Küçükkarakurt

Suscríbete a nuestro boletín

¡Únase a nuestro boletín para obtener consejos técnicos, reseñas, libros electrónicos gratuitos y ofertas exclusivas!

Haga clic aquí para suscribirse