Apache Guacamole es un software desarrollado por la organización Apache para la utilización de escritorio remoto sin cliente (Lo llamamos sin cliente porque no se requieren complementos ni software de cliente). Admite protocolos estándar como VNC, RDP y SSH.
Gracias a HTML5, una vez que Guacamole está instalado en un servidor, todo lo que necesita para acceder a sus escritorios es un navegador web.
Puede realizar la instalación nativamente, con Docker o NGINX Proxy y las librerías requeridas son Cairo, libjpeg, libpng y OSSP UUID.
Paquetes de las librerías requeridas por sistema operativo
Ubuntu: libcairo2-dev libjpeg-turbo8-dev libjpeg62-dev libpng12-dev libtool-bin libossp-uuid-dev
Debian: libcairo2-dev libjpeg62-turbo-dev libjpeg62-dev libpng12-dev libtool-bin libossp-uuid-dev
Fedora/CentOS: cairo-devel libjpeg-devel libpng-devel libtool uuid-devel
Nota:
Si libjpeg-turbo no está disponible en su plataforma y no desea compilarlo desde la fuente, libjpeg también funcionará, aunque no será tan rápido.
Dependencias opcionales:
Las dependencias opcionales de Guacamole dictan qué partes de guacamole-server se utilizarán. Esto incluye la compatibilidad con varios protocolos de escritorio remoto, así como cualquier característica adicional de esos protocolos:
- La compatibilidad con VNC depende de la biblioteca libvncclient, que forma parte de libVNCServer.
- La compatibilidad con RDP depende de una versión reciente de FreeRDP (1.0 o superior, pero no una versión no publicada de git).
- La compatibilidad con SSH depende de libssh2, OpenSSL y Pango (una biblioteca de diseño de texto y representación de fuentes, utilizada por el emulador de terminal integrado de Guacamole).
- Telnet depende de libtelnet y Pango.
- La compatibilidad con Kubernetes depende de libwebsockets, OpenSSL y Pango.
La utilidad guacenc, proporcionada por guacamole-server para traducir grabaciones de pantalla en video, depende de FFmpeg y solo se construirá si están instaladas al menos las bibliotecas libavcodec, libavformat, libavutil y libswscale proporcionadas por FFmpeg.
Importante
Si no tiene estas dependencias, no se habilitarán las funciones o protocolos que dependen de ellas. Lea esta sección detenidamente antes de decidir no instalar una dependencia opcional.Debian/Ubuntu: libavcodec-dev libavformat-dev libavutil-dev libswscale-dev freerdp2-dev libpango1.0-dev libssh2-1-dev libtelnet-dev libvncserver-dev libwebsockets-dev libpulse-dev libssl-dev libvorbis-dev libwebp-dev
Fedora/CentOS: ffmpeg-devel freerdp-devel pango-devel libssh2-devel libtelnet-devel libvncserver-devel libwebsockets-devel pulseaudio-libs-devel openssl-devel libvorbis-devel libwebp-devel
Instalación y configuración por pasos de Apache Guacamole:
Se utilizará de ejemplo una instalación en un servidor Ubuntu 20.04 LTS (64 Bit) con la imagen preinstalada, Ubuntu 18.04 Desktop (64 Bit) como cliente y también se añadirá un cliente RDP Windows 2019 Datacenter (English 64Bit).
Instalación de paquetes requeridos:
# apt install libcairo2-dev libjpeg-turbo8-dev libjpeg-dev libpng-dev libtool-bin libossp-uuid-dev
Instalación de paquetes opcionales:
# apt install libavcodec-dev libavformat-dev libavutil-dev libswscale-dev freerdp2-dev libssh2-1-dev libtelnet-dev libvncserver-dev libpulse-dev libssl-dev libvorbis-dev libwebp-dev
Instalación de paquetes requeridos:
# apt install libcairo2-dev libjpeg-turbo8-dev libjpeg62-dev libpng12-dev libtool-bin libossp-uuid-dev
Instalación de paquetes opcionales:
# apt install libavcodec-dev libavformat-dev libavutil-dev libswscale-dev freerdp2-dev libssh2-1-dev libtelnet-dev libvncserver-dev libpulse-dev libssl-dev libvorbis-dev libwebp-dev
Descargar paquete servidor de Guacamole (Podéis buscar la última versión disponible en Apache Guacamole Downloads):
# wget https://downloads.apache.org/guacamole/1.5.5/source/guacamole-server-1.5.5.tar.gz
Descomprimir tar.gz del fichero descargado:
# tar -xvf guacamole-server-1.5.5.tar.gz
Acceder al directorio descomprimido:
# cd guacamole-server-1.5.5/
Realizar configuración mediante script incorporado:
# ./configure --with-init-dir=/etc/init.d
Compilar:
# make
Instalar compilación:
# make install
Actualizar configuración de librerías:
# ldconfig
Recargar demonios:
# systemctl daemon-reload
Iniciar y activar:
# systemctl start guacd && systemctl enable guacd
Comprobar el estado del servicio de Guacamole:
# systemctl status guacd
Verificar funcionamiento mediante el puerto:
# ss -lnpt | grep guacd
Instalar tomcat:
# apt install tomcat9 tomcat9-admin tomcat9-common tomcat9-user
Verificar funcionamiento mediante el puerto:
# ss -lnpt | grep java
Descargar paquete binario webapp para tomcat:
# wget https://downloads.apache.org/guacamole/1.5.5/binary/guacamole-1.5.5.war
Moverlo al directorio de la versión tomcat:
# mv guacamole-1.5.5.war /var/lib/tomcat9/webapps/guacamole.war
Reiniciar el servicio:
# systemctl restart tomcat9 guacd
Crear directorio para los ficheros de configuración para el uso de guacamole:
# mkdir /etc/guacamole/
Crear un fichero para las propiedades:
# vi /etc/guacamole/guacamole.properties
Introducir la siguiente información (Podemos especificar el directorio de usuarios o puerto deseado):
# Hostname and port of guacamole proxy
guacd-hostname: localhost
guacd-port: 4822
# Auth provider class (authenticates user/pass combination, needed if using the provided login screen)
auth-provider: net.sourceforge.guacamole.net.basic.BasicFileAuthenticationProvider
basic-user-mapping: /etc/guacamole/user-mapping.xml
Obtener contraseña para el uso de un usuario para Guacamole:
# echo -n CONTRASEÑA | openssl md5
Modificar fichero de mapeo de usuarios:
# vi /etc/guacamole/user-mapping.xml
Ejemplo de configuración del fichero (No es necesario la introducción del parámetro contraseña):
<user-mapping>
<!-- Per-user authentication and config information -->
<authorize username="admin" password="CONTRASEÑA_EN_MD5" encoding="md5">
<connection name="GuacamoleVNC">
<protocol>vnc</protocol>
<param name="hostname">localhost</param>
<param name="port">5901</param>
<param name="password">XXXX</param>
</connection>
<connection name="GuacamoleSSH">
<protocol>ssh</protocol>
<param name="hostname">localhost</param>
<param name="username">root</param>
<param name="port">22</param>
<param name="password">XXXX</param>
</connection>
<connection name="UbuntuRDP">
<protocol>rdp</protocol>
<param name="hostname">10.20.10.7</param>
<param name="username">xrdpuser</param>
<param name="port">3389</param>
<param name="password">XXXXX</param>
</connection>
<connection name="WindowsRDP">
<protocol>rdp</protocol>
<param name="hostname">10.20.10.5</param>
<param name="port">3389</param>
<param name="username">administrator</param>
<param name="password">XXXX</param>
<param name="ignore-cert">true</param>
</connection>
<connection name="WindowsTELNET">
<protocol>telnet</protocol>
<param name="hostname">10.20.10.5</param>
<param name="port">23</param>
<param name="username">administrator</param>
<param name="password">XXXX</param>
</connection>
</authorize>
</user-mapping>
Modificar permisos para únicamente uso del usuario:
# chmod 600 /etc/guacamole/user-mapping.xml
Asignar permisos de propiedad y grupo:
# chown tomcat9:tomcat9 /etc/guacamole/user-mapping.xml
Reiniciar o recargar los servicios:
# systemctl restart tomcat9 guacd
En este punto se debería poder acceder por el puerto 8080 (Revisar Firewall) al aplicativo web presentado por tomcat desde el navegador mostrando la página de inicio de guacamole con el usuario y las conexiones configuradas al iniciar sesión:
Para más protección podemos instalar el fail2ban para bloquear los intentos de conexión:
# apt install fail2ban
Revisar el fichero de configuración para comprobar si tiene la jail activa:
# vi /etc/fail2ban/jail.d/defaults-debian.conf
Debería aparecer lo siguiente:
[guacamole]
enabled = true
Verificar estado mediante:
# fail2ban-client status
Y por último, escoge tu servidor Web preferido para el proxy inverso:
Configuración rápida para Apache Proxy con HTTPS
Instalación del servicio:
# apt install apache2
Activación de módulos:
# a2ensite default-ssl && a2enmod ssl && a2enmod proxy && a2enmod proxy_http && a2enmod proxy_balancer && a2enmod lbmethod_byrequests
Realizar reinicio o recarga del servicio:
# systemctl restart apache2
Modificación el site por defecto:
# vi /etc/apache2/sites-available/default-ssl.conf
Introducimos/modificamos por la básica configuración requerida:
<IfModule mod_ssl.c>
<VirtualHost _default_:443>
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
SSLEngine on
SSLCertificateFile /etc/ssl/private/ssl-cert-snakeoil.key
SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
SSLProxyEngine on
SSLProxyVerify none
SSLProxyCheckPeerCN off
SSLProxyCheckPeerName off
SSLProxyCheckPeerExpire off
<Location /guacamole/>
Order allow,deny
Allow from all
ProxyPass http://IP:8080/guacamole/ flushpackets=on
ProxyPassReverse http://IP:8080/guacamole/
</Location>
SSLCertificateFile /etc/ssl/private/ssl-cert-snakeoil.key
SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
<FilesMatch "\.(cgi|shtml|phtml|php)$">
SSLOptions +StdEnvVars
</FilesMatch>
<Directory /usr/lib/cgi-bin>
SSLOptions +StdEnvVars
</Directory>
</VirtualHost>
</IfModule>
# apt install certbot python3-certbot-apache
Certificación mediante Let's Encrypt el dominio o subdominio:
# certbot --apache -d sub.domain.com
Configuración rápida para NGINX Proxy con HTTPS
# apt install nginx
# vi /etc/nginx/sites-available/default
server {
listen 80 default_server;
listen [::]:80 default_server;
return 301 https://sub.domain.com;
}
server {
listen 443 ssl;
server_name sub.domain.com;
ssl_certificate /etc/ssl/private/ssl-cert-snakeoil.key;
ssl_certificate_key /etc/ssl/private/ssl-cert-snakeoil.key;
location / {
proxy_buffering off;
proxy_pass http://localhost:8080/guacamole/;
proxy_http_version 1.1;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $http_connection;
access_log off;
}
location /.well-known/ {
allow all;
root /var/www/html;
}
}
Instalación de los paquetes necesarios para la certificación de Let's Encrypt:# apt install certbot python3-certbot-nginx
Certificación mediante Let's Encrypt el dominio o subdominio:
# certbot --nginx -d sub.domain.com