Shellinabox – Terminal interactiva en el navegador
Instalación
Puedes ver el repositorio en GitHub del proyecto en el siguiente enlace.
Para hacer una prueba inicial lo podemos instalar sobre una máquina virtual con Ubuntu 18.04 en VirtualBox.
Accedemos a la maquina virtual como usuario root para actualizar los repositorios e instalar Shellinabox
apt update $$ apt -y upgradeapt install -y shellinabox
Podemos comprobar que el servicio de shellinabox se ha instalado correctamente y esta iniciado.
service shellinabox status
Configuración
Podemos modificar el archivo de configuración que se encuentra en el directorio /etc/default/shellinabox
nano /etc/default/shellinabox
El servicio de shellinabox escucha por defecto en el puerto 4400, pero si queremos podemos cambiarlo a otro puerto.
SHELLINABOX_PORT=4400
Para activar el usuario y grupo que viene por defecto, simplemente habría que quitar # que viene al principio.
SHELLINABOX_USER=shellinaboxSHELLINABOX_GROUP=shellinabox
Si en tu servidor no tienes instalado un certificado SSL, deberás añadir la siguiente linea al final del documento.
SHELLINABOX_ARGS="--disable-ssl"
Una vez finalizada la edición del documento debemos reiniciar el servicio.
service shellinabox restart
Usuario y contraseña de acceso.
Para acceder a la terminal se recomienda tener un usuario que NO SEA ROOT, en el paso anterior veíamos como activar el usuario “shellinabox” pero deberíamos asignarle una contraseña.
sudo passwd shellinabox
Si queremos crear un usuario nuevo con su propia contraseña deberíamos teclear el siguiente comando
adduser terminal
Acceder a la terminal.
Abrimos el navegador e introducimos la dirección ip de nuestro servidor seguido de :4400
http://192.168.1.23:4400
Automatizar mediante script de bash
A continuación veremos como podemos crear multiples contenedores LXC con una shell interactiva accesible desde el navegador.
Creamos un primer script en bash bucle_crear.sh con el siguiente contenido:
#!/bin/bash
for n in {1..2};
do
lxc launch debian shell$n
lxc file push script.sh shell$n/root/
lxc exec shell$n -- bash /root/script.sh $1 $2
lxc config set shell$n limits.memory 340MB
done
- n -> Dentro del bucle la n ira tomando un valor desde el 1 hasta el número final (en mi caso 2), por tanto se van a crear 2 contendores.
- launch -> Este comando crea un contendor con la imagen de debian y le asigna un nombre (en mi caso shell1, shell2).
- file push -> Sube el script.sh al contenedor (este script contiene la instalación y configuración de shellinabox).
- lxc exec -> Ejecuta en el contenedor que corresponda (shell1, shell2, …) el script de instalación subido anteriormente.
- lxc config -> Por ultimo, voy a limitar la memoria RAM de cada contenedor a 340MB.
Creamos un segundo script script_install.sh para instalar y configurar shellinabox
#!/bin/bash
#Declaro una variable llamada privilegio que contiene el usuario root
privilegio='root'
#Actualización del sistema
apt update && apt -y upgrade
#Instalando Shellinabox
apt install -y shellinabox
#Cambio de puerto por defecto en el archivo de configuración de shellinabox
sed -i 's/SHELLINABOX_PORT=4200/SHELLINABOX_PORT=4400/g' /etc/default/shellinabox
#Desactiva el SSL en la configuración de shellinabox, a menos que tengas instalado un certificado con Certbot
sed -i 's/SHELLINABOX_ARGS="--no-beep"/SHELLINABOX_ARGS="--disable-ssl"/g' /etc/default/shellinabox
#Reiniciar el servicio
service shellinabox restart
#Añadir un nuevo usuario y contraseña que se le pasara en tiempo de ejecucion
pass=$(perl -e 'print crypt($ARGV[0], "password")' $2)
useradd -m -c "Acceso Shellinabox" -p "$pass" -s /bin/bash $1
#Cambiar la contraseña del usuario root, es la misma que la contraseña del usuario
echo $privilegio":"$2 | /usr/sbin/chpasswd
Ahora ejecutamos el script bucle_crear.sh
bash bucle_crear.sh usuario password
- usuario -> Nombre del usuario para acceder al contenedor.
- password -> Contraseña tanto de nuestro usuario como de acceso a root.
Automatizar un laboratorio de 10 contenedores.
Creamos un nuevo script lab_crear.sh con el siguiente contenido:
#!/bin/bash
# S1 es el nombre del nuevo usuario
# $2 es la contraseña del nuevo usuario y de root
# $var es una variable que almacena la ip del contenedor
# script.sh seria el mismo que en el ejemplo anterior
for n in {1..10};
do
lxc launch debian ct$n
lxc file push script.sh ct$n/root/
lxc exec ct$n -- bash /root/script.sh $1 $2
lxc config set ct$n limits.memory 340MB
var=$(lxc exec ct$n -- ip route get 1.2.3.4 | awk '{print $7}')
cp /etc/nginx/sites-available/plantilla /etc/nginx/sites-available/ct$n
sed -i 's/server_name sub.nexosocial.org;/server_name ct'$n'.nexosocial.org;/g' /etc/nginx/sites-available/ct$n
sed -i 's/10.204.26.176/'$var':4400/g' /etc/nginx/sites-available/ct$n
ln -s /etc/nginx/sites-available/ct$n /etc/nginx/sites-enabled/
service nginx restart
done
Plantilla de Nginx
server {
listen 80;
server_name sub.nexosocial.org;
location / {
proxy_pass http://10.204.26.176;
}
}