Icecast2 sur Debian avec support SSL

Table des matières

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 :

apt update
apt full-upgrade
reboot

Nommons le ensuite avec le bon nom de domaine :

hostnamectl 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.

apt install gnupg
sudo sh -c "echo deb http://download.opensuse.org/repositories/multimedia:/xiph/Debian_10/ ./ >>/etc/apt/sources.list.d/icecast.list"
wget -qO - https://build.opensuse.org/projects/multimedia:libs/public_key | sudo apt-key add -
apt 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…

$ apt-cache policy icecast2
icecast2:
  Installed: (none)
  Candidate: 2.4.4-1
  Version table:
     2.4.4-1 500
        500 http://deb.debian.org/debian buster/main amd64 Packages
     2.4.4-1 500
        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) :

apt 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.

apt install git gcc build-essential libcurl4-openssl-dev libxslt1-dev libxml2-dev libogg-dev libvorbis-dev libflac-dev libtheora-dev libssl-dev libspeex-dev 
wget https://downloads.xiph.org/releases/icecast/icecast-2.4.4.tar.gz
tar fvxz icecast-2.4.4.tar.gz
cd icecast-2.4.4
./configure --with-curl --with-openssl
# @TODO terminer la doc avec cette méthode !

Adaptez maintenant la configuration avec ce fichier minimaliste /etc/icecast2/icecast.xml :

<icecast>
    <location>Paris</location>
    <admin>contact@stream.aerogus.net</admin>
    <limits>
        <clients>10</clients>
        <sources>2</sources>
        <queue-size>524288</queue-size>
        <client-timeout>30</client-timeout>
        <header-timeout>15</header-timeout>
        <source-timeout>10</source-timeout>
        <burst-on-connect>1</burst-on-connect>
        <burst-size>65535</burst-size>
    </limits>

    <authentication>
        <source-password>sourcePwd</source-password>
        <relay-password>replayPwd</relay-password>
        <admin-user>admin</admin-user>
        <admin-password>adminPwd</admin-password>
    </authentication>

    <hostname>stream.aerogus.net</hostname>

    <listen-socket>
        <port>80</port>
    </listen-socket>

    <!--
    <listen-socket>
        <port>443</port>
        <ssl>1</ssl>
    </listen-socket>
    -->

    <http-headers>
        <header name="Access-Control-Allow-Origin" value="*" />
    </http-headers>

    <fileserve>1</fileserve>

    <paths>
        <basedir>/usr/share/icecast2</basedir>
        <logdir>/var/log/icecast2</logdir>
        <webroot>/usr/share/icecast2/web</webroot>
        <adminroot>/usr/share/icecast2/admin</adminroot>
        <alias source="/" destination="/status.xsl"/>
        <!--
        <ssl-certificate>/etc/icecast2/bundle.pem</ssl-certificate>
        -->
    </paths>

    <logging>
        <accesslog>access.log</accesslog>
        <errorlog>error.log</errorlog>
        <loglevel>4</loglevel>
        <logsize>10000</logsize>
    </logging>

    <security>
        <chroot>0</chroot>
        <changeowner>
            <user>icecast2</user>
            <group>icecast</group>
        </changeowner>
    </security>
</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

# Full path to the server configuration file
CONFIGFILE="/etc/icecast2/icecast.xml"

# modif pour autoriser icecast sur les ports 80/443
USERID=root
GROUPID=root

ENABLE="true"

Configurons le serveur pour que Icecast se lance au démarrage :

systemctl enable icecast2

Et lançons le tout de suite

systemctl start icecast2

Test du flux

Vous devriez accéder à la page suivante avec votre navigateur http://stream.aerogus.net

Icecast2 page d’accueil

Pour tester notre installation, alimentons le serveur avec une source sonore générée par ffmpeg.

apt install ffmpeg

La source sera un générateur sonore mono (une sinusoïde à 440Hz) directement sur le serveur, encodée en mp3.

ffmpeg -f lavfi -i "sine=frequency=440" \
  -c:a libmp3lame -ab 128k -ac 1 -ar 48000 \
  -content_type audio/mpeg \
  -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.

ffmpeg -f avfoundation -i ":1" -re
  -c:a libmp3lame -ab 128k -ac 2 -ar 44100
  -content_type audio/mpeg
  -f mp3 icecast://source:sourcePwd@stream.aerogus.net:80/test.mp3

Et pour le lire avec votre lecteur multimédia

vlc 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.

apt install certbot 

Demandons la génération du certificat pour notre domaine

certbot 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 :

 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/stream.aerogus.net/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/stream.aerogus.net/privkey.pem
   Your cert will expire on 2021-10-12. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot
   again. To non-interactively renew *all* of your certificates, run
   "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 :

post_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)

certbot renew --dry-run

Activons le port 443 et utilisons ce certificat bundle.pem en décommentant les 2 blocs suivants :

    <listen-socket>
        <port>443</port>
        <ssl>1</ssl>
    </listen-socket>


        <ssl-certificate>/etc/icecast2/bundle.pem</ssl-certificate>

Finalement relancez le service

systemctl 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’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 :

ffmpeg -f lavfi -i "sine=frequency=440" \
  -c:a libmp3lame -ab 128k -ac 1 -ar 48000 \
  -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