Como restringir la shell de usuario con rbash
En este artículo vamos a ver como restringir la shell de usuario con una utilidad llamada «rbash». La shell de linux es una poderosísima herramienta que nos permite tener el control del sistema con mucha precisión y granularidad.
Sumario
- Consideraciones previas
- Qué es «rbash»
- Restricciones implementadas
- Uso de «rbash»
- Restringir la shell de un usuario con un script
- Permitir el acceso de un usuario restringido a algunos comandos
Consideraciones previas
En todos los sistemas derivados de UNIX, como Linux, cuando se crea un nuevo usuario se le asigna un shell predeterminado, normalmente «/bin/bash». Esto puede plantear un problema, ya que un usuario con suficientes conocimientos, puede acceder a directorios de otros usuarios, a los que no debería tener acceso, y moverse libremente por ellos, incluso ejecutar alguna acción dañina para otros usuarios.
Además, un usuario con pocos conocimientos, sin ninguna restricción, podría ejecutar alguna acción, sin ser consciente de sus consecuencias, que pudiera llevar al sistema a un desastre.
Qué es rbash
«Rbash», también conocido como «restricted shell», es una herramienta perfecta para evitar que se produzcan situaciones como las que hemos descrito. Con ella podemos implementar restricciones a las operaciones de un usuario, o varios, para evitar que usen determinados comandos, e incluso que ejecuten algún script potencialmente dañino.
Será especialmente útil cuando administras un servidor al que se conectan usuarios por SSH, evitando que estos puedan acceder a directorios a los que no deberían tener acceso.
Restricciones implementadas
Con un modo restringido podemos configurar un entorno mucho más controlado que el predeterminado. Nos proporciona una capa adicional de seguridad para el sistema, ya que su comportamiento y forma de operar es idéntico a «bash», pero con la excepción de lo que no está permitido. Veamos algunas de estas restricciones.
- 1.- Cambiar de directorios con el comando «cd».
- 2.- No se permite modificar los valores de «SHELL», «PATH», «ENV» o «BASH_ENV».
- 3.- Ejecución de comandos que contengan barras «/», como caracter o argumento.
- 4.- Ficheros que contengan una barra «/» como argumento para la opción «-p» del propio hash.
- 5.- Ficheros que contenga una barra inclinada «/» como argumento para el comando «history».
- 6.- Importar definiciones de funciones desde el entorno de inicio del shell.
- 7.- Analizar el valor de «SHELLOPTS» desde el entorno de inicio shell.
- 8.- Redirigir la salida estandar usando los operadores de redirección como «>», «>|», «>>», «<>», «>&» y «&>».
- 9.- Usar «exec» para reemplazar la shell con otro comando.
- 10.-Agregar o eliminar comandos integrados con las opciones «-f» y «-d», del comando «enable».
- 11.-Usar el comando «enable builtin» para habilitar funciones shell, que están deshabilitadas.
- 12.-Desactivar cualquier modo de salir del modo restringido.
- 13.-Desactivar el modo restringido con «set +r» o «shopt -u shell_restringido».
Estas restricciones se aplican después de leer los ficheros de inicio, por lo que no afecta al arranque del sistema.
Uso de «rbash»
Para hacer las pruebas, creamos un usuario al que restringiremos el shell con «rbash».
sudo useradd -u 3005 -d /home/weblinus/ -m -g 1000 -s /bin/bash -c "Weblinus.com" weblinus
Tienes información sobre como crear usuarios en «administracion de usuarios y grupos en gnu linux»
De todas formas explico las opciones
- -u : permite especificar el UID.
- -d : permite especificar el directorio de trabajo, creará automáticamente el directorio señalado.
- -m : para que cree el directorio /home del usuario
- -g : Para añadir el usuario a un grupo concreto
- -s : permite establecer el Shell.
- -c : añade los valores a la sección de comentarios que suele ser el nombre completo del usuario.
Comprobamos que existe el usuario
grep weblinus /etc/passwd

Y ya nos podemos «logear» con el nuevo usuario

