Icecast2 sur Debian avec support SSL
Sommaire
Voyons comment installer un serveur de streaming audio avec le logiciel Icecast2
, créer un certificat pour activer le chiffrement https
, et sécuriser le tout avec un pare-feu
.
Paramétrage du serveur
Nous prendrons une machine connectée en ipv4 à internet, possédant le nom de domaine stream.aerogus.net
, et installée avec l'OS Debian 10
(Buster). Nous ne détaillerons pas le paramétrage DNS
car il dépend de l'interface de votre bureau d'enregistrement ni l'installation de l'OS car la méthode dépend de votre hébergeur. Le prérequis est donc avoir un accès administrateur à la console.
Connectons nous en root
(ou en utilisateur dans les sudoers
, en préfixant les commandes par sudo
) .
Tout d'abord mettons à jour le serveur et redémarrons le :
1apt update
2apt full-upgrade
3reboot
Nommons le ensuite avec le bon nom de domaine :
1hostnamectl set-hostname stream.aerogus.net
La commande hostname
doit retourner le nouveau nom.
Installation de Icecast
Installons maintenant les programmes nécessaires au projet.
Icecast2 dans les dépôts officiels Debian n'est pas compilé avec le support ssl pour des problèmes de licence. En revanche xiph (l'organisation derrière Icecast) propose des paquets précompilés avec ce support, nous allons donc utiliser leurs dépôts pour installer Icecast.
1apt install gnupg
2sudo sh -c "echo deb http://download.opensuse.org/repositories/multimedia:/xiph/Debian_10/ ./ >>/etc/apt/sources.list.d/icecast.list"
3wget -qO - https://build.opensuse.org/projects/multimedia:libs/public_key | sudo apt-key add -
4apt update
La commande apt-cache policy
nous montre que le paquet icecast2
a la même priorité (500) dans les 2 dépôts, par défaut c'est donc le paquet des dépôts debian qui sera installé, ce qu'on voulait éviter...
1$ apt-cache policy icecast2
2icecast2:
3 Installed: (none)
4 Candidate: 2.4.4-1
5 Version table:
6 2.4.4-1 500
7 500 http://deb.debian.org/debian buster/main amd64 Packages
8 2.4.4-1 500
9 500 http://download.opensuse.org/repositories/multimedia:/xiph/Debian_10 ./ Packages
On va alors forcer l'utilisation du dépôt xiph par l'ajout du paramètre target-release (-t
) :
1apt install -t Debian_10 icecast2
Un assistant graphique s'affiche pour aider à la configuration de Icecast, répondez non, on va faire la configuration à la main.
Juste pour info, une méthode alternative par compilation des sources sans avoir besoin du dépôt xiph, installe l'exécutable dans /usr/local/bin/icecast
. fichiers de conf non gérés.
1apt install git gcc build-essential libcurl4-openssl-dev libxslt1-dev libxml2-dev libogg-dev libvorbis-dev libflac-dev libtheora-dev libssl-dev libspeex-dev
2wget https://downloads.xiph.org/releases/icecast/icecast-2.4.4.tar.gz
3tar fvxz icecast-2.4.4.tar.gz
4cd icecast-2.4.4
5./configure --with-curl --with-openssl
6# @TODO terminer la doc avec cette méthode !
Adaptez maintenant la configuration avec ce fichier minimaliste /etc/icecast2/icecast.xml
:
1<icecast>
2 <location>Paris</location>
3 <admin>contact@stream.aerogus.net</admin>
4 <limits>
5 <clients>10</clients>
6 <sources>2</sources>
7 <queue-size>524288</queue-size>
8 <client-timeout>30</client-timeout>
9 <header-timeout>15</header-timeout>
10 <source-timeout>10</source-timeout>
11 <burst-on-connect>1</burst-on-connect>
12 <burst-size>65535</burst-size>
13 </limits>
14
15 <authentication>
16 <source-password>sourcePwd</source-password>
17 <relay-password>replayPwd</relay-password>
18 <admin-user>admin</admin-user>
19 <admin-password>adminPwd</admin-password>
20 </authentication>
21
22 <hostname>stream.aerogus.net</hostname>
23
24 <listen-socket>
25 <port>80</port>
26 </listen-socket>
27
28 <!--
29 <listen-socket>
30 <port>443</port>
31 <ssl>1</ssl>
32 </listen-socket>
33 -->
34
35 <http-headers>
36 <header name="Access-Control-Allow-Origin" value="*" />
37 </http-headers>
38
39 <fileserve>1</fileserve>
40
41 <mount type="default">
42 <charset>UTF-8</charset>
43 </mount>
44
45 <paths>
46 <basedir>/usr/share/icecast2</basedir>
47 <logdir>/var/log/icecast2</logdir>
48 <webroot>/usr/share/icecast2/web</webroot>
49 <adminroot>/usr/share/icecast2/admin</adminroot>
50 <alias source="/" destination="/status.xsl"/>
51 <!--
52 <ssl-certificate>/etc/icecast2/bundle.pem</ssl-certificate>
53 -->
54 </paths>
55
56 <logging>
57 <accesslog>access.log</accesslog>
58 <errorlog>error.log</errorlog>
59 <loglevel>4</loglevel>
60 <logsize>10000</logsize>
61 </logging>
62
63 <security>
64 <chroot>0</chroot>
65 <changeowner>
66 <user>icecast2</user>
67 <group>icecast</group>
68 </changeowner>
69 </security>
70</icecast>
J'ai mis volontairement en commentaires certaines sections relatives à https car nous allons voir ça dans un second temps.
Adaptez aussi le fichier /etc/defaults/icecast2
1# Full path to the server configuration file
2CONFIGFILE="/etc/icecast2/icecast.xml"
3
4# modif pour autoriser icecast sur les ports 80/443
5USERID=root
6GROUPID=root
7
8ENABLE="true"
Configurons le serveur pour que Icecast se lance au démarrage :
1systemctl enable icecast2
Et lançons le tout de suite
1systemctl start icecast2
Test du flux
Vous devriez accéder à la page suivante avec votre navigateur http://stream.aerogus.net
Pour tester notre installation, alimentons le serveur avec une source sonore générée par ffmpeg
.
1apt install ffmpeg
La source sera un générateur sonore mono (une sinusoïde à 440Hz) directement sur le serveur, encodée en mp3.
1ffmpeg -f lavfi -i "sine=frequency=440" \
2 -c:a libmp3lame -ab 128k -ac 1 -ar 48000 \
3 -content_type audio/mpeg \
4 -f mp3 icecast://source:sourcePwd@stream.aerogus.net:80/test.mp3
Exemple plus concrêt où la source est issue d'une machine cliente sous MacOS
, en stéréo, les entrées 1 & 2 du périphérique audio "1" sont utilisées, et l'encodage est en mp3.
1ffmpeg -f avfoundation -i ":1" -re
2 -c:a libmp3lame -ab 128k -ac 2 -ar 44100
3 -content_type audio/mpeg
4 -f mp3 icecast://source:sourcePwd@stream.aerogus.net:80/test.mp3
Et pour le lire avec votre lecteur multimédia
1vlc http://stream.aerogus.net/test.mp3
Génération du certificat TLS
Maintenant générons le certificat tls/ssl qui va permettre un transport chiffré du flux (via https). Let's Encrypt est une autorité de certification à but non lucratif qui délivre gratuitement des certificats. Le client de gestion des certificats s'appelle certbot
.
1apt install certbot
Demandons la génération du certificat pour notre domaine
1certbot certonly --webroot-path="/usr/share/icecast2/web" -d 'stream.aerogus.net'
Aux questions posées répondez :
- 2: Place files in webroot directory (webroot)
- votre email (permet de recevoir une notification à l'approche de l'expiration)
- (A)gree vous acceptez les termes du services
- Y/N vous acceptez de partager (ou pas) votre email avec l'organisme
En cas de succès de la génération vous devriez avoir l'affichage suivant :
1 - Congratulations! Your certificate and chain have been saved at:
2 /etc/letsencrypt/live/stream.aerogus.net/fullchain.pem
3 Your key file has been saved at:
4 /etc/letsencrypt/live/stream.aerogus.net/privkey.pem
5 Your cert will expire on 2021-10-12. To obtain a new or tweaked
6 version of this certificate in the future, simply run certbot
7 again. To non-interactively renew *all* of your certificates, run
8 "certbot renew"
Un certificat Let's Encrypt a une durée de vie de 90 jours. Après quoi il expire et vous devez le renouveler (toujours gratuitement). Pour gérer celà automatiquement, une tâche planifiée a été créée à /etc/cron.d/certbot
, elle s'exécute chaque nuit et permet le renouvellement des certificats de votre serveur qui arrivent à expiration.
Icecast attend un format de fichier combiné, comprenant à la fois le certificat et notre clé privée. On peut automatiser la génération de ce fichier à chaque renouvellement du certificat. Dans le fichier /etc/letsencrypt/renewal/stream.aerogus.net.conf
, cherchez la section [renewalparams]
et ajoutez :
1post_hook = cat /etc/letsencrypt/live/stream.aerogus.net/fullchain.pem /etc/letsencrypt/live/stream.aerogus.net/privkey.pem > /etc/icecast2/bundle.pem && systemctl restart icecast2
Faisons une simulation de regénération du certificat (permettra l'exécution du script post hook)
1certbot renew --dry-run
Activons le port 443
et utilisons ce certificat bundle.pem
en décommentant les 2 blocs suivants :
1 <listen-socket>
2 <port>443</port>
3 <ssl>1</ssl>
4 </listen-socket>
5
6
7 <ssl-certificate>/etc/icecast2/bundle.pem</ssl-certificate>
Finalement relancez le service
1systemctl restart icecast2
Test du flux sécurisé
Enfin vérifiez votre installation en allant sur le port 443 https://stream.aerogus.net et constatez que le cadenas est bien présent.
Le flux audio est maintenant disponible à ces 2 urls :
Depuis ffmpeg
4.4, une option -tls 1
a été ajoutée ce qui permet d'alimenter le serveur de façon sécurisée :
1ffmpeg -f lavfi -i "sine=frequency=440" \
2 -c:a libmp3lame -ab 128k -ac 1 -ar 48000 \
3 -content_type audio/mpeg -tls 1 -f mp3 icecast://source:sourcePwd@stream.aerogus.net:443/test.mp3
Sécurisation avec le pare-feu
cf. l'exemple Icecast dans l'article sur le pare-feu avec iptables