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