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

guacamole preinstall

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.

Deja un comentario