Acceso remoto centralizado: Apache Guacamole
Acceder a equipos de forma remota puede no ser una tarea fácil, tener que recordar usuarios, contraseñas, depender de una aplicación particular que puede no ser compatible con el sistema operativo que usemos en ese momento…
En nuestra ayuda, llega Guacamole (proyecto), un sistema incubado bajo el ala de la Fundación Apache (y egresado de esta hace poco). Guacamole se basa en HTML5 y javascript para darnos acceso a nuestros equipos por los protocolas mas comunes (RDP, VNC, SSH y Telnet) a través de una interfaz web de forma simple, teniendo la opción de crear usuarios con accesos particulares a cada uno, centralizando todos los equipos bajo unas mismas credenciales, simplificando así su manejo.
Ademas de la función básica de acceso, tendremos otras funciones que nos pueden resultar útiles, tales como grabar las sesiones remotas, ya sea en forma de vídeo para las consolas con entorno gráfico o en modo texto para las basadas en texto (también se pueden grabar como vídeo por algún motivo), podremos también compartir la conexión actual con cualquier persona sin importar que tengan o no usuario (como usuario de solo lectura por supuesto), podremos transferir archivos (si la aplicación server lo permite).
Instalando Guacamole
Para nuestra instalación, utilizaremos Debian 9 (Stretch) (Las ionstrucciones son tambien aplicables a Ubuntu y con mínimos cambios a distribuciones basadas en RedHat) y compilaremos la aplicación desde sus fuentes para estar actualizados a su versión mas reciente. Guacamole cuenta con dos aplicaciones, el demonio (guacd) y la parte web que habla con el demonio y la que deberemos deployar en un servidor Tomcat ya que esta programada en lenguaje java.
La instalación de los prerequisitos varia dependiendo de que servicios se quieran habilitar; para nuestra configuración, solo dejaremos afuera el soporte para audio sobre VNC/RDP y la generación de imágenes WebP.
Comenzaremos nuestra instalación, actualizando nuestro repositorio
apt-get update apt-get upgrade
E instalaremos los paquetes necesarios (dentro de nuestro procedimiento esta la instalación de Tomcat8, en caso de ya contar con el, quitarlo para evitar problemas)
Debian/Ubuntu
apt-get install tomcat8 libcairo2-dev libjpeg62-turbo-dev libpng-dev libossp-uuid-dev libavcodec-dev libavutil-dev libswscale-dev libfreerdp-dev libpango1.0-dev libssh2-1-dev libtelnet-dev libvncserver-dev libssl-dev libguac-client-rdp0 libguac-client-ssh0 libguac-client-vnc0 libguac11 libguava-java
RHEL/Fedora/CentOS
yum install cairo-devel libjpeg-turbo-devel libpng-devel uuid-devel ffmpeg-devel freerdp-devel pango-devel libssh2-devel libtelnet-devel libvncserver-devel openssl-devel
Crearemos ahora una carpeta en el home de nuestro usuario para descargar las fuentes y la aplicación web precompilada (no tiene sentido compilarla ya que al estar en java, es portable entre sistemas) y nos moveremos a ella.
mkdir ~/Guacamole cd ~/Guacamole
Y procederemos a descargar la ultima version (0.9.14 al momento de escribir este tutorial)
wget http://www-us.apache.org/dist/guacamole/0.9.14/source/guacamole-server-0.9.14.tar.gz
Desempaquetaremos las fuentes y nos moveremos a su carpeta
tar zxvf guacamole-server-0.9.14.tar.gz cd guacamole-server-0.9.14
Ejecutaremos ahora la configuración del compilado, en ella se verificaran las dependencias instaladas y se elegirá en base a estas, que funcionalidades se compilaran.
Para esto correremos el script de configuración del paquete, indicándole donde deberá dejar los archivos de arranque como parámetro.
./configure --with-init-dir=/etc/init.d
Y por ultimo compilaremos las fuentes
make make install ldconfig
Habilitaremos ahora el script de inicio para que se ejecute en el arranque del sistema
update-rc.d guacd defaults
Como ultimo paso de la instalación, descargaremos la aplicación web ya compilada y la copiaremos a la raiz de nuestro Tomcat
wget http://www-us.apache.org/dist/guacamole/0.9.14/binary/guacamole-0.9.14.war cp guacamole-0.9.14.war /var/lib/tomcat8/webapps/guacamole.war
Y reiniciaremos todo
service tomcat8 restart service guacd restart
Configurar y crear usuarios
Ya podremos, al ejecutar los pasos anteriores acceder a la pantalla de login de nuestro servicio, pero no podremos loguearnos a ella aun, ya que no hemos creado ningún usuario ni sus permisos. Para esto, utilizaremos el método de autenticacion por defecto, el cual esta definido en un archivo local que deberemos crear.
Este metodo es valido para ambientes pequeños y que no requieran demasiado mantenimiento, en caso de necesitarlo, se deberia usar la autenticacion utilizando una base de datos, que es mas escalable, permite grupos de usuario y de equipos y la gestión por interfaz gráfica de todo el sistema. En siguientes entradas estaremos configurando nuestro sistema para autenticar usando una base MySQL)
Para nuestro ejemplo de hoy utilizaremos la ubicación por defecto
mkdir /etc/guacamole
Crearemos ahora el archivo user-mapping.xml donde tendremos la definicion de los usuarios, los equipos a los que accede y que parametros utilizaremos en las conexiones a los mismos
nano /etc/guacamole/user-mapping.xml
El formato del archivo es simple y se basa en tags, el principal <user-mapping> es con el que se abre y se cierra el archivo, luego tenemos los usuarios utilizando el tag <authorize>, dentro de el definiremos las conexiones con <connection> y por ultimo cada parametro de estas conexiones estara definido por un <param>.
Como ejemplo, definiremos dos usuarios, con accesos a diferentes equipos, con diferentes protocolos. Uno tendrá su contraseña en clear y para el otro utilizaremos un hash de la misma.
<user-mapping> <authorize username="usuario1" password="usuario123"> <connection name="Server1"> <protocol>ssh</protocol> <param name="hostname">192.168.100.1</param> <param name="port">22</param> <param name="username">user_server</param> <param name="password">password_server</param> </connection> </authorize> <authorize username="usuario2" password="5ade09720648d52b708516636f84d216" encoding="md5"> <connection name="Server1"> <protocol>ssh</protocol> <param name="hostname">192.168.100.1</param> <param name="port">22</param> <param name="username">user_server</param> <param name="password">password_server</param> </connection> <connection name="Server2"> <protocol>ssh</protocol> <param name="hostname">192.168.100.2</param> <param name="port">22</param> <param name="username">user_server2</param> <param name="private-key">/root/.ssh/id_rsa</param> <param name="passphrase">key_passphrase</param> </connection> <connection name="Server3-VNC"> <protocol>vnc</protocol> <param name="hostname">192.168.100.3</param> <param name="port">5900</param> <param name="password">password_vnc_server</param> </connection> <connection name="Server3-RDP"> <protocol>rdp</protocol> <param name="hostname">192.168.100.3</param> <param name="port">3389</param> <param name="username">user_server3</param> <param name="password">password_user</param> <param name="domain">charrua.tech</param> </connection> </authorize> </user-mapping>
Para crear el hash md5 de la contraseña, utilizaremos el comando md5sum de esta forma
echo -n "password123" | md5sum
Lo único parámetro obligatorio de las conexiones, es el hostname, los demás son opcionales, ya que si son necesarios para establecer la conexión, se nos preguntaran al intentar conectarnos.
Al guardar los cambios en el archivo estarán disponibles al momento sin necesidad de otro paso, por lo que ya podríamos loguearnos con el usuarios que hayamos definido.
Interfaz gráfica
Ya tenemos todo listo para loguearnos con los usuarios que definimos anteriormente. Desde un navegador, accederemos a http://IP_Servidor:8080/guacamole donde se nos presentara la pantalla de login.
Para el caso de nuestro primer usuario, que solo tenia definida una conexión, se nos logueara directo en el equipo sin darnos opción a hacer otra cosa. Para nuestro segundo usuario es un poco mas entretenido.
En este caso, veremos la lista con los equipos que hemos definido al usuario, haciendo click sobre cualquiera de ellos, no conectaremos a el, en caso se no haber configurado alguno de los datos, se nos pedirá ingresar los mismo como al conectarnos con cualquier cliente standalone. Si ya accedimos a alguno de ellos, se nos mostrara una captura de pantalla de esa sesión.
Estando conectados a algún equipo, podemos presionar Ctrl+Alt+Shift para abrir el menú del usuario, en el podremos manejar el porta papeles remoto, ya sea para traernos o para cargarle datos (esto no se puede sincronizar con el del cliente por seguridad en los navegadores), levantar un teclado virtual (para dispositivos moviles por ejemplo), configurar como responde el mouse (también útil si accedemos con un dispositivo móvil), configurar nuestra sesión o desloguearnos de la misma. Esta configuración se guarda localmente, por lo que deberemos replicarla con cada nuevo dispositivo en el cual nos logueemos.
Y esto es todo por hoy, en entradas siguientes, cambiaremos nuestro tipo de autenticación para hacerlo mas manejable globalmente, utilizaremos una base MySQL y los plugins de Guacamole para manejarla.