Installation, configuration et monitoring d’un serveur mumble sous debian 10
Mise à jour le 28/03/2020 -
Dans ce tuto, on supposera que :
- On dispose d’un serveur avec accès root, en debian 10.
- Le point d’entrée du serveur (un site web, peut-être juste une page html) est : https://audio.exemple.com
- L’application web de connexion au serveur mumble est : https://blabla.exemple.com
- Le serveur web apache2 ou nginx (v. 1.14 au moins) est installé
Installation du serveur Mumble : murmur (murmurd)
Le serveur mumble est disponible sous la forme d’un paquet pour Debian.
Sous la version de Debian 10, c’est Mumble 1.3 qui est disponible, soit la dernière version disponible mi 2019.
apt-get install mumble-server
dpkg-reconfigure mumble-server
1/ Activer le lancement du processus murmurd
au lancement du système :
Sélectionner "Yes" puis valider.
2/ Placer le processus murmurd en priorité haute, de sorte à réduire la latence, ce qui améliore la qualité audio :
Sélectionner "Yes" puis valider.
3/ Saisir un mot de passe pour l’utilisateur SuperUser puis valider. La ligne de commande renvoie la confirmation de modification du mot de passe.
On peut vérifier par la commande suivante que le port 64738 est en écoute sur le serveur :
# ss -apn | grep 64738 | grep LISTEN
tcp LISTEN 0 50 *:64738 *:* users:(("murmurd",pid=10349,fd=12))
Si c’est le cas, on doit trouver le mot clef LISTEN devant le numéro de port concerné comme ci-dessus.
Pour changer ultérieurement si besoin le mot de passe de l’utilisateur SuperUser, la commande est :
murmurd -supw <nouveau_mot_de_passe>
A noter que lorsqu’on se connecte via ce compte Superuser, c’est uniquement pour administrer le service car il n’est possible ni de parler ni d’écouter.
4/Compléments pour personnaliser.
La configuration de mumble-server est dans /etc/mumble-server.ini
C’est ici par exemple que se modifie le nom du salon d’entrée par défaut (Root) par la variable ’registerName’
Installer le certificat serveur
Il est important de remplacer le certificat de base autosigné par un certificat authentifié par une vraie autorité de certification. Le plus simple et le plus économique est d’utiliser les certificats letsencrypt.
Installer le logiciel dehydrated :
Ce qui suit est directement inspiré de https://technique.arscenic.org/ssl-securisation-des-communications-serveur-client/article/installer-et-configurer-un-certificat-let-s-encrypt#installer-et-configurer-dehydrated
On installe les dépendances, puis on va chercher le logiciel :
apt install git curl
cd /etc
git clone https://github.com/lukas2511/dehydrated letsencrypt
cd letsencrypt
On crée le répertoire dont le logiciel a besoin pour ses "challenges" [1]
cd /etc/letsencrypt
mkdir .acme-challenges
# echo 'ça marche !!!!' > .acme-challenges/test.txt
# chown -R www-data:www-data .acme-challenges
On crée un fichier de configuration minimal pour letsencrypt :
cat >/etc/letsencrypt/config << FIN
CONTACT_EMAIL=un-adresse-mail@exemple.fr
WELLKNOWN="${BASEDIR}/.acme-challenges"
FIN
Version avec apache2 : Configurer apache
# cd /etc/apache2/conf-available/
# nano letsencrypt.conf
# /etc/apache2/conf-available/letsencrypt.conf
Alias /.well-known/acme-challenge /etc/letsencrypt/.acme-challenges
<Directory /etc/letsencrypt/.acme-challenges>
Options None
AllowOverride None
Require all granted
</Directory>
# a2enconf letsencrypt
# systemctl reload apache2
Version avec nginx : Configurer nginx
IMPORTANT - Vous aurez besoin de définir plusieurs virtual hosts pour exécuter toute cette installation. Il vous faudra donc introduire ces quelques lignes dans tous les fichiers de configuration de votrs vhosts.
# cd /etc/ngcinx/sites-available/
# nano audio.exemple.com
...
# pour dehydrated
location /.well-known/acme-challenge {
alias /etc/letsencrypt/.acme-challenges;
}
systemctl reload nginx
Tester la configuration du serveur web :
Pointez votre navigateur sur http://audio.exemple.com/.well-known/acme-challenge/test.txt, il doit vous répondre : ça marche !!!
Générer les certificats de letsencrypt :
On dit à dehydrated le nom du ou des domaines à certifier
# cd /etc/letsencrypt
# nano domains.txt
audio.example.com
Ca y est, on peut générer le certificat !
./dehydrated --register --accept-terms
./dehydrated -c
Le certificat se trouve dans /etc/letsencrypt/certs/audio.exemple.com
, deux fichiers sont importants : fullchain.pem
(la chaîne de certification complète) privkey.pem
(la clé privée)
TODO - Un cron pour que la commande dehydrated -c
soit exécutée tous les jours, afin de renouveler les certificats qui en ont besoin.
Installer le certificat pour utilisation par murmurd :
# cd /etc
# mkdir mumble-ssl
# cd mumble-ssl
# cat /etc/letsencrypt/certs/audio.exemple.com/fullchain.pem > fullchain.pem
# cat /etc/letsencrypt/certs/audio.exemple.com/privkey.pem > privkey.pem
# chmod go= *.pem
# chown mumble-server *.pem
# cd /etc
# nano +215 mumble-server.ini
sslCert=/etc/mumble-ssl/fullchain.pem
sslKey=/etc/mumble-ssl/privkey.pem
# systemctl stop mumble-server
# systemctl start mumble-server
Installer l’interface web
Le code de mumble-web et le readme pour l’installation se trouvent ici :
https://github.com/Johni0702/mumble-web
Installer npm
apt install npm
Cela installe une grand quantité de dépendances j’espère que vous avez de la place sur le disque...
Installer mumble-web
npm install -g mumble-web
Installer websockify
apt install websockify
Démarrer websockify
websockify --ssl-target 64737 <mumbleserver>:64738
TODO - Démarrer et arrêter websockify avec systemd !
Patcher mumble-web
Il faut ajouter une ligne dans un fichier .js afin de pouvoir utiliser les "tokens" avec l’interface web (possibilité de rejoindre une conférence).
Fichier /usr/local/lib/node_modules/mumble-web/dist/index.js
Ligne 535 (environ)
Séquence avant :
// TODO: token
_this5.connector.connect('wss://' + host + ':' + port, {
username: username,
password: password
}).done(function (client) {
log('Connected!');
Séquence après
// TODO: token
_this5.connector.connect('wss://' + host + ':' + port, {
username: username,
password: password,
tokens: token.split(",") // correction by manu see github
}).done(function (client) {
log('Connected!');
Générer le certificat pour blabla.exemple.com
Écrire (sur une seule ligne) blabla.exemple.com
dans le fichiers /etc/letsencrypt/domains.txt
et tapez la commande :
cd /etc/letsencrypt;
dehydrated -c
Version apache : Configurer apache en mode proxy
<VirtualHost blabla.le-pic.org:443>
ServerName exemple.com
ProxyPreserveHost On
ProxyRequests off
ProxyPass /.wellknown !
ProxyVia On
RewriteEngine On
RewriteCond %{HTTP:Connection} Upgrade [NC]
RewriteCond %{HTTP:Upgrade} websocket [NC]
# change the port to your websockify port
RewriteRule /blabla ws://127.0.0.1:64737 [P,L]
# change the ports below to your mumble-web host or serve it directly
#ProxyPass / http://127.0.0.1:1235/
#ProxyPassReverse / http://127.0.0.1:1235
SSLEngine on
SSLCertificateFile /etc/letsencrypt/certs/blabla.exemple.com/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/certs/blabla.exemple.com/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/certs/blabla.exemple.co/fullchain.pem
DocumentRoot /usr/local/lib/node_modules/mumble-web/dist
<Location / >
require all granted
</Location>
ErrorLog ${APACHE_LOG_DIR}/mumble-web-error.log
CustomLog ${APACHE_LOG_DIR}/mumble-web-access.log combined
</VirtualHost>
Version nginx : Configurer nginx en mode proxy
cd /etc/nginx/sites-available
nano blabla.exemple.com
server {
server_name blabla.exemple.com;
listen 80 ;
listen [::]:80 ;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name blabla.exemple.com;
ssl_certificate /etc/letsencrypt/certs/blabla.exemple.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/certs/blabla.exemple.com/privkey.pem;
# pour dehydrated
location /.well-known/acme-challenge {
alias /etc/letsencrypt/.acme-challenges;
}
location / {
root /usr/local/lib/node_modules/mumble-web/dist;
}
location /blabla {
proxy_pass http://localhost:64737;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
}
}
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
* Ne pas oublier d’ajouter la ligne listen [: :]:443 ssl ; pour écouter en ipv6.
Complément de personnalisation
Il est possible de personnaliser l’affichage de mumble-web :
- pour personnaliser une configuration par défaut (mode Appuyer pour parler, champ à afficher sur la fenêtre de connexion ....) c’est dans /usr/local/lib/node_modules/mumble-web/dist/config.local.js
- pour franciser les différents champs et menus, ou changer le message Indications dans la partie centrale de la colonne de gauche c’est dans /usr/local/lib/node_modules/mumble-web/dist/index.html
- pour modifier les deux premières lignes de la partie haute de cette même colonne de gauche c’est dans /usr/local/lib/node_modules/mumble-web/dist/index.js
- le Message de bienvenue sur la troisième ligne de cette colonne de gauche se modifie lui dans /etc/mumble-server.ini
[1] Les challenges sont des actions que le serveur de letsencrypt va accomplir sur le domaine qui a demandé un certificat. Si le challenge est réussi, cela veut dire que l’on a la certitude que la personne qui a lancé la commande maîtrise bien le domaine (donc que ce n’est pas un pirate), et on peut dès lors lui délivrer un =certificat.