Shellinabox

HowTo: Instalar Shellinabox para acceder a nuestro servidor via web.

Escrito el y tuvo 3 comentarios

Si por algún motivo no podemos acceder a nuestro servidor con un terminal, porque quizás, estamos en caminando por la calle y solo tenemos nuestro teléfono celular encima, y como no somos frikis ni nada, no hemos instalado ninguna aplicación de este tipo ¿qué hacemos entonces?

Pues nada, no podemos hacer nada hasta que lleguemos a la casa o al trabajo, accedamos a nuestro servidor e instalemos Shellinabox.

Shellinabox

Shellinabox implementa un servidor web que puede exportar herramientas de línea de comandos a un emulador de terminal basado en la web. Este emulador es accesible desde cualquier navegador que soporte JavaScript y CSS, por lo que no requiere ningún tipo de plugin adicional para funcionar.

Aunque el proyecto original fue descontinuado, hay un fork en Github que nos permite instalarlo si no lo tenemos en los repositorios. En el caso de Ubuntu 14.04 está, así que solo tenemos que abrir un terminal y poner:

$ sudo apt install shellinabox openssl ca-certificates

En el caso de los últimos dos paquetes es por si no los tenemos ya instalados. Y una vez hecho esto pues ya podemos acceder a nuestro terminal en la web poniendo en el navegador:

http://la_ip_o_nombre_del_servidor:4200

Usar Shellinabox por el puerto 80

Como pueden apreciar, por defecto Shellinabox usa el puerto 4200 y es posible que no podamos acceder a él si nuestro proveedor de servicios lo tiene bloqueado. Podemos usar una variante que es poco segura pero funciona, que es usar Shellinabox por el puerto 80, aunque después mostraré como usar el 443 si lo tenemos disponible.

Lo que haremos será acceder a Shellinabox al poner en nuestro navegador:

http://la_ip_o_nombre_del_servidor/terminal

Para ello lo primero que hacemos es instalar NGinx:

$ sudo apt install nginx

Ahora creamos el fichero /etc/nginx/sites-enabled/shellinabox y le ponemos adentro:

 server {
  proxy_set_header Host $http_host;
  proxy_set_header X-Forwarded-Host $http_host;
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

  location /terminal/ {
    proxy_pass http://localhost:4200/;
  }
}

Editamos el fichero /etc/default/shellinabox y ponemos al final:

SHELLINABOX_ARGS="--localhost-only --disable-ssl"

Reiniciamos NGinx y Shellinabox:

$ sudo /etc/init.d/shellinabox restart
$ sudo /etc/init.d/nginx restart

Y listo!!

Usar Shellinabox por el puerto 443

Este proceso es un poco más engorroso, porque tenemos que crear nuestros certificados SSL. Para ello haremos lo siguiente:

Primero instalamos OpenSSL:

$ sudo apt-get install openssl

Creamos una llave privada:

openssl genrsa -out server.key 2024

Creamos la base del certificado, donde pondremos una serie de datos:

openssl req -new -key server.key -out server.csr

Los datos que llenaremos serán:

  • Country Name (2 letter code): Código de país en formato ISO de dos letras (ej: ES, US, CU, MX..).
  • State or Province Name (full name): Estado o provincia (ej: Florida).
  • Locality Name: Localidad o ciudad (ej: Miami).
  • Organization Name: Nombre de la organización, (ej: DesdeLinux).
  • Organizational Unit Name: Sector de la organización (ej: Blogs).
  • Common Name: Nombre del dominio ó FQDN. Es importante conocer que hay una diferencia entre blog.desdelinux.net y desdelinux.net. Debes registrar el certificado para uno, o para el otro.
  • Email Address: Dirección de correo de contacto.
  • A challenge password: En blanco.
  • An optional company name: En blanco.

Ahora generamos el certificado SSL, que nos tomará los datos que pusimos:

openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt

Copiamos los certificados a la carpeta SSL dentro de /etc:

$ sudo cp server.crt /etc/ssl/certs/ssl.crt
$ sudo cp server.key /etc/ssl/certs/ssl.key

Volvemos a editar el fichero el fichero /etc/default/shellinabox y cambiamos lo que habíamos puesto, poniendo al final:

SHELLINABOX_ARGS="--no-beep"

Ahora editamos el fichero /etc/nginx/sites-enabled/shellinabox y le ponemos adentro:

 server {
    listen 80;
    return 301 https://$host$request_uri;
}

server {

    listen 443;
    server_name myvps.com;

    ssl_certificate           /etc/ssl/certs/ssl.crt;
    ssl_certificate_key       /etc/ssl/certs/ssl.key;

    ssl on;
    ssl_session_cache  builtin:1000  shared:SSL:10m;
    ssl_protocols  TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4;
    ssl_prefer_server_ciphers on;

    access_log            /var/log/nginx/shellinabox.access.log;

    location /terminal {

      proxy_set_header        Host $host;
      proxy_set_header        X-Real-IP $remote_addr;
      proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header        X-Forwarded-Proto $scheme;

      # Fix the “It appears that your reverse proxy set up is broken" error.
      proxy_pass          http://localhost:4200/;
      proxy_read_timeout  90;

      proxy_redirect      http://localhost:4200 https://myvps.com/terminal/;
    }
  }

Reiniciamos los servicios:

$ sudo /etc/init.d/shellinabox restart
$ sudo /etc/init.d/nginx restart

y accedemos a

http://la_ip_o_nombre_del_servidor/terminal

lo cual debe redireccionarnos a:

https://la_ip_o_nombre_del_servidor/terminal

Y eso es todo.

Comparte:

¿Ideas? ¿Comentarios?

  1. Me guardo este articulo en favoritos por si algun dia lo necesito. Por cierto Koding una plataforma para desarrollar web tiene una funcion para controlar una computadora con Ubuntu instalado remotamente, es algo similar a lo que planteas con Shellinabox, fijate si te interesa el tema.

    Responder
    1. @Andrew:

      Interesante, le echo un ojo. Gracias por el dato.

      Responder
  2. No me sentiría seguro abriendo otro puerto más para los curiosos, además siendo una web te obliga a habilitar el login por pass, wrong!! Solo public key de 2048 bits mínimo.

    Para los que necesiten hacer trabajos rápidos recomiendo JuiceSSH para Android, lo mejorcito, incluso soporta Mosh.

    https://juicessh.com/

    https://mosh.mit.edu/

    Responder

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.