96 - El terminal de tu Rasbperry desde un navegador
Es posible acceder al terminal de tu Rasbperry desde un navegador de internet y además integrarlo en RPi Monitor protegiéndolo con usuario y contraseña
Como probablemente ya te imaginas, sigo dando vueltas y buscando la mejor opción para rebajar la temperatura de la Raspberry Pi 4. Esto será motivo de un podcast que vendrá mas adelante cuando tenga todos los datos e información a mi alcance. Sin embargo, si que quiero volver a incidir sobre RPi Monitor que es la herramienta que estoy utilizando para todo esto, ya que me permite ver directamente y en tiempo real la evolución de todos los parámetros que consideres. Pero no solo esto, sino que además te permite acceder al terminal desde el navegador web.
Si, lo has oído bien, se trata de poder acceder al terminal de tu Raspberry directamente desde un navegador. No se trata de un navegador web para el terminal. Esto evidentemente tiene muchas ventajas, como es que no necesitas conectarte vía ssh. Pero sobre todo, que lo puedes hacer desde cualquier Sistema Operativo. Y en este caso, realizar el mantenimiento es realmente sencillo.
La cuestión es que en el podcast 89 que te hablé sobre monitorizar la temperatura, hablé de pasada sobre RPi Monitor y las posibilidades que nos ofrece. Y es aquí donde interviene Jessica, que es realmente la que ha motivado este podcast. Dado que se planteó la posibilidad de acceder a este servicio desde internet. Esto tiene el problema que te imaginas. Cualquiera puede ver todos los datos que ofrece RPi Monitor. Pero es mas, y es que, si permites el acceso al terminal, estas abriendo una puerta directa al corazón de tu Raspberry. Por esta razón, Jéssica planteó proteger el acceso con contraseña.
El terminal de tu Rasbperry desde un navegador
Un previo
Antes de meterme en faena, contarte, como hago normalmente los jueves en que ando metido.
Siguiendo con el proyecto iniciado por Pedro Mosquetero Web de doce meses doce donaciones al software libre, la donación de este mes de agosto a ido a Blender. Coincidiendo precisamente con la profunda renovación que ha tenido este aplicación en su versión 2.80.
Respecto al tema de artículos, con eso de estar de verano, esta semana solo encontrarás un artículo. Se trata del último capítulo del tutorial sobre scripts en bash y que trata sobre depurar tus scripts. Se trata de una herramienta para dejar tus scripts perfectamente niquelados.
Como te decía, con este capítulo termino este tutorial, y hasta septiembre no comenzaré con el siguiente que es docker. No quiero que ni tu ni yo nos machaquemos las neuronas en verano que hace mucho calor. Además en septiembre te va a venir ideal porque va a casar perfectamente con los podcast referentes a la granja de Raspberry, y todos esos podcast que estoy preparando.
Por otro lado, quería agradecer a Juan de Podcast Linux, el haber movido el proyecto de fondos productivos. No solo movido, sino que para que cunda el ejemplo, el ha sido el primero que ha participado creando los atajos para audacity. A ver si tu también te animas y participas en este proyecto. Indicarte que he cambiado la atribución. Si participas en el proyecto modificando alguno de los que ya están en el repositorio, simplemente añade tu usuario a la atribución, o si creas uno, simplemente pones tu usuario… ¿de que red social?, la que tu quieras.
Por otro lado estoy terminando dos páginas web. Se trata de un nuevo proyecto que vamos a traer para la ciudad de Valencia. El objeto de este nuevo proyecto es el de organizar algunos eventos, tanto para este año como para el siguiente… pero lo cierto es que no puedo contarte mucho mas, y creo que ya he contado demasiado… en cuanto estén disponibles las páginas web, te lo haré saber… Pero paso a paso.
Por último en lo que se refiere a aplicaciones, estoy resolviendo algunos problemillas que han aparecido con My Weather Indicator y la última versión de Ubuntu. Así como resolver un problema de pdf tools en Linux Mint.
RPi Monitor
En el podcast 89 en el que te hablé sobre monitorizar la temperatura de tu Raspberry Pi 4, te hablé sobre RPi Monitor. Sin embargo si no has seguido el tutorial sobre primeros pasos con la Raspberry Pi, probablemente no conozcas este interesante servicio, que presenté en el capítulo 16 de este tutorial, en el que te hablé sobre como monitorizar la Rasbperry Pi.
RPi Monitor es un servicio que te permite estar informado, no solo puntualmente, sino también a lo largo del tiempo del estado de tu Rasbperry. Al final lo que tienes es una página web, donde de un solo vistazo tienes toda la información de tu Rasbperry. La ventaja es que el desarrollador de esta aplicación ha creado una página web adaptativa, es decir, que cuando la veas en el móvil se adaptará perfectamente al tamaño de pantalla.
Y cuando digo toda la información, es toda. No solo la que este servicio te ofrece por defecto, sino también toda la que tu quieras añadir, porque añadir información es realmente por sencillo. Pero si no quieres añadir iformación, tampoco te tienes que preocupar, porque fíjate las opciones que tienes,
- Valores de CPU, carga, frecuencia y tensión.
- Temperatura de la Raspberry.
- Uso de memoria RAM y de intercambio
- Situación de los diferentes servidores
- Estado de la transferencia de datos vía WiFi.
Pero además podemos integrar otros servicios, como es la posibilidad de acceder al terminal directamente desde el navegador. Este es uno de los puntos que verás mas adelante.
Además de toda la información que puedes añadir, también tienes la posibilidad de habilitar ciertos complementos. Y precisamente en estos complementos que puedes habilitar está shellinabox
.
shellinabox
shellinabox implementa un servidor web que funciona como un emulador de terminal. Un emulador de terminal que estará accesible desde cualquier navegador que soporte JavaScript y CSS.
Esto evidentemente te da la posibilidad de acceder a tu Raspberry desde cualquier navegador que se encuentre en tu red local. Pero ¿y si quieres acceder desde Internet?…. esto ahora verás que también es posible.
Sin embargo, antes, indicarte que esta interesante herramienta también se integra con RPi Monitor, con lo que matamos dos pájaros de un tiro.
Primero, te indico como puedes acceder a RPi Monitor desde internet, y luego das un paso mas allá.
Acceder a RPi Monitor desde fuera de tu red local
Este primer paso no tiene nada del otro mundo. Resolverlo es tan sencillo como realizar las tres acciones que comento a continuación,
- Redirigir los puertos de tu router a la Raspberry. ¿Que puertos? En principio el 80 y el 443. Si necesitas otro mas, ya sabes…. lo abres también.
- Si en casa tienes IP fija, nada, pero si no es tu caso, sino que tu, como yo tienes IP dinámica necesitas un servicio DDNS para resolver este inconveniente. En este caso, te recomiendo que leas el artículo sobre una puerta a tu Raspberry con IP dinámica, donde te cuento como puedes hacer de una forma relativamente sencilla.
- Cifrar las comunicaciones con tu Raspberry Pi, para lo que puedes seguir las indicaciones del enlace, donde te explico como puedes hacerlo de forma realmente sencilla.
El tercer paso, el de cifrar las comunicaciones, no es imprescindible, pero yo lo considero totalmente necesario. No está nada bien, que andemos por ahí securizando nuestro acceso al servidor, y por otro lado dejar nuestras comunicaciones visibles a cualquiera.
Este tercer paso no lo hagas todavía, espera hasta tener configurado nginx con los parámetros necesarios. Yo te indicaré mas adelante.
Securizar y autenticar con un proxy inverso
Dependencias
Antes que nada tienes que instalar las herramientas necesarias, si es que todavía no las tienes instaladas. Que no es mas que nginx
y shellinabox
. Para esto, tan solo tienes que ejecutar la siguiente instrucción,
sudo apt install nginx shellinabox
Gestión de la autenticación
Para poder indicar quien puede acceder vía web es necesario un sencillo script. De cualquier forma, me remito al tutorial de script en Bash, y en particular al de preguntar al usuario en Bash. Así, el script puede quedar como te indico a continuación, addusuario.sh
,
#!/bin/bash
if [ "$(id -u)" != "0" ]; then
echo "This script must be run as root"
exit 1
fi
read -p "Enter new username: " user
read -sp "Enter new password: " pass
printf "$user:$(openssl passwd -crypt $pass)\n" >> /etc/nginx/.htpasswd
Una vez creado este script, guárdalo en algún sitio seguro, y por supuesto ejecútalo para crear al menos un usuario. El usuario por defecto con el que accederás al servicio. Para esto tan solo tienes que ejecutar la siguiente instrucción,
sudo bash addusuario.sh
Configuración del proxy inverso
Ahora toca crear o añadir, depende de como lo tengas en tu caso, la configuración para el proxy inverso. Si solo vas a utilizar nginx como proxy inveso, tienes que quitar la configuración por defecto de nginx. Esto es tan sencillo como ejecutar la siguiente instrucción,
sudo rm /etc/nginx/sites-enable/default
No te preocupes por borrar este archivo porque no es mas que un enlace simbólico.
El siguiente paso es crear la configuración. Para ello crea el archivo /etc/nginx/sites-available/reverseproxy
con el siguiente contenido,
access_log off;
add_header Cache-Control public;
server_tokens off;
# HTTP 80
server {
if ($host = tudominio.duckdns.org) {
return 301 https://$host$request_uri;
} # managed by Certbot
listen 80;
server_name tudominio.duckdns.org;
#Force the usage of https
rewrite ^ https://$host$request_uri? permanent;
}
# HTTPS 443
server {
listen 443 ssl;
server_name tudominio.duckdns.org;
keepalive_timeout 70;
# SSL config
ssl on;
ssl_certificate /etc/letsencrypt/live/belcar.duckdns.org/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/belcar.duckdns.org/privkey.pem; # managed by Certbot
ssl_session_timeout 5m;
ssl_protocols SSLv3 TLSv1.2;
ssl_ciphers RC4:HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
# Allow to use frame from same origin
add_header X-Frame-Options SAMEORIGIN;
# DDOS protection - Tune Values or deactivate in case of issue
# limit_conn conn_limit_per_ip 20;
# limit_req zone=req_limit_per_ip burst=20 nodelay;
# Proxy Config
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffers 32 4k;
# Define the default site
location / {
rewrite ^ /rpimonitor/ permanent;
}
location /rpimonitor/ {
proxy_pass https://localhost:8888;
auth_basic "Access Restricted";
auth_basic_user_file "/etc/nginx/.htpasswd";
access_log /var/log/nginx/rpimonitor.access.log;
error_log /var/log/nginx/rpimonitor.error.log;
}
location /shellinabox/ {
proxy_pass https://localhost:4200;
auth_basic "Access Restricted";
auth_basic_user_file "/etc/nginx/.htpasswd";
access_log /var/log/nginx/shellinabox.access.log;
error_log /var/log/nginx/shellinabox.error.log;
}
}
Algunas observaciones a esta configuración,
- Evidententemente tienes que cambiar
tudominio.duckdns.org
por tu dominio. - En el caso de que hayas cambiado los puertos de RPi Monitor y shellinabox no olvides cambiarlos en la configuración.
Si como ves aquí, en la configuración de Nginx como proxy inverso, ya has incluido la posibilidad de acceder a shellinabox directamente desde la ruta indicada. Además también le has puesto contraseña de acceso para evitar que cualquier amigo de lo ajeno pueda acceder de forma completamente impune.
shellinabox y Android
Las pruebas que he podido realizar para acceder desde el móvil al terminal de la Raspberry utilizando shellinabox
han sido totalmente infructuosas. Por algún tipo de razón me repite algunas pulsaciones. Así, el usuario si que he podido introducirlo, pero la contraseña ha sido totalmente imposible. No lo he conseguido ninguna de las veces.
Así que por el momento vas a tener que seguir utilizando termux para estos menesteres tal y como te comenté en el episodio 14 en el que te hable sobre como podías sacar toda la potencia de Linux en Android.
Conclusión
Como ves, tienes una potente herramienta que te permitirá no solo tener controlada tu Raspberry desde cualquier lugar de internet, sino también poder acceder fácilmente al terminal desde el navegador