Cómo limitar el acceso a usuarios en Linux

Aprendemos a limitar al acceso a usuarios en sistemas GNU/Linux. Ya que nos podemos encontrar con la necesidad, de querer que algunos usuarios, solo puedan realizar ciertas tareas y ejecutar ciertos comandos. Por ejemplo, que el usuario no pueda modificar las variables de entorno, no pueda visitar otros directorios, cambiar a otros usuarios, etcétera. ¿Cómo lo hacemos?

Limitar el acceso a usuarios en Linux

Aquí es donde entra en escena “Restricted Shell”. Utilizando una shell con acceso restringido, se puede limitar fácilmente el acceso de un usuario dado. Voy a utilizar para las pruebas y los ejemplo un sistema con Raspbian, sobre una Raspberry Pi, pero debería funcionar en la mayoría de los sistemas.

He pensado en realizar esta entrada a raíz de varios comentarios de usuarios que me preguntaban justo por la misma cuestión.

¿Qué es Restricted Shell?

Primero de todo hay que aclarar que no se trata de otra shell más, como por ejemplo Bash, Ksh u otras, de las que ya hablamos. Si iniciamos cualquier shell existente utilizando las opciones rbash, —restricted o -r, entonces cambiaremos a una shell restringida. En el caso de la shell de Boune podemos iniciar de forma restringida mediante bsh -r y en el caso de Korn ksh -r

De esta manera los usuarios tendrán limitado lo que pueden hacer en el sistema, como por ejemplo no poder ejecutar comandos o no poder cambiar de directorio. Las restricciones que se aplicarán impedirán que se puedan realizar las siguientes acciones, en el caso de BASH:

  • Cambio de directorio con cd incorporado. Solo se podrá trabajar en el directorio actual.
  • Añadir o quitar variables de entorno SHELL, PATH, HISTFILE, ENV o BASH_ENV
  • No se permite ejecutar un programa que contenga un carácter / (barra). Esto es, no se podrá utilizar una ruta absoluta ni relativa para ejecutar un comando, como por ejemplo, /usr/bin/pwd o ./pwd, pero en cambio si se podrá ejecutar el comando pwd
  • No se puede redirigir la salida mediante operadores de redirección
  • No se permite salir del modo shell restringido al utilizar guiones
  • No se permite desactivar el modo de shell restringido

Para saber más se puede consultar la hoja de referencia de man en el proyecto GNU. Dejaré el enlace al final de la entrada.

¿Cómo limito el acceso de un usuario en Linux?

Primero de todo debemos crear un enlace simbólico para rbash. De la siguiente manera:

ln -s /bin/bash /bin/rbash
# En mi caso este fichero ya existía

A modo de prueba voy a crear un usuario llamado «pruebauser» y le voy a asignar la shell de rbash.

sudo useradd -m -s /bin/rbash -d /home/pruebauser pruebauser

Para muestra un botón:

Asignar rbash a un usuario

El siguiente paso es asignarle la contraseña y crear una directorio donde irán los binarios que sí podrá utilizar:

sudo passwd pruebauser

Y creamos el directorio:

sudo mkdir /home/pruebauser/bin

Y a continuación creamos una serie de enlaces simbólicos de binarios que apunten a esta carpeta recién creada:

sudo ln -s /bin/ls /home/pruebauser/bin/ls
sudo ln -s /bin/mkdir /home/pruebauser/bin/mkdir
sudo ln -s /bin/ping /home/pruebauser/bin/ping
sudo ln -s /bin/pwd /home/pruebauser/bin/pwd

De esta manera podrá utilizar los comandos ls, mkdir, pwd y ping

Tal y como se muestra en la imagen:

Añadiendo enlaces simbólicos a binarios

De esta manera este usuario solo va a poder utilizar estos comandos.

Una parte importante es evitar que el usuario pueda editar el fichero .bash_profile, de la siguiente manera:

sudo touch /home/pruebauser/.bash_profile
sudo chown root. /home/pruebauser/.bash_profile
sudo chmod 755 /home/pruebauser/.bash_profile

De esta manera solo el usuario root o los miembros del grupo sudo van a poder editar el fichero.

Ahora editamos el fichero:

sudo vi /home/pruebauser/.bash_profile

Y añadimos:

(...)
PATH=$HOME/bin
(...)

Guardamos y salimos.

De esta manera, cuando el usuario inicie sesión, tendrá por defecto la shell restringida con rbash leyendo el fichero de variables de entorno .bash_profile, que establecerá la path en $HOME/bin y así podrá ejecutar únicamente los comandos que le hemos indicado.

Comprobamos que todo ha funcionado como queríamos, accediendo al usuario:

sudo su - pruebauser

Si lanzamos los comandos que hemos añadido si funcionarán, en cambio el resto no, como se puede ver en la imagen:

Probamos rbash

También podemos comprobar que no podemos redirigir la salida estándar.

pruebauser@raspberrypi:~$ ls > listado
-rbash: listado: restringido: no se puede redirigir la salida

Tal y como hemos explicado en los anteriores párrafos se le puedan añadir y quitar comandos a nuestro gusto.

Al final la forma de trabajar de esta shell restringida me recuerda mucho a como se tratan los usuarios en las jaulas chroot.

Espero que esta entrada haya sido de vuestro interés.

Fuentes consultadas:

GNU.org – The Restricted Shell

Ostechnix.com – How To Limit User’s Access To The Linux System