Certificat HTTPs pour duplicati

Même si duplicati ne permet pas d’authentification à proprement dit sur son interface, il est tout de même possible d’en protéger l’accès par un mot de passe. Mais comme l’accès à celle-ci se fait en http, dans l’absolu, n’importe quelle personne qui écoute sur le réseau pourrait le connaître.

Lorsque l’on installe un service ayant une interface web, le réflexe à avoir est le suivant :

Installer des certificats signés par une CA pour sécuriser la connexion en HTTPS.

Réflexe des arsouyes

C’est peut être too much dans notre cas vu que nous n’avons que 4 utilisateurs dans le SI, dont deux connaissent le mot de passe et deux sont trop jeunes pour sniffer le réseau… Mais comme dans toutes les situations, les choses changent... Sans voir le temps passer, l’ainée aura 16 ans et s’amusera (peut être) avec le réseau (à moins qu’elle l’ait déjà fait bien avant).

Ajouter une protection. MatteoPhotoPro2020 @Pixabay
Ajouter une protection. MatteoPhotoPro2020 @Pixabay

Pour passer l’interface en HTTPS, on va passer par un reverse proxy. Pour cela, on va tout d’abord devoir déployer notre certificat et notre clef. Puis installer apache et s'en servir pour l'accès en HTTPS.

On a un problème

Pour utiliser SSL avec duplicati, d'après la documentation officielle, il faut lancer le serveur avec l'option --webservice-sslcertificatefile=, suivit du chemin vers un certificat au format PKCS12.

Dans l'idée, c'est donc très facile de passer votre interface en HTTPs. Sauf que les choses ne sont jamais aussi simple. Si vous essayez sous Linux, cela ne marchera pas.

En investiguant le problème, on se rends compte que duplicati est codé en .NET. Et que sous Linux, .Net est géré par Mono qui est une implémentation OpenSource de la machine virtuelle .NET. Mono a des problèmes (cf ici ou encore ) avec la gestion des certificats au format PKCS12.

On ne peut donc pas utiliser cette option de configuration, et on doit contourner le problème en installant un apache devant duplicati.

Préparer duplicati

Si vous avez suivi notre article sur l'installation de duplicati, vous avez surement changé le numéro de port pour y accéder et ouvert l'accès à toutes les IP. Si ce n'est pas le cas, vérifiez quand même les points suivants dans le fichier /etc/default/duplicati, pour être sûr qu'il soit configurés de la manière suivante:

Relancez duplicati.

sudo service duplicati restart

Vous ne pourrez pour le moment plus y accéder, sauf depuis la machine elle-même.

Apache

Nous allons maintenant utiliser apache en tant que mandataire inverse afin qu'il se mette entre duplicati et nous, les administrateurs. C'est apache qui gèrera alors la partie HTTPs avant de transférer nos requêtes à duplicati (en clair, mais en local à la machine).

Déploiement du certificat et de la clef

Partons du principe que vous avez déjà votre PKI et que vous avez déjà votre certificat et votre clef. Vous disposez donc des fichiers suivant :

On téléverse ces fichiers sur le serveur. L'habitude veut que les répertoires suivants soient utilisés :

On met ensuite les bons droits sur les fichiers, histoire que les fichiers appartiennent à root, et que le fichier clef n'ait que des droits en écriture.

sudo chown root:root /etc/ssl/certs/duplicati.crt
sudo chown root:root /etc/ssl/private/duplicati.key
sudo chmod 400 /etc/ssl/private/duplicati.key

Si vous avez comme nous installé duplicati en tant que service, ces droits seront suffisants.

Installation et activation des modules

On va ensuite intaller apache en ligne de commande .

sudo apt-get install apache2

Puis on active tous les modules qui nous seront nécessaires :

Mandatement : Action de mandater. Terme utilisé dans la documentation officielle d’Apache en français.

sudo a2enmod proxy proxy_http headers proxy_wstunnel ssl rewrite

HTTPs

Pour configurer un hôte virtuel, qui va juste faire passe-plat entre le reste du monde et duplicati en ajoutant du HTTPs au passage, on crée un nouveau fichier, dans /etc/apache2/sites-available/, nommé duplicati.conf , avec les directives pour la gestion du SSL d'un côté, et celles pour le reverse proxy de l'autre.

<VirtualHost *:443>
    ServerName lynx.arsouyes.org

    # Directives pour SSL avec les administrateurs
    SSLEngine on
    SSLCertificateFile    "/etc/ssl/certs/duplicati.crt"
    SSLCertificateKeyFile "/etc/ssl/private/duplicati.key"

    # Directives pour le reverse proxy
    ProxyPreserveHost On
    ProxyRequests off
    ProxyPass / http://127.0.0.1:8200/
    ProxyPassReverse / http://127.0.0.1:8200/

    AllowEncodedSlashes On

</VirtualHost>

Les slashs encodés dans les URL sont refusés par Apache. Or duplicati les utilise lors de la récupération de fichiers. Le serveur Apache en coupure empêche donc la bonne transmission de la requête à duplicati. Pour le forcer Apache à transmettre la requête telle que demandée,, il est nécessaire de mettre AllowEncodedSlashes à On.

Maintenant que le fichier de configuration est créé, on va activer le site:

sudo a2ensite duplicati.conf

Puis relancer apache avec sa nouvelle configuration.

sudo systemctl reload apache2

Redirection de HTTP vers HTTPs

De base, apache installe un site de tests dans /etc/apache2/site-available/000-default.conf. On va supprimer tout ce qui est configuré pour cet hôte, et se contenter d'une redirection.

<VirtualHost *:80>
    ServerName lynx.arsouyes.org
    Redirect permanent / https://lynx.arsouyes.org
</VirtualHost>

On relance une dernière fois la configuration.

sudo systemctl reload apache2

Et après

Vous pouvez dorénavant accéder à l'interface en HTTPs. Grâce à Apache en coupure entre duplicati (en local) et le reste du SI, il n’est plus possible de sniffer le réseau et de récupérer le mot de passe.

Il existe bien d’autres modules utiles de apache que l’on pourrait envisager maintenant de restreindre l’accès, non plus par un simple mot de passe, mais aux utilisateurs d’un annuaire LDAP ou d’un domaine, via le module authnz_ldap .