Linux Capabilities
Contents
Antes de Capabilities: sudo
Cuando un usuario quería realizar tareas de root, tenia que hacerlo mediante el comando sudo.
Para ello había que configurar previamente el fichero /etc/sudoers especificando que usuarios podian ejecutar los progrmas con los privilegios de root.
De forma habitual había que ejecutar wireshark de la siguiente manera:
$ sudo wireshark
Este proceso era muy repetitivo y no muy eficiente así que llegaron las Capabilities
¿Qué son las Linux Capabilities?
Las capabilities nos permiten gestionar que permisos tiene un proceso para acceder a las partes del kernel. Independientemente del usuario que lo lance.
Existen una serie de capabilities que se pueden habilitar a los programa para que tengan acceso a dichas partes que gestionan.
Estos cuentan con Flags para poder determinar que acciones están disponibles:
Efectivas (e): las capacidades usadas por el núcleo para llevar a cabo comprobaciones de permisos para el proceso.
Permitidas (p): la capacidades que el proceso puede asumir (esto es, un superconjunto limitante para los conjuntos de efectivas y heredadas). Si un proceso elimina una capacidad de su conjunto de permitidas, no puede volver nunca a adquirir esa capacidad (a menos que ejecute un programa set-UID-root).
Heredadas (i): las capacidades que se conservan tras llamadas a execve(2).
Ver y cambiar capabilities
Es posible siendo root ver y editar las capabilities de un programa mediante getcap y setcap
Como /usr está en modo lectura es necesario montarlo como escritura para poder editar las capabilities de este.
root@monitor03:~# mount -o remount, rw /usr root@monitor03:~# setcap cap_net_admin,cap_net_raw+eip /usr/bin/wireshark
root@monitor03:~# getcap /usr/bin/wireshark /usr/bin/wireshark = cap_net_admin,cap_net_raw+eip
En este ejemplo se puede ver como se le permite a wireshark editar la configuración de red (cap_net_admin) y habilitar el uso de RAW y PACKET sockets (cap_net_raw)
Lista de capabilities
Hasta la versión 2.4.18 de Linux, las siguientes capacidades están implementadas:
CAP_CHOWN Permite cambios arbitrarios en los IDs de usuario y de grupo de los ficheros (vea chown(2)).
CAP_DAC_OVERRIDE Evita las comprobaciones de permisos sobre operaciones de lec- tura, escritura y ejecución. (DAC = "control de acceso discre- cional".)
CAP_DAC_READ_SEARCH Evita comprobaciones de permisos sobre operaciones de lectura de ficheros y lectura y ejecución de directorios.
CAP_FOWNER Evita comprobaciones de permisos sobre operaciones que normal- mente requieren que el ID de usuario del sistema de ficheros del proceso coincida con el ID de usuario del fichero (p.e., utime(2)), excluyendo aquellas operaciones cubiertas por CAP_DAC_OVERRIDE y CAP_DAC_READ_SEARCH; ignora el bit pegajoso (sticky) en el borrado de ficheros.
CAP_FSETID No borra los bits set-user-ID y set-group-ID cuando se modifica un fichero; permite establecer el bit set-group-ID para un fichero cuyo ID de grupo no coincide con el del sistema de ficheros o cualquier otro ID de grupo adicional del proceso invocador.
CAP_IPC_LOCK Permite el bloqueo en memoria (mlock(2), mlockall(2), shm- ctl(2)).
CAP_IPC_OWNER Evita comprobaciones de permisos para las operaciones sobre objetos System V IPC.
CAP_KILL Evita comprobaciones de permisos para enviar señales (vea kill(2)).
CAP_LEASE (Linux 2.4 en adelante) Permite que se establezcan arriendos sobre ficheros arbitrarios (vea fcntl(2)).
CAP_LINUX_IMMUTABLE Permite establecer los atributos extendidos EXT2_APPEND_FL y EXT2_IMMUTABLE_FL sobre ficheros del sistema de ficheros ext2.
CAP_MKNOD (Linux 2.4 en adelante) Permite la creación de ficheros espe- ciales usando mknod(2).
CAP_NET_ADMIN Permite varias operaciones relacionadas con redes (p.e., establecer opciones privilegiadas sobre conectores, habilitar la difusión de paquetes multidestino (multicasting), configuración de interfaces, modificar tablas de encaminamiento).
CAP_NET_BIND_SERVICE Permite ligar conectores a puertos reservados del dominio de Internet (números de puerto menores que 1024).
CAP_NET_BROADCAST (No se usa) Permite la difusión universal (broadcasting) de paquetes a través de un conector y la escucha de paquetes multi- destino.
CAP_NET_RAW Permite el uso de conectores de tipo RAW y PACKET.
CAP_SETGID Permite manipulaciones arbitrarias de los IDs de grupo y de la lista de IDs de grupo adicionales de un proceso; permite el uso de IDs de grupo falsificados cuando se pasan credenciales de conectores a través de conectores de dominio Unix.
CAP_SETPCAP Concede o elimina cualquier capacidad en el conjunto de capaci- dades permitidas del invocador a o desde cualquier otro proceso.
CAP_SETUID Permite manipulaciones arbitrarias de los IDs de usuario de los procesos (setuid(2), etc.); permite el uso de IDs de usuario falsificados cuando se pasan credenciales de conectores a través de conectores de dominio Unix.
CAP_SYS_ADMIN Permite una variedad de operaciones de administración del sis- tema incluyendo: quotactl(2), mount(2), swapon(2), sethost- name(2), setdomainname(2), IPC_SET y operaciones IPC_RMID sobre objetos arbitrarios IPC de System V; permite el uso de IDs de usuario falsificados cuando se pasan credenciales de conectores.
CAP_SYS_BOOT Permite llamadas a reboot(2).
CAP_SYS_CHROOT Permite llamadas a chroot(2).
CAP_SYS_MODULE Permite cargar y eliminar módulos del núcleo.
CAP_SYS_NICE Permite aumentar el valor nice del proceso invocador (nice(2), setpriority(2)) y cambiar el valor nice de procesos arbitrarios; permite establecer políticas de planificación de tiempo real para el proceso invocador y establecer políticas de planifi- cación y prioridades para procesos arbitrarios (sched_setsched- uler(2), sched_setparam(2)).
CAP_SYS_PACCT Permite llamadas a acct(2).
CAP_SYS_PTRACE Permite el seguimiento detallado de procesos arbitrarios usando ptrace(2)
CAP_SYS_RAWIO Permite operaciones sobre puertos de E/S (iopl(2) y ioperm(2)).
CAP_SYS_RESOURCE Permite el uso de espacio reservado en sistemas de ficheros ext2; llamadas ioctl(2) para controlar el registro en ext3; sobrescribir los límites de las cuotas de disco; incrementar los límites de recursos (vea setrlimit(2)); sobrescribir el límite del recurso RLIMIT_NPROC; incrementar el límite msg_qbytes para una cola de mensajes por encima del limite en /proc/sys/ker- nel/msgmnb (vea msgop(2) y msgctl(2).
CAP_SYS_TIME Permite la modificación del reloj del sistema (settimeofday(2), adjtimex(2)); permite la modificación del reloj de tiempo real (hardware)
CAP_SYS_TTY_CONFIG Permite llamadas a vhangup(2).
$ man capabilities
Enlaces externos
http://manpages.ubuntu.com/manpages/intrepid/man7/capabilities.7.html
http://penta.debconf.org/dc12_schedule/attachments/208_capabilities_EN.odp
http://www.esdebian.org/articulos/24052/asegurando-linux-las-linux-capabilities
https://wiki.archlinux.org/index.php/Using_File_Capabilities_Instead_Of_Setuid
--Yago 15:05 13 sep 2012 (UTC)