Sabato, 14 Marzo 2020 09:18

HowTo: Guacamole LDAP e MySQL. Eccellente remote desktop

Guacamole è un progetto Apache di remote desktop veramente interessante. Si installa in un server, da una browser internet si accede al programma e magicamente sono disponibili i desktop preparati dall'amministratore.

In questa guida vediamo come installarlo in un sistema CentOS 8 con autenticazione centralizzata su un server LDAP ed il profilo utenti salvato in un database MariaDB.

1. Premessa

Ipotizziamo che il nostro ambiente sia così organizzato.

 

 

Le caratteristiche dei nodi sono le seguenti:

  • Guacamole: server Guacamole. Sotto le caratteristiche;

  • UCS: server UCS con servizio di dominio AD e server delle autenticazioni;

  • Windows: macchina Windows da remotizzare;

  • Mac: macchina Mac da remotizzare;

  • Ubuntu: macchina Ubuntu da remotizzare;

  • PC: PC che accede da remoto;

  • Smartphone: cellulare che accede da remoto.

In questa architettura i nodi sono così configurati:

  • Guacamole:

    • OS: CentOS 7

    • IP: 192.168.0.10

    • Hostname: srv10.example.com

    • Java 1.8

    • MariaDB XX

    • Guacamole 1.1

    • Tomcat 8

  • UCS:

    • OS: UCS 4.4

    • IP: 192.168.0.20

    • Hostname: srv20.example.com

    • LDAP porta: 7389

  • Windows:

    • OS: Windows Server 2012

    • IP: 192.168.0.30

    • Hostname: srv30.example.com

    • Export: RDP

  • Mac:

    • OS: MacOS

    • IP: 192.168.0.40

    • Hostname: srv40.example.com

    • Export: VNC

  • Ubuntu:

    • OS: Ubuntu Server 19

    • IP: 192.168.0.50

    • Hostname: srv50.example.com

    • Export: SSH.

Il server UCS, Windows, Mac e Ubuntu si presuppongono già allestiti e configurati e non saranno oggetto di spiegazione.

2. Panoramica

Il nostro sistema funziona nel seguente modo:

  • i server Windows, Mac e Ubuntu usano UCS per i servizi di rete (DNS, DHCP, AD, shares) e l'autenticazione

  • il server UCS contiene tutte le utenze

  • quando un utente si collega a Guacamole:

    • Guacamole verifica le credenziali su UCS

    • se le credenziali sono corrette Guacamole recupera il profilo dell'utente dal database locale MariaDB dal record che ha lo stesso username e mostrerà le sessioni concesse all'utente

    • se l'utente connesso ha diritti di amministratore saranno disponi le funzioni per gestire i profili utente e la gestione delle sessioni

  • se l'utente non è presente in UCS, Guacamole lo cerca nel database locale MariaDB. Se esiste viene concesso il login con i relativi permessi. Se non esiste non viene concesso il login.

3. Creazione del server Guacamole

Iniziamo da una installazione già fatta di CentOS come server base, senza l'ambiente X e priva di pacchetti aggiuntivi.

  1. Prima di iniziare l'aggiornamento installiamo due pacchetti mancanti

yum install -y deltarpm epel-release

  1. aggiorniamo il nostro CentOS

yum -y update; yum autoremove -y

  1. installiamo alcune utility

yum install -y vim htop iotop mytop mc tmux lnav wget unzip zip pbzip2

  1. disattiviamo SElinux. Editiamo /etc/sysconfig/selinux modificando la direttiva SELINUX come segue

    NB: non è una buona pratica disattivare SElinux. Lo pratichiamo ora per le finalità didattiche della guida!

...
SELINUX=disabled
...

  1. disattiviamo il firewall interno

    NB: non è una buona pratica disattivare il firewall. Lo pratichiamo ora per le finalità didattiche della guida!

systemctl stop firewalld
s
ystemctl disable firewalld

  1. riavviamo il server

systemctl reboot

3.1. Preparazione di CentOS

Procediamo installando Java, MariaDB e scaricando tutti i pacchetti di Guacamole.

  1. Dopo esserci connessi come utente root installiamo le librerie necessarie al corretto funzionamento di Guacamole