Si ejecutamos el modo simple «rbash», o «bash» con la opción «-r», la shell del usuario actual se restringe automáticamente. Volverá a su estado normal al reiniciar el entorno. Vemos un ejemplo.
~$ cd Descargas ~/Descargas$ ~/Descargas$ rbash ~/Descargas$ cd rbash: cd: restringido ~/Descargas$ ~/Descargas$ pwd > fichero.txt bash: fichero.txt: restricted: cannot redirect output ~/Descargas$

Pero si sabe un poco, podrá ejecutar el comando «bash» y quitará las restricciones. Para evitarlo luego explicamos como hacerlo con el fichero «.bash_profile».
Restringir la shell de un usuario con un script
También podemos restringir bash a un solo usuario modificando su entorno de inicio con un script que ubicaremos en el fichero «.bash_profile» en su home. Para ello creamos este fichero en la «home» del usuario que queremos restringir. Este método afectará a todas las acciones que hemos descrito arriba.
cd /home/usuario sudo nano .bash_profile
Copia y pega el siguiente código.
# .bash_profile # Get the aliases and functions if [ -f ~/.bashrc ]; then . ~/.bashrc fi # User specific environment and startup programs PATH=$PATH:$HOME/bin export PATH bash -r

Guardamos el fichero y cerramos el editor. Al reiniciar el entorno de inicio del usuario en particular comprobamos que funciona correctamente.
cd /etc/ pwd >> fichero.txt cd /home/javier

Como hemos creado el fichero «.bash_profile» con sudo, pertenece a root y el usuario no podrá modificarlo.

Permitir el acceso de un usuario restringido a algunos comandos
Para permitir algunos comandos al usuario restringido procedemos como sigue
El primer paso es crear un enlace simbólico para «rbash». De la siguiente manera:
sudo cd /bin sudo ln -s bash rbash
En mi caso este enlace ya existía por unas pruebas previas.
Creamos el directorio que contendrá los comandos permitidos
sudo mkdir /home/weblinus/bin
Y a continuación creamos unos enlaces simbólicos, de los binarios permitidos, que apunten a este directorio recién creado
sudo ln -s /bin/ls /home/weblinus/bin/ls sudo ln -s /bin/mkdir /home/weblinus/bin/mkdir sudo ln -s /bin/touch /home/weblinus/bin/touch sudo ln -s /bin/pwd /home/weblinus/bin/pwd

De esta manera el usuario solo podrá utilizar los comandos «ls», «mkdir», «touch» y «pwd».
Con estos pasos conseguimos que, cuando el usuario inicie sesión, por defecto tendrá la shell restringida con «rbash», leyendo el fichero de variables de entorno «.bash_profile», con el PATH en «$HOME/bin» y solo podrá ejecutar los comandos indicados con los enlaces simbólicos.

Otra opción, que afecte a todos los usuarios, es modificar la shell predeterminada.
chsh -s /bin/rbash
Y también lo podemos implementar por usuario.
chsh -s /bin/rbash usuario
Lo más lógico sería aplicar las mismas restricciones a todos los usuarios del sistema. Root nunca se verá afectado por estas restricciones. No obstante, como hemos visto, lo más fácil y lo recomendable, es crear un enlace simbólico en «/bin» de «bash» a «rbash». De esta forma ningún usuario tendrá más permisos que los que necesita para su trabajo.
Además, en alguna versión de GNU/Linux como «Red Hat» o «CentOS», «rbash» no puede implementarse directamente y necesita hacerse con la creación de enlaces simbólicos.
En la mayoría de las distribuciones estándar GNU/Linux modernas, «rbash» está disponible de forma predeterminada. Si no es así, puedes descargar el fichero con el código fuente e instalarlo en tu sistema.
La forma de trabajar de esta shell restringida es muy parecida a la forma en como se tratan los usuarios en las jaulas chroot.
Puedes consultar toda la información en el manual integrado de la herramienta
man rbash

Como ves se trata de una herramienta muy útil que te permitirá establecer que los usuarios trabajen dentro de un entorno restringido, aumentando la seguridad del sistema.
Si tienes algún comentario que hacer sobre este artículo, al pie del post tienes un formulario para hacerlo.
Si quieres contactar conmigo por cualquier otro asunto relacionado con el sitio, en la página de contacto, tienes un formulario más adecuado.
Y para suscribirte y recibir las novedades publicadas, tienes un enlace en pie de la página o desde aquí mismo.