Galène est un logiciel libre distribué sous licence MIT qui a pour objectif de fournir une solution de visioconférence pour l’enseignement et les exposés scientifiques accessible depuis un navigateur web. Il est développé à l’Université de Paris-Diderot par Juliusz Chroboczek. Il permet de :
Galène n’est pas un concurrent de BBB mais se veut avant tout un logiciel simple, robuste et efficace aux fonctionnalités strictement limitées. Voir le serveur de démonstration.
On trouve dans ce document quelques éléments permettant d’auto-héberger un serveur de visioconférence Galène, c’est-à-dire :
visio. d’un nom de domaine.Pour la suite, j’utilise les variables :
${VISIO} # le nom de la VM sur laquelle tourne Galène
${PRIVATE_IP} # l'IP privée de cette VM, du type 192.168.1.XX
${PUBLIC_IP} # votre IP publique, celle de votre box
${MONDOMAINE} # votre nom de domaine
J’ai pris l’habitude d’administrer mes machines virtuelles avec KVM. Pour faire de même, sur l’hôte installer :
# apt install qemu-system qemu-system-x86 qemu-utils \
libvirt-clients libvirt-daemon-system \
virtinst bridge-utils
Pour que la VM partage la connexion réseau de l’hôte, il est nécessaire de définir une connexion de type bridge par exemple avec network manager) ou plus directement en éditant l’interface réseau :
arrêter libvirtd
# systemctl stop libvirtdtrouver le nom de votre interface ethernet avec
$ ip a
par exemple eno1, vue à côté de son IP privée sous la
forme
inet <IP/24> brd ...éditer le fichier /etc/network/interfaces avec
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
source /etc/network/interfaces.d/*
# The loopback network interface
auto lo
iface lo inet loopback
# The bridge interface
auto br0
iface br0 inet static
address <IP>
netmask 255.255.255.0
broadcast 192.168.1.255
gateway 192.168.1.1
bridge_ports eno1
bridge_stp off
bridge_waitport 0
bridge_fd 0
# The primary network interface
auto eno1
iface eno1 inet manualactiver la redirection d’IP
# echo "net.ipv4.ip_forward = 1" \
| sudo tee /etc/sysctl.d/99-ipforward.conf
# sysctl -p /etc/sysctl.d/99-ipforward.confredémarrer le service réseau
# servive networking restart
puis les autres
# systemctl start libvirtd
# systemctl enable libvirtdPour ajouter cette connexion de type bridge à libvirt,
on suit le
tuto de Leif Madsen :
définir la configuration sous forme de fichier XML
# cat > bridge.xml <<EOF
<network>
<name>host-bridge</name>
<forward mode="bridge"/>
<bridge name="br0"/>
</network>
EOFajouter cette interface de connexion à virsh
# virsh net-define bridge.xmlactiver l’interface et imposer son démarrage automatique
# virsh net-start host-bridge
# virsh net-autostart host-bridgevérifier avec :
# virsh net-list --all
qui doit afficher
Name State Autostart Persistent
--------------------------------------------------
default inactive no yes
host-bridge active yes yesCéer une machine virtuelle avec la dernière version stable de
debian GNU/Linux (bookworm) à laquelle j’ai alloué 2 coeurs
(vcpus) et 4 Go de RAM (ram) :
# virt-install \
--name ${VISIO} \
--vcpus 2 \
--ram 4096 \
--disk path=/somewhere/${VISIO}.qcow2,size=10 \
--os-type linux \
--os-variant debiantesting \
--network bridge=br0 \
--graphics none \
--console pty,target_type=serial \
--location 'http://ftp.debian.org/debian/dists/bookworm/main/installer-amd64/' \
--extra-args 'console=ttyS0,115200n8 serial'
où br0 est l’interface bridge ;
procéder à l’installation avec juste un serveur SSH et le minimum vital des coreutils ;
démarrer et se connecter à la machine virtuelle
# virsh start ${VISIO}
# virsh console ${VISIO}mettre à jour puis installer le minimum vital
# apt update && apt full-upgrade
# apt install vim git golangtélécharger Galène
# git clone https://github.com/jech/galenecompiler Galène
# cd galene
# CGO_ENABLED=0 go build -ldflags='-s -w'ajouter un groupe
# mkdir groups
# cat > groups/<groupname>.json << EOF
{
"op": [{"username": "<user0>", "password": "<pwd0>"}],
"presenter": [
{"username": "<user1>", "password": "<pwd1>"},
{"username": "<user2>", "password": "<pwd2>"}
]
}
EOF
Pour laisser l’accès libre à tous, il faut mettre
"presenter": [{}]lancez Galène depuis votre réseau local
# ./galene
puis vérifier que vous pouvez vous connecter à l’adresse
https://<localIP>:8443
puis à <groupname>.
Vous avez un avertissement de sécurité, c’est normal, on n’a pas encore installé de certificat. Vous pouvez lancer une vidéo, et si vous vous connectez deux fois, vous vous voyez.
installer coturn
# apt install coturnarrêter le service
# service coturn stopactiver le serveur coTURN par défaut
echo "TURNSERVER_ENABLED=1" > /etc/default/coturnéditer le fichier de configuration
cat > /etc/turnserver.conf << EOF
listening-port=1194
fingerprint
lt-cred-mech
user=${TURN_USER}:${TURN_PWD}
server-name=visio.${MONDOMAINE}
realm=${MONDOMAINE}
EOFrelancer le serveur
# service coturn startéditer le fichier de configuration de Galène
cat > galene/data/ice-servers.json << EOF
[
{
"urls": [
"turn:visio.${MONDOMAINE}:1194",
"turn:visio.${MONDOMAINE}:1194?transport=tcp"
],
"username": "${TURN_USER}",
"credential": "${TURN_PWD}"
}
]Si vous êtes derrière une box Internet, ouvrez les ports du pare-feu et redirigez les vers votre serveur frontal (sur les mêmes ports) :
Dans le cas où Galène n’est pas le
seul service hébergé sur ${MONDOMAINE}, il est nécessaire
de définir un reverse proxy pour rediriger les requêtes de votre
sous-domaine
visio.${MONDOMAINE}
vers
https://${PRIVATE_IP}:8443
Pour le reverse proxy, on utilise ici NGINX.
Installer NGINX
# apt install nginxdémarrer le service
# systemctl start nginxpuis le rendre actif à chaque démarrage
# systemctl enable nginxAfin de sécuriser le protocole HTTP avec une couche de chiffrement SSL/TLS et garder privées les communications entre les utilisateurs et le serveur, on utilisera par défaut le HTTPS, en écoute du port TCP 443.
On se réfère aux recommandations de la fondation mozilla qui ne sont pas en contradiction avec celles de l’ANSSI. On utilise en particulier le générateur sur lequel on renseigne la version de NGINX, obtenue avec :
$ nginx -v
et celle de openssl
$ openssl version
Pour intégrer ces recommandations, il faut :
générer dhparam.pem nécessaire à la configuration
SSL avec NGINX
# openssl dhparam -out /etc/ssl/certs/dhparam.pem 4096éditer le fichier /etc/nginx/nginx.conf pour
TLSv1 et
TLSv1.1 sur la ligne ssl_protocols pour ne
garder que TLSv1.2 et TLSv1.3 ;ssl_prefer_server_ciphers pour
off;et donc avoir les lignes :
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;
ssl_dhparam /etc/ssl/certs/dhparam.pem;
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_stapling on;
ssl_stapling_verify on;relancer NGINX
# systemctl reload nginx
# service nginx restartOn se base sur les recommandations de l’ANSII et sur l’article pour durcir les réponses HTTP du serveur, notamment :
iframes ;Pour cela, éditer le fichier de configuration :
# vim /etc/nginx/nginx.conf
en ajoutant les lignes :
server{
...
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
add_header Permissions-Policy "accelerometer=(), camera=(), geolocation=(), gyroscope=(), magnetometer=(), microphone=(), payment=(), usb=()";
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Xss-Protection "1; mode=block" always;
add_header X-Content-Type-Options "nosniff" always;
add_header 'Referrer-Policy' 'origin';
...
}
puis relancer NGINX :
# service nginx restart
Vérifier ensuite votre configuration en faisant analyser votre site.
créer un fichier de configuration pour le service associé à Galène
# cat > /etc/nginx/conf.d/visio.conf << EOF
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
server {
listen 80;
server_name visio.${MONDOMAINE};
# Tell all requests to port 80 to be 302 redirected to HTTPS
return 302 https://$host$request_uri;
}
server {
listen 443;
ssl on;
server_name visio.${MONDOMAINE};
ssl_certificate /etc/letsencrypt/live/visio.${MONDOMAINE}/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/visio.${MONDOMAINE}/privkey.pem;
# Managing literal requests to the Galène front end
location / {
proxy_pass https://${PRIVATE_IP}:8443;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-NginX-Proxy true;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
}
# Managing requests to verify letsencrypt host
location ~ /.well-known {
allow all;
}
EOFActiver le pare-feu
# apt install ufw
# ufw enablepuis ouvrir les ports
# ufw allow ssh
# ufw allow 80/tcp
# ufw allow 443/tcp
# ufw allow 1194/tcp
# ufw allow 1194/udp
# ufw allow 8443/tcppuis vérifier
# ufw status
qui doit renvoyer
Status: active
To Action From
-- ------ ----
Nginx HTTP ALLOW Anywhere
Nginx HTTPS ALLOW Anywhere
22/tcp ALLOW Anywhere
1194 ALLOW Anywhere
8443/tcp ALLOW Anywhere
Nginx HTTP (v6) ALLOW Anywhere (v6)
Nginx HTTPS (v6) ALLOW Anywhere (v6)
22/tcp (v6) ALLOW Anywhere (v6)
1194 (v6) ALLOW Anywhere (v6)
8443/tcp (v6) ALLOW Anywhere (v6)arrêter le serveur nginx
# service nginx stopgénérer les certificats SSL
# apt install certbot
# certbot certonly --standalone -d visio.${MONDOMAINE}
qui va générer deux fichiers :
/etc/letsencrypt/live/visio.${MONDOMAINE}/fullchain.pem
/etc/letsencrypt/live/visio.${MONDOMAINE}/privkey.pem
puis générer dhparam.pem nécessaire à la configuration
SSL avec nginx
# openssl dhparam -out /etc/ssl/certs/dhparam.pem 4096relancer nginx
# systemctl reload nginx
# service nginx restartcopier et renommer les deux fichiers de certificat sur la VM dans
le répertoire /srv/galene/data/ :
# scp -O /etc/letsencrypt/live/visio.${MONDOMAINE}/fullchain.pem \
${USER}@${PRIVATE_IP}:/srv/galene/data/cert.pem
# scp -O /etc/letsencrypt/live/visio.${MONDOMAINE}/privkey.pem \
${USER}@${PRIVATE_IP}:/srv/galene/data/key.pemRelancer Galène
# ./galeneConnectez-vous de l’extérieur avec l’URL
https://visio.${MONDOMAINE}
vous devez maintenant avoir une connexion sécurisée.
Si cette étape échoue, alors il y a un problème de port forwarding. Il vous faut dans ce cas vérifier que vous ne vous êtes pas trompé, et que le port 1194 est bien accessible depuis l’extérieur.
Vérifiez que vous pouvez voir des vidéos entre deux clients externes, et entre un client interne et un client externe.
Regardez dans le log de Galène si le relay test côté serveur marche aussi ; si ce n’est pas le cas, il y a un problème de “hairpinning”…
Essayer de taper dans le chat
/relay-test
Galène doit vous dire que le test est réussi.
Pour définir un service qui permette de lancer Galène avec systemd dès le
lancement de la VM :
virsh start ${VISIO}
créer un utilisateur dédié au service
# useradd -U -m galene -d /srv/galenelui donner les permissions sur les certificats
# chown galene:galene /srv/galene/data/*.pem
# chmod go-rw /srv/galene/data/key.peméditer le fichier de service
# cat > /srv/galene/galene.service << EOF
[Unit]
Description=Galene
After=network.target
[Service]
Type=simple
User=galene
Group=galene
WorkingDirectory=/srv/galene
ExecStart=/srv/galene/galene
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
EOFfaire un lien symbolique vers systemd
# ln -s /srv/galene/galene.service /etc/systemd/system/.relancer le daemon
# systemctl daemon-reloadactiver puis démarrer le service
# systemctl enable galene.service
# systemctl start galene.service
et vérifier son statut avec
# systemctl status galene.servicePour mettre à jour Galène, par
exemple pour galene-0.7.2 du 09/07/2023, on peut procéder
de deux façons :
se placer dans le répertoire galene ;
# cd /srv/galene
# git checkout mastertélécharger la mise à jour
# git fetch -p https://github.com/jech/galene galene-0.7.2
# git checkout galene-0.7.2compiler
# CGO_ENABLED=0 go build -ldflags='-s -w'relancer le service
# systemctl restart galene.serviceou alors :
cloner le dépot :
# git clone -b galene-0.7.2 https://github.com/jech/galenecompiler Galène
# cd galene
# CGO_ENABLED=0 go build -ldflags='-s -w'copier les répertoires data et groups
de votre « ancienne » installation ;
copier galene.service puis recharger le deamon :
# systemctl daemon-reload
# systemctl enable galene.service
# systemctl start galene.service
et vérifier son statut avec
# systemctl status galene.serviceJe tiens à remercier chaleureusement Juliusz Chroboczek pour son aide précieuse et rudement efficace pour la configuration de mon serveur ainsi que Fabrice Rouillier pour son aide pour la mise en place d’un service IPv4 avec le serveur coTURN. Une bonne partie de cette documentation n’est qu’une remise en forme de leurs propos.