yum install -y cairo-devel libjpeg-turbo-devel libjpeg-devel libpng-devel libtool uuid-devel ffmpeg-devel freerdp-devel pango-devel libssh2-devel libvncserver-devel pulseaudio-libs-devel openssl-devel libvorbis-devel libwebp-devel libwebsockets-devel terminus-fonts

  1. installiamo OpenJava

yum install -y java-1.8.0-openjdk

  1. installiamo e inizializziamo MariaDB:

    1. installiamo il database

yum install -y mariadb mariadb-server

    1. avviamo il database e impostiamolo come servizio attivo

systemctl enable mariadb

systemctl start mariadb

    1. securizziamo MariaDB

      NB: impostiamo la password dell'utente root di MariaDB come "pass_123456"

mysql_secure_installation

La base per installare Guacamole è pronta. Passiamo a installare il servizio.

3.2. Installazione di Guacamole

L'installazione prevede l'aggiunta della parte server di Guacamole e, successivamente, la parte client che gira all'interno di un application server.

Configuriamo Tomcat per per essere un server dedicato a Guacamole (cioè Guacamole sarà l'unica applicazione e sarà l'applicazione default).

Arriveremo all'installazione completa e funzionante, ma non configurata per dialogare con UCS e MariaDB. Questo sarà il passo descritto al capitolo 3.3 Configurazione con LDAP e MySQL.

3.2.1. Preparazione

Prepariamoci scaricando tutti i pacchetti necessari:

  1. creiamo la directory dove metteremo i file da scaricare

mkdir /opt/Temp
cd /opt/Temp

  1. scarichiamo Tomcat

wget https://mirror.nohup.it/apache/tomcat/tomcat-8/v8.5.51/bin/apache-tomcat-8.5.51.tar.gz

  1. scarichiamo il connector per MariaDB

wget https://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-8.0.19.tar.gz

  1. scarichiamo Guacamole server

wget https://mirror.nohup.it/apache/guacamole/1.1.0/source/guacamole-server-1.1.0.tar.gz

  1. scarichiamo Guacamole client

wget https://apache.panu.it/guacamole/1.1.0/binary/guacamole-1.1.0.war

  1. scarichiamo le estensioni di Guacamole per il supporto dell'LDAP e di MariaDB

wget https://apache.panu.it/guacamole/1.1.0/binary/guacamole-auth-ldap-1.1.0.tar.gz
wget https://apache.panu.it/guacamole/1.1.0/binary/guacamole-auth-jdbc-1.1.0.tar.gz

3.2.2. Guacamole server

Procediamo compilando e installando la parte server:

  1. aggiungiamo il repo per l'ambiente di sviluppo FFmpeg

yum install -y http://li.nux.ro/download/nux/dextop/el7/x86_64/nux-dextop-release-0-5.el7.nux.noarch.rpm

  1. aggiungiamo l'ambiente di sviluppo di FFmpeg

yum install -y ffmpeg-devel
autoreconf -fi

  1. aggiungiamo l'ambiente di compilazione

yum groupinstall -y "Development Tools"

  1. estraiamo il tarball di Guacamole server precedentemente scaricato e posizionamoci dentro i sorgente

tar xfz guacamole-server-1.1.0.tar.gz
cd guacamole-server-1.1.0

  1. compiliamo

./configure --with-init-dir=/etc/init.d
make
make install
ldconfig

  1. aggiorniamo systemd e abilitiamo il server di Guacamole, ma non avviamolo. Infatti pur essendo tutto installato non funzionerebbe correttamente dando un falso negativo perché manca ancora la configurazione

systemctl daemon-reload
systemctl enable guacd

  1. rimuoviamo l'ambiente di compilazione

yum groupremove -y "Development Tools"

Ora tutta la parte server è pronta. Passiamo a installare la parte client e le consigurazioni.

3.2.3. Guacamole client

  1. installiamo Tomcat

    1. creiamo l'utente per Tomcat

useradd -m -s /bin/nologin -d /opt/tomcat tomcat

    1. estraiamo il servlet container

