Si se desea que un usuario pueda entrar en un sistema por SSH y que tenga una shell limitada, lShell es la solución.

Para un caso particular mio, requería que mi equipo de desarrollo tuviera acceso a mi servidor de base de datos de prueba en un servidor local.

La base de datos es MySQL, pero era necesario que la conexión fuese por SSH, para dotar de seguridad y pudiera tener el puerto 3306 cerrado y sólo aquellos que tuviesen el acceso ya sea vía contraseña o bien por llave pública.

De esta manera, cuando un desarrollador dejaba el proyecto, se quitaba su usuario o bien se daba de baja su llave pública y ya no tendría acceso al servidor de base de datos.

El problema se generaba cuando el usuario externo generaba un puente SSH en background al servidor de base de datos, bien podría modificar el comando para establecer una conexión SSH directa.

Esto significaba que podría tener acceso al servidor, al home del usuario, y a alterar archivos, que, aunque era usuario limitado, no me agradaba la idea de permitir que se tuviera oportunidad de tener una consola abierta con conexión SSH.

Así que la solución es utiliza lshell, que es un entorno shell escrito en Python que limita al usuario para escribir solo los comandos que indicamos, así como evita que puedan salirse de la carpeta inicial.

Instalar lShell

Para Debian y derivados (Ubuntu, MInt…)

apt-get install lshell

Para RHEL (Fedora, Red hat, CentOS)

yum install lshell

O bien

dnf install lshell

Configuración

El archivo de configuración está en /etc/lshell.conf y lo siguiente es un ejemplo de archivo de configuración.

# CONFIGURATION START
[global]
logpath         : /var/log/lshell/
loglevel        : 2

[default]
allowed         : ['ls','pwd']
forbidden       : [';', '&', '|'] 
warning_counter : 2
timer           : 0
path            : ['/etc', '/usr']
env_path        : ':/sbin:/usr/foo'
scp             : 1 # or 0
sftp            : 1 # or 0
overssh         : ['rsync','ls']
aliases         : {'ls':'ls --color=auto','ll':'ls -l'}

[grp:users]
warning_counter : 5
overssh         : - ['ls']

[foo]
allowed         : 'all' - ['su']
path            : ['/var', '/usr'] - ['/usr/local']
home_path       : '/home/users'

[bar]
allowed         : + ['ping'] - ['ls'] 
path            : - ['/usr/local']
strict          : 1
scpforce        : '/home/bar/uploads/'
# CONFIGURATION END

Como podemos observar, el usuario foo tiene acceso a /var, a /usr, pero no a /usr/local.

Además, tiene acceso a todos los comandos de su ruta, excepto “su”.

Para el usuario bar, tiene acceso a todo (con la restricción de su usario) excepto a /usr/local.

Además tiene acceso a los comandos más “ping”, excepto “ls”.

Para todos los demás usuarios, tienen acceso solo a “ls” y “pwd”.

Modo de uso

Si queremos accesar al shell lShell desde un usuario ya iniciado en la shell actual, sólo debemos escribir

lshell

Y con ello nos cargará el shell con sus restricciones.

Para hacer que un usuario siempre cargue lShell por default, se realiza de la siguiente manera.

chsh -s /usr/bin/lshell elUsuario

Más información aquí.


angelinux

Desarrollador de páginas web desde el año 2000 y con experiencia en programación de sistemas para empresas desde el 2008; cofundador de CONSoluciones; autor del blog de software libre “Angelinux-slack”; docente en maestría en UPAV y fundador de la distribución Linux Falco que está en desarrollo para la Universidad Veracruzana. Además, ponente, organizador de congreso, laborista social, impartidor de cursos de programación y servidores Linux, webmaster, y ex invitado en programa de televisión.

0 Comentarios

Deja un comentario