Ocultar procesos a otros usuarios en Linux

A partir de la versión 3.2 del kernel de Linux es posible ocultar los procesos que un usuario está ejecutando al resto de usuarios del sistema gracias a la opción de montaje «hidepid«. Esto significa que no tendrá acceso a la información de los procesos en el filesystem /proc ni tampoco al ejecutar el típico ps o top:

$ ps -ef

En sistemas multiusuario puede ser una interesante opción de seguridad. Además el kernel 3.2 o superior está disponible en Red Hat y CentOS a partir de la versión 6.5. Hay que decir que root independientemente de que esta opción esté aplicada a /proc seguirá pudiendo ver todos los procesos.

Para configurar «hidepid» debemos aplicar la «flag» al punto de montaje, así que hay que remontarlo:

# mount | grep ^proc
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)

Remontamos:

# mount -o remount,nosuid,noexec,hidepid=2 /proc

Recordad que de este modo no lo hacemos persistente, para ello hay que modificar el archivo /etc/fstab y añadir la opción al punto de montaje /proc:

proc	/proc	proc	defaults,hidepid=2	0 0

Nota: es posible que no esté definido el punto de montaje, en ese caso, lo añadís.

Si os preguntáis que significa el número 2, estas son los valores aplicables de hidepid:

  • hidepid 0: valor por defecto.
  • hidepid 1: un usuario estándar podrá ver únicamente sus procesos. Esto implica ver sólo sus procesos en el comando top, ps, htop… pero seguirá pudiendo ver los PIDs en el filesystem /proc
  • hidepid 2: Al igual que con la opción «1», el usuario sólo podrá ver sus procesos y además tampoco tendrá acceso en /proc a los PID de otros usuarios.

Vamos a probarlo, ¿no?

Primero remontamos el filesystem aplicando el valor 2 a hidepid:

# mount -o remount,nosuid,noexec,hidepid=2 /proc
# mount | grep ^proc
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime,hidepid=2)

Abrimos una shell de un usuario estándar y verificamos que efectivamente, ¡funciona! no puede ver nada excepto sus procesos:

# su - foo
$ ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
foo       2288  2287  1 17:02 pts/0    00:00:00 -bash
foo       2311  2288  0 17:02 pts/0    00:00:00 ps -ef
$ top

top - 17:02:38 up 14 min,  2 users,  load average: 0.00, 0.01, 0.03
Tasks:   2 total,   1 running,   1 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.3 us,  0.7 sy,  0.0 ni, 98.2 id,  0.7 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem:    760092 total,   198032 used,   562060 free,      764 buffers
KiB Swap:   630780 total,        0 used,   630780 free.    68452 cached Mem

PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
2288 foo       20   0  115352   1996   1624 S   0.0  0.3   0:00.02 bash
2313 foo       20   0  123552   1376   1052 R   0.0  0.2   0:00.01 top
$ ls -l /proc/
total 0
dr-xr-xr-x.  8 foo  foo                0 Sep  4 17:02 2288
dr-xr-xr-x.  8 foo  foo                0 Sep  4 17:03 2317
dr-xr-xr-x.  2 root root               0 Sep  4 17:03 acpi
dr-xr-xr-x.  5 root root               0 Sep  4 17:03 asound
-r--r--r--.  1 root root               0 Sep  4 17:03 buddyinfo
dr-xr-xr-x.  4 root root               0 Sep  4 17:03 bus
-r--r--r--.  1 root root               0 Sep  4 17:03 cgroups
-r--r--r--.  1 root root               0 Sep  4 17:03 cmdline
[...]

Y si revertimos el cambio todo vuelve a la normalidad:

# mount -o remount,nosuid,noexec,hidepid=0 /proc
# su - foo
$ ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 16:48 ?        00:00:01 /usr/lib/systemd/systemd --switched-root --system --deserialize 23
root         2     0  0 16:48 ?        00:00:00 [kthreadd]
root         3     2  0 16:48 ?        00:00:00 [ksoftirqd/0]
root         5     2  0 16:48 ?        00:00:00 [kworker/0:0H]
root         6     2  0 16:48 ?        00:00:00 [kworker/u4:0]
root         7     2  0 16:48 ?        00:00:00 [migration/0]
root         8     2  0 16:48 ?        00:00:00 [rcu_bh]
root         9     2  0 16:48 ?        00:00:00 [rcuob/0]
root        10     2  0 16:48 ?        00:00:00 [rcuob/1]
root        11     2  0 16:48 ?        00:00:00 [rcu_sched]
root        12     2  0 16:48 ?        00:00:00 [rcuos/0]
root        13     2  0 16:48 ?        00:00:00 [rcuos/1]
root        14     2  0 16:48 ?        00:00:00 [watchdog/0]
root        15     2  0 16:48 ?        00:00:00 [watchdog/1]
[...]

Otro detalle más, podemos especificar usuarios o grupos a los que excluimos de la restricción. En otra palabras, UIDs/GIDs a los que no les afectará la medida:

# mount -o remount,nosuid,noexec,hidepid=2,uid=1200,gid=1300 /proc