Installation de Guacamole avec SSL et Auth Mysql sous ubuntu

Guacamole est une passerelle de bureau à distance sans client. Elle supporte les protocoles standards comme VNC, RDP et SSH. Une fois Guacamole installé sur un serveur, tout ce dont vous avez besoin pour accéder à vos bureaux est un navigateur web.

Dépendances

apt install -y  gcc-6 g++-6 libcairo2-dev libjpeg-turbo8-dev libpng-dev libossp-uuid-dev libavcodec-dev libavutil-dev libswscale-dev libfreerdp-dev libpango1.0-dev libssh2-1-dev libvncserver-dev libssl-dev libvorbis-dev libwebp-dev libtelnet-dev libmysql-java freerdp2-dev libpulse-dev libtool-bin libwebsockets-dev

Installation de Tomcat

apt install tomcat8 tomcat8-admin tomcat8-common tomcat8-user -y
ufw allow 8080
ufw reload

Installation du serveur Guacamole

Télécharger guacamole-server-1.1.0.tar.gz

tar xzf guacamole-server-1.1.0.tar.gz 
cd guacamole-server-1.1.0
autoreconf -fi
./configure --with-init-dir=/etc/init.d

      Library status:

     freerdp2 ............ yes
     pango ............... yes
     libavcodec .......... yes
     libavutil ........... yes
     libssh2 ............. yes
     libssl .............. yes
     libswscale .......... yes
     libtelnet ........... yes
     libVNCServer ........ yes
     libvorbis ........... yes
     libpulse ............ yes
     libwebsockets ....... yes
     libwebp ............. yes
     wsock32 ............. no

   Protocol support:

      Kubernetes .... yes
      RDP ........... yes
      SSH ........... yes
      Telnet ........ yes
      VNC ........... yes

   Services / tools:

      guacd ...... yes
      guacenc .... yes
      guaclog .... yes

make 
make install
ldconfig
systemctl enable guacd 
systemctl start guacd

Installation du client Guacamole sur le serveur

Télécharger guacamole-1.1.0.war

mkdir /etc/guacamole
mv guacamole-1.1.0.war  /etc/guacamole/guacamole.war
ln -s /etc/guacamole/guacamole.war /var/lib/tomcat8/webapps/
systemctl restart tomcat8 
systemctl restart guacd

Configuration de la connexion sécurisée

Récupération du certificat SSL

apt-get update
apt-get install software-properties-common
add-apt-repository universe
add-apt-repository ppa:certbot/certbot
apt-get update
apt-get install certbot python-certbot-apache
sudo certbot certonly --apache
certbot renew --dry-run

Création du reverse proxy Apache

apt-get install apache2
vi /etc/apache2/sites-available/guacamole.conf
 

     
     ServerName votre-serveur.fr
     RewriteEngine On
     RewriteCond %{HTTPS} !=on
     RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R,L]
 
 
 
 

     SSLEngine on
     SSLCertificateFile chemin vers la clef fullchain.pem
     SSLCertificateKeyFile chemin vers la clef privkey.pem

     ProxyPreserveHost On
     ProxyRequests On
     ProxyPass / http://127.0.0.1:8080/
     ProxyPassReverse / http://127.0.0.1:8080

 
  
systemctl restart apache2

Installation de l’authentification mysql

mkdir /etc/guacamole/extensions
mkdir /etc/guacamole/lib
ln -s /usr/share/java/mysql-connector-java.jar /etc/guacamole/lib/ 

Télécharger l’extension mysql guacamole-auth-jdbc-1.1.0.tar.gz

tar -xvf guacamole-auth-jdbc-1.1.0.tar.gz 
cp guacamole-auth-jdbc-1.1.0/mysql/guacamole-auth-jdbc-mysql-1.1.0.jar  /etc/guacamole/extensions/ 

Création de la base de donnée

