GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cómo saber qué capacidades de Linux requiere un proceso para funcionar?

Otro método, con el que me encontré hace un tiempo en esta publicación de blog de Brendan Gregg, es usar el rastreador de capacidades - capaz .

A continuación se muestra un resultado de muestra:

$ sudo /usr/share/bcc/tools/capable
TIME      UID    PID    COMM             CAP  NAME                 AUDIT
11:31:54  0      2467   capable          21   CAP_SYS_ADMIN        1
11:31:54  0      2467   capable          21   CAP_SYS_ADMIN        1
11:31:59  1000   2468   ls               1    CAP_DAC_OVERRIDE     1
11:31:59  1000   2468   ls               2    CAP_DAC_READ_SEARCH  1
11:32:02  0      1421   timesync         25   CAP_SYS_TIME         1
11:32:05  1000   2469   sudo             7    CAP_SETUID           1
11:32:05  0      2469   sudo             6    CAP_SETGID           1

Tiene la ventaja significativa de registrar las comprobaciones de capacidad realizadas por el núcleo para un proceso determinado. Esto permite perfilar la aplicación frente a las capacidades que realmente requiere, p. para reducir los privilegios y ejecutarlo como un usuario sin privilegios.

Mientras pscap permite listar los efectivos capacidades de todos los procesos en ejecución, no ofrece un método confiable para verificar qué capacidades son realmente requeridas por el proceso, porque:

  • Un proceso puede tener la capacidad X en su conjunto permitido y solo elevarlo al conjunto efectivo durante un breve período de tiempo para realizar una operación privilegiada.
  • Un proceso podría haber comenzado con un conjunto más amplio de capacidades, hacer la inicialización que requiere privilegios elevados y descartar algunas (o todas) capacidades (por ejemplo, hacer ping para abrir un socket sin formato).
  • Solo funciona para procesos que ya se ejecutan de manera basada en capacidades. ¿Qué pasaría si tuviera que determinar el conjunto de capacidades mínimo requerido para su aplicación recién desarrollada?
  • No permite correlacionar las comprobaciones de privilegios realizadas para la aplicación con las operaciones que realiza, con capaz obtienes marcas de tiempo para cada verificación individual.

Las fuentes para capable están disponibles en github. Instrucciones de instalación para BCC (incluyendo capable ) están disponibles aquí. Para una descripción más detallada, consulte la publicación del blog mencionada al principio, también tenga en cuenta que la capacidad requiere kernel 4.4+, una alternativa para kernels más antiguos también está disponible en la publicación del blog.

Nota:no soy el autor ni estoy afiliado a los desarrolladores de la herramienta de ninguna manera. Solo quería llevarlo a una audiencia más amplia, ya que personalmente lo he usado para desarrollar un perfil de capacidades para una aplicación de monitoreo compleja que anteriormente requería privilegios de root completos para ejecutarse, y encontré que este rastreador es de gran ayuda.


Resulta que es más fácil de lo esperado. Instale libcap-ng (https://people.redhat.com/sgrubb/libcap-ng/) y use pscap .

En Ubuntu 16.04, se puede instalar con:

sudo apt-get install libcap-ng-utils

Extracto de salida de muestra:

ppid  pid   name        command           capabilities
1     468   root        systemd-journal   chown, dac_override, dac_read_search, fowner, setgid, setuid, sys_ptrace, sys_admin, audit_control, mac_override, syslog, audit_read
1     480   root        lvmetad           full
1     492   root        systemd-udevd     full
1     1040  root        rpc.idmapd        full
1     1062  root        rpc.gssd          full
1     1184  messagebus  dbus-daemon       audit_write +
1     1209  root        NetworkManager    dac_override, kill, setgid, setuid, net_bind_service, net_admin, net_raw, sys_module, sys_chroot, audit_write

Basado en la actualización reciente de libcap2

1:(opción corta):getpcaps

Descripción:

Desde aquí:

getpcaps muestra las capacidades de los procesos indicados por los valores pid dados en la línea de comando.

Ejemplo:

$ getpcaps <PID>
PID: = cap_chown,cap_dac_override,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_net_raw,cap_sys_chroot,cap_mknod,cap_audit_write,cap_setfcap+i

2:(Opción un poco más larga):/proc status y capsh

Descripción:

proc es un pseudo-sistema de archivos de información de procesos o, en otras palabras, un directorio donde puede ver información sobre todos los procesos.

Acerca de capsh:

El soporte y el uso de la capacidad de Linux se pueden explorar y restringir con esta herramienta. Esta herramienta proporciona un contenedor práctico para ciertos tipos de pruebas de capacidad y creación de entornos.
También proporciona algunas funciones de depuración útiles para resumir el estado de la capacidad.

Ejemplo:

$ cat /proc/<PID>/status | grep Cap

Y obtendrá (en la mayoría de los sistemas):

CapInh: 00000000a80425fb (Inherited capabilities)
CapPrm: 0000000000000000 (Permitted capabilities)
CapEff: 0000000000000000 (Effective capabilities)
CapBnd: 00000000a80425fb (Bounding set)
CapAmb: 000000000000000  (Ambient capabilities set)

Usa el capsh utilidad para decodificar números hexadecimales en el nombre de capacidades:

capsh --decode=00000000a80425fb
0x00000000a80425fb=cap_chown,cap_dac_override,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_net_bind_service,cap_net_raw,cap_sys_chroot,cap_mknod,cap_audit_write,cap_setfcap

(*) Puedes descargar capsh con:sudo apt-get install git libpcap-dev .


Linux
  1. Cómo averiguar la lista de todos los puertos abiertos en Linux

  2. ¿Qué versión de Linux estoy ejecutando? Aquí está cómo averiguarlo

  3. Linux:¿cómo averiguar qué discos duros hay en el sistema?

  4. Linux:¿cómo averiguar el espacio de nombres de un proceso en particular?

  5. ¿Cómo averiguo qué proceso tiene un bloqueo en un archivo en Linux?

Cómo encontrar un nombre de proceso usando el número PID en Linux

Cómo encontrar qué dispositivos están conectados a la red en Linux

Cómo averiguar la versión del kernel de Linux que se ejecuta en su PC

Cómo saber cuánto tiempo ha estado ejecutándose un proceso en Linux

¿Cómo puedo saber qué versión de Linux se está ejecutando?

¿Cómo puedo averiguar qué discos duros están conectados a una caja de Linux?