junio 29, 2022

Comprender las habilidades en la programación de sistemas Linux.

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

Como solución basada en las necesidades, la sección 25 de POSIX.1e aborda este problema. 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 características del kernel de Linux.


Comprender la lógica de la API de capacidades

La comprobación de permisos 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, el sistema no verifica la autorización
  • Si el valor de EUID es distinto de cero, el sistema realiza el proceso de verificación de acuerdo con los permisos del usuario real y el grupo de su aplicación.

Algunas aplicaciones necesitan tener privilegios más amplios (SUID, bit SGIT) cuando se ejecutan. Como ejemplo más típico, puede 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 almacenan las contraseñas encriptadas, debe trabajar con derechos de usuario raíz (por ejemplo, ID de usuario = 0).

APROVECHA EL VIDEO DEL DÍA

Para evitar 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


-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, los errores críticos en las aplicaciones SUID de bits abren la puerta a la ejecución de código no deseado para los 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 necesita tener derechos de usuario raíz cuando desee escuchar en un puerto TCP o UDP privilegiado de menos de 1024 en sistemas basados ​​en Unix. Por ejemplo, para poder escuchar el puerto TCP 80 de un servidor web, la aplicación debe estar ejecutándose como root.


A lo largo de los años, se ha comprendido lo devastador que es ejecutar software que brinda servicios al entorno de red con una cuenta de usuario totalmente autorizada. Como solución provisional, se ha adoptado que solo una parte determinada y más pequeña del programa escucha en el puerto privilegiado como raíz, luego cambia la ID de usuario activa a otro usuario para procesos posteriores (por ejemplo, usuario ninguno con derechos limitados).

Este sistema, que existe desde hace 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 alguna funcionalidad adicional específica de la aplicación a través de la API de características de Linux, sin necesidad de derechos de root, aparte del sistema mencionado anteriormente.

¡El modelo de capacidad de Linux explicado!

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

Por ejemplo, para que la aplicación de ping funcione, debe poder abrir sockets RAW, generalmente reservados solo para usuarios root. En las distribuciones de Linux más antiguas, el problema es dar 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, se muestra el siguiente error:

ping 8.8.8.8


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 


-rwxr-xr-x. 1 root root 95232 Jul 25 2021 /bin/ping

Sin embargo, puede ejecutar correctamente la aplicación 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 características adicionales de la aplicación con el obtener tapa comando de la siguiente manera:

sudo getcap /bin/ping


/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 del proceso

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

Capacidad Declaración
permitió En este grupo hay una lista de características adicionales permitidas para el proceso relevante. Otorgar el permiso no significa que se pueda usar activamente en ese momento. Puede incluir los permisos aquí en el conjunto de capacidad real 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 renunciar 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 características 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, CapEffY CapInh En el archivo /proceso//Expresar. Además, el CapBnd contiene la máscara de bits utilizada en la operación de comprobación del límite de capacidad.

Por ejemplo, intente leer los valores de su aplicación de shell que se ejecuta desde /proc/automático/estado expediente:

cat /proc/self/status | grep Cap


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). De manera similar al modelo de proceso, las capacidades de archivo se dividen en tres títulos:

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 solo un bit: activo o inactivo. Si el bit está activado, las capacidades definidas en la lista permitida del archivo se transfieren automáticamente a la lista de capacidades reales del trabajo relevante cuando se ejecuta este archivo y se crea un trabajo. Si el bit está desactivado, las capacidades permitidas del archivo no se transfieren automáticamente al proceso en ejecución.

Sin embargo, si el código de aplicación relevante está integrado con el sistema de capacidad, puede activar permisos en el conjunto permitido del archivo con llamadas al sistema. El propósito principal de este comportamiento es garantizar que las aplicaciones más antiguas que no incluyen el 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 realizar cambios en el código fuente.

Puede pensar que las mejores aplicaciones escritas solo usarán funciones cuando sea necesario. Si el bit está activado, todas las funciones 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 más tarde dentro del proceso, se incluye en la lista de permitidos del nuevo proceso. En resumen, indica una lista de habilidades para heredar.

El papel de las capacidades en un sistema Linux

Cuando ejecuta un determinado proceso como usuario normal, no tiene privilegios. 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 fortalecer 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 características de Linux son útiles en estos asuntos. Puede fortalecer fácilmente la seguridad de sus aplicaciones con las características de API basadas en kernel.

Las funciones de Linux son solo uno de los problemas que deben tenerse en cuenta para realizar métodos muy poderosos, como dividir los permisos de 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.

Código con fondo de espacio

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

Leer siguiente


Deja una respuesta

Tu dirección de correo electrónico no será publicada.