Comprensión de las capacidades en la programación del sistema Linux

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 completó 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 lo más típico example, puedes pensar en la aplicación passwd. Con esto, los usuarios de un sistema pueden cambiar sus contraseñas. Sin embargo, para escribir a la /etc/sombra 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/passwd
                        

# Output
-rwsr-xr-x. 1 root root 32552 Jul 23 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 inferior a 1024 en sistemas basados ​​en Unix. Para examplepara poder escuchar el puerto TCP 80 de un servidor web, debe ejecutar la aplicación como usuario root.

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 parte determinada y más pequeña del programa escucha en el puerto privilegiado como raíz y luego cambia la ID de usuario activa a otro usuario para procesos posteriores (por ejemplo, exampleel usuario none 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 del sistema mencionado anteriormente.

¡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.

Para example, 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:

                      
                        
                          ping
                        
                         8
                        
                          .8
                        
                        
                          .8
                        
                        
                          .8
                        
                        

# Output
ping: icmp open socket: Operation not permitted

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

                      
                        ls -l /bin/ping 
                        

# Output
-rwxr-xr-x. 1 root root 95232 Jul 25 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 
                        
                          getcap
                        
                         /bin/ping
                        

# Output
/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.

Para exampleintente leer los valores de su aplicación de shell en ejecución desde el /proc/self/status expediente:

                      
                        cat /proc/
                        
                          self
                        
                        /status | grep Cap
                        

# Output
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. Efectivo

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 transfieren automáticamente a la lista de capacidades efectivas del proceso relevante cuando se ejecuta este archivo y se crea un proceso. 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 código específico del sistema de capacidad, el desarrollo a nivel de código de software pueda funcionar con el sistema de capacidad sin necesidad de cambios en el código fuente.

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. Hereditario

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 implementar métodos muy poderosos, como dividir los permisos del usuario raíz, asignar varios permisos a usuarios sin privilegios y tomar varias precauciones sobre los puertos abiertos en los servicios de Internet con servidores Linux.

Related Posts