tar xfz apache-tomcat-8.5.51.tar.gz -C /opt/
mv /opt/apache-tomcat-8.5.51 /opt/tomcat

    1. aggiungiamo subito il connector per il database

tar xfz mysql-connector-java-8.0.19.tar.gz
mv mysql-connector-java-8.0.19/mysql-connector-java-8.0.19.jar /opt/tomcat/lib/

    1. rimuoviamo gli strumenti aggiuntivi presenti nel pacchetto

/bin/rm -R /opt/tomcat/webapps/*

    1. correggiamo i permessi

chown tomcat.tomcat -R /opt/tomcat

    1. creiamo lo slice di avvio. Generiamo il file /etc/systemd/system/tomcat.service con il seguente contenuto

# Systemd unit file for tomcat
[Unit]
Description=Apache Tomcat Web Servlet Container
After=syslog.target network.target


[Service]
Type=forking

Environment=JAVA_HOME=/usr/lib/jvm/jre
Environment=CATALINA_PID=/opt/tomcat/temp/tomcat.pid
Environment=CATALINA_HOME=/opt/tomcat
Environment=CATALINA_BASE=/opt/tomcat
# Environment='CATALINA_OPTS=-Xms512M -Xmx1024M -server -XX:+UseParallelGC'
Environment='JAVA_OPTS=-Djava.awt.headless=true -Djava.security.egd=file:/dev/./urandom'

ExecStart=/opt/tomcat/bin/startup.sh
ExecStop=/bin/kill -15 $MAINPID

User=tomcat
Group=tomcat
UMask=0007
RestartSec=10
Restart=always

[Install]
WantedBy=multi-user.target

    1. forziamo systemd a rileggere tutti gli slice disponibili

systemctl daemon-reload

    1. impostiamo Tomcat come servizio attivo, ma non lo avviamo

systemctl enable tomcat

  1. installiamo il client Guacamole.

    NB: volendo un server dedicato in Tomcat procediamo con una fase manuale per avere l'esclusività dell'applicazione

    1. creiamo la directory di destinazione

mkdir ROOT

    1. estraiamo il pacchetto guacamole-1.1.0.war

unzip -d ./ROOT guacamole-1.1.0.war

    1. correggiamo i permessi e spostiamo il pacchetto in Tomcat

chown tomcat.tomcat -R ROOT
mv ROOT /opt/tomcat/webapps/

  1. creiamo i file di configurazione

    1. creiamo le directory /etc/guacamole/extensions

mkdir -p /etc/guacamole/extensions

    1. creiamo le directory per i jar extra

mkdir -p /opt/guacamole/lib

    1. creiamo le directory per il file pid

mkdir -p /var/run/guacd
chown guacd.guacd /var/run/guacd

    1. creiamo il file /etc/guacamole/guacamole.properties con il seguente contenuto

# CONF Guacomole

# Set languages aviable
available-languages: it, en

# Hostname and port of guacamole proxy
guacd-hostname: localhost
guacd-port: 4822

# Location to read extra .jar's from
lib-directory: /opt/guacamole/lib


# Authentication provider class
auth-provider: net.sourceforge.guacamole.net.basic.BasicFileAuthenticationProvider


# Properties used by BasicFileAuthenticationProvider
basic-user-mapping: /etc/guacamole/user-mapping.xml

## LDAP properties
#auth-provider: net.sourceforge.guacamole.net.auth.ldap.LDAPAuthenticationProvider
#ldap-hostname: srv20.example.com
#ldap-port: 7389
#ldap-encryption-method: none
#ldap-search-bind-dn: uid=ldap.user,cn=users,dc=example,dc=com
#ldap-search-bind-password: 53262d8
#ldap-user-base-dn: DC=example,DC=com
#ldap-username-attribute: ui
#ldap-user-attributes: cn, givenName, sn, mobile, mail
#ldap-user-search-filter: (ucsGuacamole=1)

## MySQL properties
#mysql-hostname: localhost
#mysql-port: 3306
#mysql-database: guacamole
#mysql-username: guacamole
#mysql-password: 7b9fc11557638301d0b6

## MySQL
#mysql-default-max-connections: 0
#mysql-default-max-group-connections: 0

    1. creiamo il file /etc/guacamole/guacd.conf

#
# guacd configuration file
#

[daemon]
pid_file = /var/run/guacd/guacd.pid
log_level = info

[server]
bind_host = localhost
bind_port = 4822

#[ssl]
# server_certificate = /etc/ssl/certs/guacd.crt
# server_key = /etc/ssl/private/guacd.key

    1. creiamo il file /etc/guacamole/user-mapping.xml

      NB: l'utente e la sessione inserite servono solo per verificare il corretto funzionamento di Guacamole!

<?xml version="1.0" encoding="UTF-8"?>
<user-mapping>
<authorize username="user1" password="5cfaca93">
<connection name="Guacamole">
<protocol>ssh</protocol>
<param name="hostname">localhost</param>
<param name="port">22</param>
<param name="enable-sftp">true</param>
</connection>
<connection name="Ubuntu">
<protocol>ssh</protocol>
<param name="hostname">srv50.example.com</param>
<param name="port">22</param>
<param name="enable-sftp">true</param>
</connection>
</authorize>
</user-mapping>

 

  1. avviare Guacamole (server e client)

systemctl start guacd
systemctl start tomcat

  1. per verificare il funzionamento

    1. consultare i log di Tomcat /opt/tomcat/logs/catalina.out

    2. con un browser connettersi a http://srv10.example.com:8080 e autenticarsi come user1. Verificare il funzionamento

Ora abbiamo un'installazione completa e funzionante di Guacamole.

Passiamo al titolo seguente per la configurazione e la connessione con l'LDAP e il database.

3.3. Configurazione per LDAP e MySQL

Prima di iniziare riportiamo un sinottico dei dati per accedere al database e all'LDAP.

Doveroso tener presente che questa sezione richiede conoscenze avanzate.

MariaDB

  • Server: localhost

  • Porta: 3306

  • DB name: guacamole

  • DB user: guacamole

  • DB pass: 7b9fc11557638301d0b6

LDAP

  • Server: srv20.example.com

  • Porta: 7389

  • Protocollo: none

  • User di bind: uid=ldap.user,cn=users,dc=example,dc=com

  • Pass di bind: 53262d8

  • Base DN: DC=example,DC=com

  • Attributo di bind: UID

  • Attributi utente: cn, givenName, sn, mobile, mail

  • Filtro di ricerca: in questo caso non applichiamo alcun filtro. Ipotizzando un attributo booleano che definisca se l'utente è autorizzato o meno e questo attributo sia, ad esempio, ucsGuacamole la nostra condizione nel filtro sarebbe così

ldap-user-search-filter: (ucsGuacamole=1)

Iniziamo il lavoro:

  1. spegniamo i servizi Guacamole

systemctl stop tomcat
systemctl stop guacd

 

  1. inizializziamo il database ed il connector

    1. estraiamo il pacchetto guacamole-auth-jdbc-1.1.0.tar.gz e spostiamoci nella directory mysql

tar xfz guacamole-auth-jdbc-1.1.0.tar.gz
cd guacamole-auth-jdbc-1.1.0/mysql

    1. pubblichiamo il connector

mv guacamole-auth-jdbc-mysql-1.1.0.jar /etc/guacamole/extensions/

    1. creiamo database, tabelle e utente

      1. iniziamo dalla creazione del database e dell'utente. Per fare ciò accediamo al terminale di MariaDB

# mysql -u root -p
Enter password: pass_123456

mysql> CREATE DATABASE guacamole;

mysql> CREATE USER 'guacamole'@'localhost' IDENTIFIED BY '7b9fc11557638301d0b6';

mysql> GRANT SELECT,INSERT,UPDATE,DELETE ON guacamole.* TO 'guacamole'@'localhost';

mysql> FLUSH PRIVILEGES;

mysql> quit;

      1. procediamo creando le tabelle e carichiamo i dati base

mysql -u root -p guacamole < schema/001-create-schema.sql
Enter password: pass_123456
mysql -u root -p guacamole < schema/002-create-admin-user.sql
Enter password: pass_123456

  1. pubblichiamo il connector per l'LDAP

    1. ri-posizioniamoci nella directory dove abbiamo scaricato precedentemente tutto

cd /opt/Temp

    1. estraiamo il tarball

tar xfz guacamole-auth-ldap-1.1.0.tar.gz

    1. pubblichiamo il connector

mv guacamole-auth-ldap-1.1.0/guacamole-auth-ldap-1.1.0.jar /etc/guacamole/extensions/

  1. rimuoviamo il file user-mapping.xml

rm /etc/guacamole/user-mapping.xml

  1. aggiorniamo /etc/guacamole/guacamole.properties come segue

    NB: riportiamo solo le righe aggiornate

...
# Authentication provider class
#auth-provider: net.sourceforge.guacamole.net.basic.BasicFileAuthenticationProvider

# Properties used by BasicFileAuthenticationProvider
#basic-user-mapping: /etc/guacamole/user-mapping.xml

## LDAP properties
auth-provider: net.sourceforge.guacamole.net.auth.ldap.LDAPAuthenticationProvider
ldap-hostname: srv20.example.com
ldap-port: 7389
ldap-encryption-method: none
ldap-search-bind-dn: uid=ldap.user,cn=users,dc=example,dc=com
ldap-search-bind-password: 53262d8
ldap-user-base-dn: DC=example,DC=com
ldap-username-attribute: uid
ldap-user-attributes: cn, givenName, sn, mobile, mail
#ldap-user-search-filter: (ucsGuacamole=1)

## MySQL properties
mysql-hostname: localhost
mysql-port: 3306
mysql-database: guacamole
mysql-username: guacamole
mysql-password: 7b9fc11557638301d0b6

## MySQL
mysql-default-max-connections: 0
mysql-default-max-group-connections: 0

  1. riavviamo i servizi

systemctl start guacd
systemctl start tomcat

A questo punto la nostra installazione è pronta.

Accediamo all'URL http://srv10.example.com:8080 e testiamo il tutto:

  • autenticarsi con l'account default username "guacadmin", password "guacadmin"

  • cambiamo subito la password di guacadmin

  • per amministrare il tutto l'utente con cui ci autentichiamo deve essere abilitato nel profilo. Volendo abilitare un utente presente nel server UCS (es. utente32):

    • ci autentichiamo in Guacamole come utente32 e usciamo

    • quindi ri-autentichiamoci come guacadmin, accediamo a Opzioni -> Utenti -> utente32 e nel profilo, sezione "Permessi", abilitiamo l'utente a gestire tutto

    • da questo momento autenticandoci come utente32 oltre alla possibilità di gestire tutto vediamo anche tutti gli utenti presenti sul server di autenticazione UCS

  • scelto e autorizzato chi sarà l'amministratore creiamo le sessioni di desktop remoto e assegniamole agli utenti o ai gruppi pianificati.

4. Conclusione

Guacamole è un'ottima soluzione di remote desktop server. Offre ottime prestazioni insieme ad una grande flessibilità. Ha tutti gli accorgimenti che servono ad un amministratore di sistema per avere centralizzazione, controllo e offrire agli utenti uno strumento semplice da usare.

Inoltre, se si hanno le capacità, è a costo zero. Se non si hanno le capacità, ma si hanno i soldi, lo troviamo in diverse soluzioni aziendali o possiamo trovare diverse società che lo possono installare e preparare per noi.

In fine va doverosamente rilevato che bisogna avere un buono skill professionale per metterlo in produzione sopratutto se lo vogliamo integrare nel nostro sistema. Forse questo è il vero punto dolens.

5. Appendice

5.1. Meccanismi di autenticazione

Guacamole supporta diversi meccanismi di autenticazione. UCS espone, oltre all'accesso diretto all'LDAP, anche altri meccanismi standard come SASML, NTLM, ecc...

Da scegliere oculatamente il meccanismo più adatto per la propria infrastruttura.

5.2. Certificati

In queste pagine tutte le connessioni sono in trasparente senza alcuna criptazione.

In un sistema reale in produzione è opportuno acquisire un certificato ed esporre le connessioni tramite una criptazione usando i protocolli HTTPS e LDAPS.

5.3. Filtri per il BIND

In questa guida per autenticarsi su Guacamole è sufficiente che la username e la password coincidano con i dati in UCS.

Ci sono diversi modi per applicare dei filtri direttamente sull'account in UCS in modo che l'amministratore da un solo punto possa controllare tutto (centralizzazione). In questa ottica un modo compliant di contenuta complessità è intervenire sullo schema dell'LDAP in UCS aggiungendo uno o più attributi che possono aggiungere informazioni all'account come: può accedere a Guacamole, può accedere a uno o più gruppi di profili, ecc...

Se si implementa questa strategia:

  • si deve aggiornare lo schema dell'LDAP server (nel caso di UCS c'è da personalizzare anche l'interfaccia web per poter gestire gli attributi aggiunti [cf. https://docs.software-univention.de/manual-4.4.html#central:extendedattrs ]

  • si deve opportunamente configurare guacamole.properties perché legga tutte le informazioni necessarie dall'LDAP

  • tra le varie impostazioni di guacamole.properties lavorare sulla proprietà ldap-user-search-filter per impostare una logica che soddisfi le regole create per concedere-negare l'accesso.

    Ad esempio: se appartieni a Guacamole e ad Admin. In una query di filtro diventa:

    (&(memberOf=CN=Guacamole,DC=example,DC=com)(memberOf=CN=Admin,DC=example,DC=com))

5.4. Guacamole standalone o di serie da UCS

Se usiamo UCS, tra gli addon disponibili nel marketplace, c'è Guacamole. L'integrazione è veramente ben fatta e permette una gestione integrata con un bassissimo costo di implementazione (in pratica un clic di mouse).

Perché allora tutta tutto il lavoro (timidamente) prospettato in queste pagine?

La risposta non è semplice se non si ha un po di esperienza.

La semplice pacchettizzazione offerta da UCS è buona per diversi casi d'uso. Il distinguo è nelle finalità e nell'architettura della propria rete.

Spetterà all'architetto di rete e all'ingegnere senior valutare la migliore implementazione: se quella embedded in UCS o quella stand-alone interconnessa con UCS.

5.5. Porta 8080 e non 80?

Questa guida non affronta la questione.

Gli Application Server (AS) ed i Servlet Container (SC) normalmente escono non sulle porte web standard per diverse ragioni, in primis che tra l'AS e internet, l'SC e internet si mette uno strato di separazione per separare, bilanciare e fare da cache. Normalmente si usa un reverse proxy per questo lavoro. A volte è software, in altri casi si ricorre soluzioni hardware particolarmente performanti.

Gli AS o SC vengono a volte impiegati in sistemi complessi dove sono configurati in cluster per garantire maggiore capacità di calcolo o per garantire la continuità di servizio ( High Availability o, più semplicemente, HA).

Questa introduzione di teoria delle reti per dire che è un'idea poco felice metter mano a server.xml di Tomcat per spostarlo sulla porta 80 (inoltre le performance di velocità sarebbero molto basse).

Un soluzione di contenuta complessità e molto documentata consiste nell'installare Apache httpd e configurarlo come reverse proxy. La soluzione è molto flessibile e scala.

Cimentarsi nell'implementare un reverse proxy ha anche il vantaggio di essere una soluzione che si usa in produzione anche in realizzazioni di piccole dimensioni per mantenere alta la sicurezza e l'efficienza (ed è a costo zero!).

6. Webgrafia

4.7. Expansion of UMC with extended attributes, https://docs.software-univention.de/manual-4.4.html#central:extendedattrs

Apache Guacamole™, https://guacamole.apache.org/

Apache Tomcat®, http://tomcat.apache.org/

Chapter 6. Database authentication, https://guacamole.apache.org/doc/gug/jdbc-auth.html#jdbc-auth-mysql

Chapter 7. LDAP authentication, https://guacamole.apache.org/doc/gug/ldap-auth.html

Questo sito utilizza cookie, anche di terze parti, per migliorare la tua esperienza e offrire servizi in linea con le tue preferenze. Chiudendo questo banner, scorrendo questa pagina o cliccando qualunque suo elemento acconsenti all’uso dei cookie. Se vuoi saperne di più o negare il consenso a tutti o ad alcuni cookie vai alla sezione Cookie Policy.