Cómo administrar las capacidades de archivos de Linux

usando getcap

Tradicionalmente, un proceso de Linux es privilegiado (ejecutándose como root) o sin privilegios. Los procesos privilegiados no están sujetos a verificaciones de permisos del kernel y, por lo tanto, tienen pleno poder sobre un sistema. Una capacidad es un privilegio distinto e independiente que un proceso puede utilizar para eludir determinadas comprobaciones de permisos. Las capacidades se introdujeron por primera vez en Linux 2.2 y se agregaron varias más en versiones posteriores. Por lo general, se establecen en archivos ejecutables y se otorgan automáticamente al proceso cuando se ejecuta un archivo con una capacidad. Las capacidades esencialmente dividen el poder del usuario raíz en privilegios separados, lo que mejora la seguridad al limitar el acceso que un atacante obtendría al explotar o abusar de un servicio.

Esta guía presentará algunas capacidades de uso común y demostrará cómo se pueden ver y modificar.

Capacidades comunes

El kernel de Linux implementa una multitud de capacidades. Algunos de ellos son:

  • CAP_SYS_ADMIN: Permite una amplia gama de operaciones. Esta capacidad debe evitarse en favor de capacidades más específicas.
  • CAP_CHOWN: Realice cambios en la ID de usuario y la ID de grupo de los archivos
  • CAP_DAC_READ_SEARCH: omite la lectura de archivos y las comprobaciones de lectura/ejecución de directorios. Un programa con esta capacidad se puede utilizar para leer cualquier archivo en el sistema.
  • CAP_DAC_OVERRIDE: anula DAC (control de acceso discrecional), es decir, omite las comprobaciones de permisos de lectura/escritura/ejecución. Esta capacidad otorga a un ejecutable la capacidad de acceder y modificar cualquier archivo en el sistema de archivos.
  • CAP_NET_BIND_SERVICE: permite la vinculación a números de puerto inferiores a 1024.
  • CAP_KILL: omite las comprobaciones de permisos para enviar señales a procesos como SIGHUP y SIGKILL.
  • CAP_SYS_NICE: Modificar el valor de amabilidad y prioridad de programación de procesos entre otros.
  • CAP_SYS_RESOURCE: permite anular varios límites en los recursos del sistema, como cuotas de disco, límites de tiempo de CPU, etc.

La lista completa está disponible en la página del manual de capacidades(7).

A los archivos se les pueden asignar capacidades en 3 conjuntos diferentes: permitido, heredable y efectivo. Los subprocesos tienen 2 conjuntos adicionales: ambiente y delimitación. Cada conjunto puede contener cero o más capacidades, con la excepción del conjunto efectivo para archivos, que en realidad es un solo bit. Estos conjuntos definen comportamientos complejos del núcleo que están más allá del alcance de esta guía. Al asignar capacidades a los archivos, utilizaremos los conjuntos permitidos y efectivos en la mayoría de los casos.

NOTA: SELinux puede interferir con las capacidades. En sistemas con SELinux en modo de aplicación, puede evitar que los procesos aprovechen sus capacidades.

Existen dos paquetes diferentes para la gestión de capacidades: libcap y libcap-ng. Este último está diseñado para ser más fácil que el primero. Ambos están cubiertos en esta guía.

libcap proporciona getcap y setcap para ver y configurar las capacidades de los archivos, mientras que libcap-ng consolida ambas funciones en una sola herramienta, filecap.

librería

Instalación

En Debian, Ubuntu y otras distribuciones basadas en Debian, las utilidades libcap se pueden instalar con:

apt update
apt install libcap2-bin

Para instalar en CentOS, use el siguiente comando:

yum install libcap

Para instalar en Fedora, use el siguiente comando:

dnf install libcap

Para instalar en Arch, use el siguiente comando:

pacman -Sy libcap

Uso

getcap simplemente muestra las capacidades asignadas a un archivo, si las hay. Utilice la siguiente sintaxis:

getcap /path/to/binary

Por ejemplo:

usando getcap

Getcap también puede buscar recursivamente con el indicador -r. Por ejemplo:

usando getcap recursivamente

NOTA: 2>/dev/null se usa para evitar saturar la salida con errores de «Operación no admitida», que ocurren cuando getcap intenta obtener las capacidades de los archivos en /sys, /proc, etc. Estos sistemas de archivos virtuales especiales no admiten capacidades.

Para establecer capacidades de archivo con setcap, use la siguiente sintaxis:

setcap CAP+set filename

Por ejemplo, para agregar CAP_CHOWN y CAP_DAC_OVERRIDE a los conjuntos permitidos y efectivos, use:

setcap CAP_CHOWN,CAP_DAC_OVERRIDE+ep file1

Para eliminar capacidades de un archivo, use el indicador -r:

setcap -r filename

Aquí hay algunos ejemplos adicionales:

ejemplos de getcap

libcap-ng

Instalación

Para instalar en Debian, Ubuntu y otras distribuciones basadas en Debian:

apt update
apt install libcap-ng-utils

Para instalar en CentOS:

yum install libcap-ng-utils

Para instalar en Fedora:

dnf install libcap-ng-utils

Para instalar en Arch:

pacman -Sy libcap-ng

Uso

  • El programa filecap hace referencia a capacidades sin el prefijo «CAP_» (por ejemplo, NET_ADMIN en lugar de CAP_NET_ADMIN).
  • filecap no funciona con rutas relativas, espera la ruta completa al pasar archivos o directorios como argumentos.
  • filecap no le permite especificar conjuntos de capacidades, siempre usa permitido y efectivo al establecer capacidades.

Para ver las capacidades asignadas a un archivo:

filecap /full/path/to/file

Para buscar un directorio recursivamente, use:

filecap /full/path/to/dir

Para buscar en todo el sistema de archivos con filecap, use uno de los siguientes comandos:

filecap /
filecap -a

Estos son algunos ejemplos del uso de filecap para examinar archivos y directorios:

capacidades de visualización con filecap

Para establecer una capacidad en un archivo, utilice la sintaxis:

filecap /full/path/to/file cap_name

Por ejemplo:

filecap /usr/bin/tac dac_override

Para eliminar capacidades, use esta sintaxis:

filecap /full/path/to/file none

Aquí hay algunos ejemplos de configuración y eliminación de capacidades usando filecap:

configuración y eliminación de capacidades con filecap

Conclusión

Las capacidades son una característica poderosa del kernel con amplias aplicaciones de seguridad. Deben sustituirse por privilegios completos y SUID raíz siempre que sea posible.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *