(Sub)sonic chiffré

(Sub)sonic chiffré

Il y a de cela 2 ans et demi, je vous parlais de Subsonic, un mediastreamer qui n'a jamais été considéré comme un logiciel libre et qui n'est plus opensource mais qu'il est cool quand même (j'en cause en fin d'article).

Il y a plus d'un an, avec l’avènement de Let's Encrypt et des certificats TLS authentifiés gratuits, j'ai fait en sorte de chiffrer l'ensemble de mes sites, hiob.fr déjà mais aussi et surtout ceux de nefald.fr pour lesquels il était difficile de les chiffrer, sans avoir de certificats authentifiés au risque de perdre des visiteurs.

Qu'à cela tienne, courant novembre 2015 (j'étais bêta-testeur), j'ai chiffré tout ça proprement en TLS. Seul mon subsonic n'était pas entièrement chiffré, seule son reverse proxy (via Nginx donc) l'était. Je n'avais jamais pris le temps de me re-pencher là-dessus depuis, mais subitement hier l'envie m'a prit de le faire.

En effet sans indiquer à Subsonic de bien vouloir chiffrer son contenu, une partie de celui-ci (ce qui ne passait pas par Nginx) ne l'était et de fait le navigateur bloquait ce contenu. C'est moyen joli. Je n’avais jusqu'alors pas pris la peine de le faire, étant le seul utilisateur de la chose et pouvant bypasser le problème en acceptant le contenu HTTP tout bonnement.

Ce tutoriel est réalisé sur Debian 8 avec Nginx 1.8.1 et Subsonic 6.0.

Installation et configuration

Vu qu'on n'est pas des cochons, on va utiliser un proxy_pass afin de faire passer tout ça par un sous-domaine. Des pros j'vous dis.
On part bien évidemment du principe que vous avez déjà Nginx d'installé ainsi que Subsonic (c'est pas le plus compliqué).

Prérequis

On commence par installer le certbot de Let's Encrypt, qui nous permettra de créer nos certificats.

$ sudo apt-get install certbot -t jessie-backports

Voilà, ça devrait être installé, mettez ça de côté et intéressons-nous maintenant à Nginx.
On part bien évidemment du principe que vous avez déjà Nginx d'installé ainsi que Subsonic (c'est pas le plus compliqué).

Nginx

Nous allons commencer par configurer Nginx avant de générer les certificats, car il va nous falloir indiquer à Cerbot le webroot qui permettra d'authentifier le nom de domaine.

  • On a notre sous-domaine, subsonic.domaine.ext

  • On choisit d'utiliser le port 4443 pour mettre en place le proxy, qui nous permettra d'accéder à subsonic directement sur le sous-domaine sans indiquer le port dans l'url.

  • Vous pouvez placer le webroot où vous le souhaitez seulement le répertoire doit être accessible depuis l'extérieur, afin que Let's Encrypt puisse authentifier le domaine. Par exemple /var/www/letsencrypt/domaine/

  • Vos futurs certificats se trouveront dans /etc/letsencrypt/live/domaine.ext/, il faut l'indiquer dans Nginx.

  • 1 - Commencez par créer un fichier de configuration Nginx pour Subsonic

sudo nano /etc/nginx/sites-available/subsonic
  • 2 - Et collez-y ce qui suit en adaptant selon vos besoins. Et on sauvegarde.
upstream subsonic {
      server localhost:4443;

}

server {

      listen 80;
      server_name subsonic.domaine.ext;
      return 301 https://$host$request_uri;

}

server {

     listen 443;
     server_name subsonic.domaine.ext;

     ssl on;
     ssl_certificate /etc/letsencrypt/live/subsonic.domaine.ext/fullchain.pem;
     ssl_certificate_key /etc/letsencrypt/live/subsonic.domaine.ext/privkey.pem;



location '/.well-known/acme-challenge' {

    root /var/www/letsencrypt/subsonic.domaine.ext/;
    try_files $uri /$1;

        }    



location / {

    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_redirect off;
    proxy_set_header Host $http_host;
    proxy_pass https://subsonic;

    }

}
  • 3 - On créé un lien symbolique afin d'activer la configuration:
sudo ln -s /etc/nginx/sites-available/subsonic /etc/nginx/sites-enabled/subsonic

Si vous n'aviez pas déjà de configuration pour le SSL/TLS sur Nginx, il va falloir en créer une. Soit vous l'intégrer directement à la configuration Nginx de Subsonic, soit vous en créez une pour l'ensemble de Nginx. C'est préférable, ça vous évitera de devoir la mettre pour chacun de vos sites chiffrés.

  • 4 - Pour ce faire, ouvrez le fichier de paramètres généraux de Nginx:
sudo nano /etc/nginx/ssl/params.conf
  • 5 - Et collez-y ce qui suit:
ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256';  
ssl_prefer_server_ciphers on;  
ssl_protocols TLSv1.2;

ssl_session_cache shared:SSL:10m;  
ssl_session_timeout 5m;  
ssl_ecdh_curve secp384r1;

add_header Strict-Transport-Security "max-age=31536000";  
add_header X-Frame-Options SAMEORIGIN;  
add_header X-Content-Type-Options nosniff;  
add_header X-XSS-Protection "1; mode=block";  
add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://ssl.google-analytics.com https://assets.zendesk.com https://connect.facebook.net; img-src 'self' https://ssl.google-analytics.com https://s-static.ak.facebook.com https://assets.zendesk.com; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com https://assets.zendesk.com; font-src 'self' https://themes.googleusercontent.com; frame-src https://assets.zendesk.com https://www.facebook.com https://s-static.ak.facebook.com https://tautt.zendesk.com; object-src 'none'";  
add_header Strict-Transport-Security "max-age=31536000; includeSubdomains;";  

Plus d'infos: https://mozilla.github.io/server-side-tls/ssl-config-generator/

  • 6 - On sauvegarde et on relance Nginx:
sudo service nginx restart

Passons à la suite !

Let's Encrypt

Il s'agit maintenant de créer le(s) certificat(s).
De préférence créez un certificat par domaine/sous-domaine afin que dans le certificat obtenu, n’apparaisse que le domaine concerné, ne mettez pas par exemple sous le même certificat votre domaine de second niveau domaine.ext, et votre sous-domaine pour subsonic subsonic.domaine.ext; il s'agit d'un service privé, nul besoin d'afficher aux yeux de tous que ce sous-domaine existe dans le certificat de votre domaine de second niveau.

  • 1.a - Il suffit de taper:
sudo certbot certonly

Puis de suivre les instructions, il vous faudra indiquer le(s) domaine(s) et le webroot. Celui-ci se situera de préférence sur le répertoire par défaut de votre serveur web, accessible depuis l'extérieur. Par exemple /var/www/letsencrypt/.

  • 1.b - Si vous préférez utiliser une seule commande, tapez:
sudo certbot certonly --webroot -w /var/www/letsencrypt/subsonic.domaine.ext -d subsonic.domaine.ext

Comme vous pouvez le voir, vous devez indiquer directement le webroot et le(s) sous-domaine(s).

  • 2 - Depuis la mise en place de certbot, il n'est plus nécessaire de renouveler soi même ses certificats tous les 3 mois, cerbot le fera pour vous. Cependant vous pouvez vérifier si il y a des certificats à renouveler, en simulant un renouvellement avec la commande suivante:
sudo certbot renew --dry-run

Subsonic

Il suffit maintenant d'indiquer à Subsonic qu'on souhaite qu'il écoute sur le port 4443 et que la connexion soit chiffrée.

  • 1 - On commence par arrêter Subsonic si ce n'est pas déjà le cas:
sudo service subsonic stop
  • 2 - On édite le fichier de configuration de subsonic:
sudo nano /etc/default/subsonic
  • 3 - Et on y ajoute/adapte l'argument suivant, en lieu et place de --port=4040:
SUBSONIC_ARGS="--https-port=4443"

Dans son ensemble, votre fichier de configuration devrait ressembler à ça:

#
# This is the configuration file for the Subsonic service
# (/etc/init.d/subsonic)
#
# To change the startup parameters of Subsonic, modify
# the SUBSONIC_ARGS variable below.
#
# Type "subsonic --help" on the command line to read an
# explanation of the different options.
#
# For example, to specify that Subsonic should use port 80 (for http)
# and 443 (for https), and use a Java memory heap size of 200 MB, use
# the following:
#
SUBSONIC_ARGS="--https-port=4443 --max-memory=250"

# The user which should run the Subsonic process. Default "root".
# Note that non-root users are by default not allowed to use ports
# below 1024. Also make sure to grant the user write permissions in
# the music directories, otherwise changing album art and tags will fail.

SUBSONIC_USER=subsonic
  • 4 - Une fois sauvegardé, on redémarre:
