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

Icecast2 page d&#39;accueil

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.

Icecast2 page d&#39;accueil

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

Ressources:

comments powered by Disqus