apt install mysql-server
mysql_secure_installation 
mysql -u root -p
create database guacamole_db;
create user 'guacamole_user'@'localhost' identified by 'P@$$w0rd';
GRANT SELECT,INSERT,UPDATE,DELETE ON guacamole_db.* TO 'guacamole_user'@'localhost';
flush privileges;
quit 
cat guacamole-auth-jdbc-1.1.0/mysql/schema/*.sql | mysql -u root -pP@$$w0rd guacamole_db 

Configuration de Guacamole

echo "GUACAMOLE_HOME=/etc/guacamole" >> /etc/default/tomcat8

Création du fichier de configuration

vi /etc/guacamole/guacamole.properties
guacd-hostname: localhost 
guacd-port:    4822 
auth-provider:   net.sourceforge.guacamole.net.basic.BasicFileAuthenticationProvider
 
mysql-hostname: localhost
mysql-port: 3306
mysql-database: guacamole_db
mysql-username: guacamole_user
mysql-password: P@$$w0rd 
ln -s /etc/guacamole /usr/share/tomcat8/.guacamole
systemctl restart tomcat8.service
systemctl restart guacd.service 

L’installation est terminée. Accédez à votre nouvelle application depuis l’adresse : https://votre-serveur.fr/guacamole/

Les identifiants par défaut sont : guacadmin:guacadmin

Création d’utilisateurs et bureau distant

voir doc : https://guacamole.apache.org/doc/gug/administration.html

Références

How To install Onlyoffice in Seafile with Apache on ubuntu

For those who want to run Onlyoffice in Seafile under Apache web server on Ubuntu 16.04, I share the correct and complet How To.

I suppose you already have a seafile server running by following server manual.

$ sudo apt-get update

$ sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    software-properties-common

$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

$ sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"

$ sudo apt-get update

$ sudo apt-get install docker-ce

  • Deploy OnlyOffice DocumentServer Docker image :

docker run -dit -p 88:80 --restart always --name oods onlyoffice/documentserver
  • Configure Apache :

LoadModule authn_core_module modules/mod_authn_core.so
LoadModule authz_core_module modules/mod_authz_core.so
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule proxy_wstunnel_module modules/mod_proxy_wstunnel.so
LoadModule headers_module modules/mod_headers.so
LoadModule setenvif_module modules/mod_setenvif.so
LoadModule ssl_module modules/mod_ssl.so

<IfModule unixd_module>
  User seafile           // replace with your seafile user
  Group seafile          // replace with your seafile group
</IfModule>

<VirtualHost *:80>
   ServerName server.fr  // replace "server.fr" with your server URL
   ServerAlias seafile
   Redirect permanent / https://server.fr/
</VirtualHost>

<VirtualHost *:443>
  ServerName server.fr
  DocumentRoot /var/www

  SSLEngine On
  Include /etc/letsencrypt/options-ssl-apache.conf
  SSLCertificateFile /etc/letsencrypt/live/server.fr/fullchain.pem
  SSLCertificateKeyFile /etc/letsencrypt/live/server.fr/privkey.pem

  Alias /media /haiwen/seafile-server-latest/seahub/media

  <Location /media>
    Require all granted
  </Location>

  RewriteEngine On
  ProxyPass /seafhttp http://127.0.0.1:8082
  ProxyPassReverse /seafhttp http://127.0.0.1:8082

  RewriteRule ^/seafhttp - [QSA,L]
  SetEnvIf Request_URI . proxy-fcgi-pathinfo=unescape
  SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1

  ProxyPass / http://127.0.0.1:8000/
  ProxyPassReverse / http://127.0.0.1:8000/
  ProxyPass / fcgi://127.0.0.1:8000/
  

Define VPATH /onlyofficeds
Define DS_ADDRESS server.fr:88

<Location ${VPATH}>
Require all granted
  SetEnvIf Host "^(.*)$" THE_HOST=$1
  RequestHeader setifempty X-Forwarded-Proto https   // https VERY important !
  RequestHeader setifempty X-Forwarded-Host %{THE_HOST}e
  RequestHeader edit X-Forwarded-Host (.*) $1${VPATH}
  ProxyAddHeaders Off
  ProxyPass "http://${DS_ADDRESS}/"
  ProxyPassReverse "http://${DS_ADDRESS}/"
</Location>

</VirtualHost>
  • Configure Seafile Server for SUBFOLDER :
    Add the following config option to seahub_settings.py:

# Enable Only Office
ENABLE_ONLYOFFICE = True
VERIFY_ONLYOFFICE_CERTIFICATE = True
ONLYOFFICE_APIJS_URL = 'https://server.fr/web-apps/apps/api/documents/api.js'
ONLYOFFICE_FILE_EXTENSION = ('doc', 'docx', 'ppt', 'pptx', 'xls', 'xlsx', 'odt', 'fodt', 'odp', 'fodp', 'ods', 'fods')
ONLYOFFICE_EDIT_FILE_EXTENSION = ('docx', 'pptx', 'xlsx')

Then restart the Seafile Server.

ZFS terminologie et commandes de bases

Introduction

Avec ZFS on parlera de datasets, présents dans des zpools, composés de plusieurs vdev  représentant eux-même les disques concrets. Pour mieux comprendre, voici un exemple :

Nous avons quatre disques durs, de 1 Go chacun. Nous allons les utiliser de façon à avoir un pool de stockage de 2 Go répliqués :

# zpool create -f -o ashift=12 tank mirror /home/spydemon/hdd1 /home/spydemon/hdd2 mirror /home/spydemon/hdd3 /home/spydemon/hdd4
# zpool status
                                pool: tank
state: ONLINE
                                scan: none requested
config:

	NAME                     STATE     READ WRITE CKSUM
	tank                     ONLINE       0     0     0
	  mirror-0               ONLINE       0     0     0
	    /home/spydemon/hdd1  ONLINE       0     0     0
	    /home/spydemon/hdd2  ONLINE       0     0     0
	  mirror-1               ONLINE       0     0     0
	    /home/spydemon/hdd3  ONLINE       0     0     0
	    /home/spydemon/hdd4  ONLINE       0     0     0

errors: No known data errors

# sudo zfs list
NAME   USED  AVAIL  REFER  MOUNTPOINT
tank  56,5K  1,95G    19K  /tank

Nous pouvons à présent directement exploiter le zpool tank, ou alors le segmenter en différents datasets :

zfs create tank/dataset1
zfs create tank/dataset2
zfs list
NAME            USED  AVAIL  REFER  MOUNTPOINT
tank            468K  11,6G    96K  /tank
tank/dataset1    96K  11,6G    96K  /tank/dataset1
tank/dataset2    96K  11,6G    96K  /tank/dataset2

Voici un schéma pour mieux comprendre :

Nous avons conçu deux vdevsmirror-0 et mirror-1 appartenant tous les deux au zpool tank dont la taille efficace est de 2 Go. Il est monté sur tank dans l’arborescence.

Renommer et lister un dataset

Renommer un dataset :
zfs rename tank/dataset1 tank/data

Lister les datasets :
zfs list 

Snapshot en local

Création : 
zfs snapshot tank/data@one

Lister :
zfs list -t snapshot

Rendre visible le dossier snapshot :
zfs set snapdir=visible tank/data

Afficher les modifications depuis le snapshot :
zfs diff tank/data@one

Compression

État :
zfs get compression zfs_data 
NAME      PROPERTY     VALUE     SOURCE
zfs_data  compression  lz4       local

Activer :
zfs set compression=lz4 zfs_data

Znapzend (snapshot distant)

Nous allons utiliser znapzend pour envoyer les snapshot d’un serveur de production « servprod » vers un serveur de sauvegarde « servsav ».

  • Installer znapzend sur servprod
  • ensuite il faut créer un service znapzend dans le fichier /etc/init/znapzend.conf
  • puis démarrer le service : service znapzend start
  • ajouter mbuffer
  • création du dataset sur servsav : zfs create zfs_sav/TestNorbert
  • échange de clef ssh de servprod sur servsav
  • lancer le processus de backup* du dataset data,  avec la politique suivante : garde un snapshot toutes les minutes pendant 30 minutes et copie sur servsav.

*En langage ZFS, les processus de backup sont appelés PLAN de snapshot. Voir plus bas pour un PLAN plus opérationnel.

  • commande à lancer sur servprod pour exécuter le PLAN :
znapzendzetup create SRC '30min=>1min' tank/data DST '30min=>1min' root@servsav:zfs_sav/TestNorbert

Au bout de 30mn servprod à généré 30 snapshot (SRC ’30min=>1min’) . A la 31ème minutes le système supprime le snapshot le plus vieux et génère un nouveau snapshot. Ainsi il reste toujours 30 snapshot. ET ainsi de suite, la fenêtre des snapshot ce décale dans le temps. De la même manière , l’attribut  DST ’30min=>1min’ , définie la politique de rétention des snapshots sur le serveur distant.

  • lister les snapshots sur servprod :
root@servprod:/tank/data# zfs list -t snap
NAME                          USED  AVAIL  REFER  MOUNTPOINT
tank/data@one                  68K      -   108K  -
tank/data@two                  72K      -   116K  -
tank/data@2017-09-15-174200      0      -   120K  -
tank/data@2017-09-15-174300      0      -   120K  -
tank/data@2017-09-15-174400      0      -   120K  -
tank/data@2017-09-15-174500      0      -   120K  -
tank/data@2017-09-15-174600      0      -   120K  -
tank/data@2017-09-15-174700      0      -   120K  -
tank/data@2017-09-15-174800      0      -   120K  -
tank/data@2017-09-15-174900      0      -   120K  -
tank/data@2017-09-15-175000      0      -   120K  -
tank/data@2017-09-15-175100      0      -   120K  -
tank/data@2017-09-15-175200      0      -   120K  -
tank/data@2017-09-15-175300      0      -   120K  -
tank/data@2017-09-15-175400      0      -   120K  -
tank/data@2017-09-15-175500      0      -   120K  -
tank/data@2017-09-15-175600      0      -   120K  -
tank/data@2017-09-15-175700      0      -   120K  -
tank/data@2017-09-15-175800      0      -   120K  -
tank/data@2017-09-15-175900      0      -   120K  -
tank/data@2017-09-15-180000      0      -   120K  -
tank/data@2017-09-15-180100      0      -   120K  -
tank/data@2017-09-15-180200      0      -   120K  -
tank/data@2017-09-15-180300      0      -   120K  -
tank/data@2017-09-15-180400      0      -   120K  -
tank/data@2017-09-15-180500      0      -   120K  -
tank/data@2017-09-15-180600      0      -   120K  -
tank/data@2017-09-15-180700      0      -   120K  -
tank/data@2017-09-15-180800      0      -   120K  -
tank/data@2017-09-15-180900      0      -   120K  -
tank/data@2017-09-15-181000      0      -   120K  -
tank/data@2017-09-15-181100      0      -   120K  -
tank/data@2017-09-15-181200      0      -   120K  -
  • lister les snapshots sur servsav :
[root@servsav~]# zfs list -t snap | grep Norbert
zfs_sav/TestNorbert@2017-09-15-174400  12,8K      -   230K  -
zfs_sav/TestNorbert@2017-09-15-174500  12,8K      -   230K  -
zfs_sav/TestNorbert@2017-09-15-174600  12,8K      -   230K  -
zfs_sav/TestNorbert@2017-09-15-174700  12,8K      -   230K  -
zfs_sav/TestNorbert@2017-09-15-174800  12,8K      -   230K  -
zfs_sav/TestNorbert@2017-09-15-174900  12,8K      -   230K  -
zfs_sav/TestNorbert@2017-09-15-175000  12,8K      -   230K  -
zfs_sav/TestNorbert@2017-09-15-175100  12,8K      -   230K  -
zfs_sav/TestNorbert@2017-09-15-175200  12,8K      -   230K  -
zfs_sav/TestNorbert@2017-09-15-175300  12,8K      -   230K  -
zfs_sav/TestNorbert@2017-09-15-175400  12,8K      -   230K  -
zfs_sav/TestNorbert@2017-09-15-175500  12,8K      -   230K  -
zfs_sav/TestNorbert@2017-09-15-175600  12,8K      -   230K  -
zfs_sav/TestNorbert@2017-09-15-175700  12,8K      -   230K  -
zfs_sav/TestNorbert@2017-09-15-175800  12,8K      -   230K  -
zfs_sav/TestNorbert@2017-09-15-175900  12,8K      -   230K  -
zfs_sav/TestNorbert@2017-09-15-180000  12,8K      -   230K  -
zfs_sav/TestNorbert@2017-09-15-180100  12,8K      -   230K  -
zfs_sav/TestNorbert@2017-09-15-180200  12,8K      -   230K  -
zfs_sav/TestNorbert@2017-09-15-180300  12,8K      -   230K  -
zfs_sav/TestNorbert@2017-09-15-180400  12,8K      -   230K  -
zfs_sav/TestNorbert@2017-09-15-180500  12,8K      -   230K  -
zfs_sav/TestNorbert@2017-09-15-180600  12,8K      -   230K  -
zfs_sav/TestNorbert@2017-09-15-180700  12,8K      -   230K  -
zfs_sav/TestNorbert@2017-09-15-180800  12,8K      -   230K  -
zfs_sav/TestNorbert@2017-09-15-180900  12,8K      -   230K  -
zfs_sav/TestNorbert@2017-09-15-181000  12,8K      -   230K  -
zfs_sav/TestNorbert@2017-09-15-181100  12,8K      -   230K  -
zfs_sav/TestNorbert@2017-09-15-181200  12,8K      -   230K  -
  • dernier snapshot sur servprod :
root@servprod:/tank/data# znapzendztatz -r tank/data
USED    LAST SNAPSHOT       DATASET
 268K   2017-09-15-181500   tank/data
 614K   2017-09-15-181500   root@servsav:zfs_sav/TestNorbert
  • Le programme de backup est sauvegardé dans les propriétés du dataset ZFS :
zfs get all tank/data | grep org.znapzend

tank/data  org.znapzend:dst_0          root@servsav:zfs_sav/TestNorbert  local
tank/data  org.znapzend:pre_znap_cmd   off                              local
tank/data  org.znapzend:recursive      off                              local
tank/data  org.znapzend:src_plan       30minutes=>1minutes              local
tank/data  org.znapzend:tsformat       %Y-%m-%d-%H%M%S                  local
tank/data  org.znapzend:enabled        on                               local
tank/data  org.znapzend:post_znap_cmd  off                              local
tank/data  org.znapzend:dst_0_plan     30minutes=>1minutes              local
tank/data  org.znapzend:mbuffer        off                              local
tank/data  org.znapzend:zend_delay     0                                local
tank/data  org.znapzend:mbuffer_size   1G                               
local

Autre PLAN de snapshot

En local sur servprod :

  • toutes les 6 heures pendant 2 jours : 2d=>6h
  • tous les jours pendant 1 semaine : 1w=>1d

En distant sur servsav:

  • toutes les 6 heures pendant 2 jours : 2d=>6h
  • tous les jours pendant 1 semaine : 1w=>1d
  • garder une semaine : 1m=>1w
  • garder un mois : 1y=>1m
  • garder une semaine pendant 3 mois : 3m=>1w

Et la commande linux :

znapzendzetup create SRC '2d=>6h,1w=>1d' tank/data DST '2d=>6h,1w=>1d,1m=>1w,1y=>1m,3m=>1w' root@servsav:zfs_sav/TestNorbert

Redémarrer le service znapzend pour une prise en compte de toute modification du PLAN

systemctl reload znapzend.service

Ajouter mbuffer au PLAN

znapzendzetup edit --mbuffer=/usr/bin/mbuffer SRC tank/data
recharger le plan

Ajouter le dump de la BDD au plan avant la creation des snapshots

znapzendzetup edit --pre-snap-command=/var/pgsave/bin/pg_seafile.sh SRC tank/data
recharger le plan

 

Références