sudo service subsonic start

Vous pouvez au passage augmenter la mémoire max et l'utilisateur (mieux vaut pas que ça soit root).
Il ne vous reste plus qu'à vous rendre à l'adresse, dans notre exemple il s'agit de https://subsonic.domaine.ext

Subsonic devient ClosedSource

Je profite de cet article sur Subsonic, pour vous parler d'une petite chose qui me turlupine depuis quelques mois.

En avril dernier Sindre, le développeur de Subsonic, a décidé de ne plus publier le code source de Subsonic (à partir de la version 6.0), la principale raison a cela est qu'il a acheté des licences propriétaires pour des logiciels (notamment vidéo) qu'il a inclut dans son code, de fait il n'a pas le droit de distribuer le code propriétaire au risque qu'il se retrouve dans les forks.

Cette décision a rebuté de nombreux utilisateurs du projet, les amenant à tourner le dos à Subsonic pour regarder de plus près ses forks et alternatives, tels Madsonic, Libresonic ou Supersonic. De même j'ai reconsidéré mon attachement et mon soutien au projet, quand bien même je sois premium. Seulement après avoir essayé plusieurs d'entre eux, j'utilise encore Subsonic et ai renouvelé ma "licence annuelle". Il est léger mais tout de même très configurable, ce que j'attends d'un tel logiciel et ce que je n'ai pas trouvé pour le moment ailleurs.

C'est une chose assez difficile à accepter, notamment en ce qui concerne son recours à du code propriétaire ce qui pourrait être éventuellement contournable avec des alternatives libres. En ce qui concerne la licence GPL 3.0, il a créé un Git dédié aux version antérieures de Subsonic.
Il a en quelques sortes forked son propre projet en faisant de cette nouvelle branche fermée, son projet principal. Ce produit dérivé donc n'a plus son code source libre, rompant avec la GPL et de sa condition de distribution baptisée copyleft, interdisant de redistribuer un dérivé du logiciel originel placé sous GPL 3.0, sans distribuer librement le code source du dit dérivé. Cependant, Sindre étant lui-même l'auteur du code originel, il ne risque pas d'être poursuivi... par lui-même.

il explique ainsi sa vision de la chose:

Subsonic has never been a typical open-source project. For all practical purposes I have been the sole contributor and committer. I always intended it to be a one-man project. From time to time people have kindly offered to contribute, but I have respectfully declined (because I prefer writing code rather than reviewing it). As a consequence I am in my full
right to change the license as I see fit.

Subsonic is clearly a commercial undertaking and has been for many years. I established a company (Subsonic AS) in 2010 with which I try to make a living. The source code is the only asset of this company, and it is problematic when the exact same code (minus the need for a paid license key) is made available by others. I've also registered that some forks of Subsonic are (or at least plan to) sell their own licenses. It has also been confusing for many users that they have to pay for an open-source product.

En gros il a toujours été le principal développeur de Subsonic et a toujours envisagé le projet comme une entreprise commerciale avec laquelle il pourrait vivre, bien que Subsonic soit gratuit. Seule existe une licence payante offrant quelques avantages (le stream sur mobile entre autre) mais qui surtout pour l'heure, a comme objectif de soutenir le projet ni plus ni moins. Moi, comme probablement beaucoup d'autres, si je me suis tourné vers Subsonic et si j'ai été prêt à payer la licence (12€/an, c'est plus que modique) c'est surtout pour soutenir le projet Open Source et le développeur derrière qui donne de son temps depuis 11 ans déjà.

Cette annonce m'a refroidi, pourquoi continuerai-je à soutenir un projet auquel éthiquement je n'adhère plus? La question est très difficile. Mais quoiqu'il en soit, le boulot reste là, Sindre depuis tant d'années développe et release son projet gratuitement, comment oser lui jeter la pierre pour ce revirement?

Alternatives

Il existe en particulier une alternative à Subsonic à laquelle j’accroche, toujours sous licence GPL 3.0 et OpenSource, la bien nommé Libresonic, forked avant l'annonce de ClosedSource, ce projet est devenu totalement indépendant après celle-ci. Cependant toutes les fonctionnalités premium qui existe sur Subosnic, ne le sont pas sur Libresonic. De plus il n'existe aucun dépôts officiels ou packages, pour l'installer il vous faudra le compiler pour votre système, ce qui en rebutera nécessairement plus d'un. Pour l'heure il n'existe que le support officiel en WAR pour Tomcat.