blog-image

Nextcloud - Exposez votre instance sur Internet

  • dHENRY
  • 23/05/2019
  • (Durée de lecture : 9 mn)

Comment exposer votre instance NextCloud, ou tout autre services, hébergés chez vous, sur Internet ?
Deux possibilités :

  • En paramétrant votre routeur Internet (Box),
  • en passant par un serveur privé virtuel (VPS ), solution la plus raisonnable.

Paramétrage de votre Box Internet (routeur Fibre Optique ou ADSL).

Il existe tellement de types de routeurs (Box) qu’il m’est impossible de les détailler ici. Mais quand on parle de ce genre d’opération, il s’agit plus généralement, d’ajouter des règles de NAT (translation d’adresses). La première chose à faire est de rendre fixe l’adresse de l’entrée principal de votre MiniDatacenter, afin d’être sûr qu’il disposera toujours de la même adresse IP. Puis effectuer le paramétrage du routeur (Box), afin que les paquets arrivant sur un port spécifique (443 ici) soit redirigés vers l’adresse et le port de votre MiniDatacenter.
Si votre fournisseur d’accès ne vous distribue d’adresse IP Fixe, vous allez devoir paramétrer un service de mise à jour de DNS dynamique, afin que le nom de domaine que vous avez choisi soit toujours associé à l’adresse IP de votre Box, qui change de manière aléatoire et décidé par votre fournisseur d’accès.
Cette solution ne fonctionne pas si votre fournisseur, comme c’est le cas pour moi en Inde, ne fournit pas d’adresse IP publique (adresse d’exposition directe internet) à chaque utilisateur connecté, mais fait passer le trafic par un seul point sur l’internet, ou bien, si votre fournisseur d’accès bloque le trafic entrant direct, vers votre Box.
Un autre problème peut aussi se présenter pour la génération du certificat SSL LesEncrypt…


Opérations NAT sur un routeur exposé sur l’Internet

Serveur privé virtuel

C’est la solution la plus intéressante, mais bien entendu pas gratuite. Beaucoup de Datacentres proposent des solutions de Virtual Private Server. Vous pouvez trouver des offres démarrant à 3€/mois sans engagements.
Pour réduire la facture, mutualisez cette location avec d’autres utilisateurs.
Ce qui m’intéresse dans ce type de service, c’est sa bande passante, peu importe la puissance et la capacité de stockage du serveur.
Le serveur virtuel ne disposera que de deux services : OpenVPN, et HAPROXY, donc très facile à maintenir.
OpenVPN va permettre de relier votre MiniDatacenter au serveur VPS, et permettre ainsi son exposition sur Internet, tandis que HAPROXY va répartir le trafic vers les clients VPN fonction de l’Url reçue (Haproxy layer 7).
Si vous mutualisez ce service avec d’autres utilisateurs, la configuration ne change pas. Il y aura plusieurs clients Openvpn connectés au VPS.
Vous devrez vous assurer, pour la sécurité de chacun, que les clients Openvpn ne puissent communiquer entre eux.

Ce dispositif présente plusieurs avantages :

  • peu coûteux,
  • facile à maintenir,
  • détection d’intrusion interceptée par les serveurs finaux et retransmis au serveur de détection d’intrusion (permet une mutualisation face aux attaques),
  • ne nécessite pas la mise en place de NAT sur votre box internet,
  • l’isolation du Datacenter peut être instantanée (arrêt du service Openvpn),
  • vous bénéficiez des Firewalls de l’infrastructure dans laquelle est hébergé le serveur VPS,
  • seule solution alternative quand votre fournisseur d’accès internet ne propose pas le NAT sur votre connexion,
  • vous pouvez déplacer votre MiniDatacenter, n’importe où sans aucunes modifications de paramétrage.

Préparation du serveur privé virtuel

Après avoir commandé votre serveur privé virtuel, le fournisseur propose un accès SSH avec le login “root” et un mot de passe.

Changement du mot de passe “root”

Connectez-vous à ce serveur et changez immédiatement le mot de passe d’accès. Vous pouvez le générer avec l’outils “apg” :

apt install apg
apg
passwd
#Entrez le nouveau mot de passe et confirmer.

Contrôle d’accès ssh par clé

Vérifiez qu’il n’existe pas de fichier dont le nom est “authorized_keys

#Cette commande cherche et supprime ce type de fichier.
find / -name "authorized_keys" -exec rm -f {}\;

Ces fichiers permettent bien souvent à des administrateurs du Datacentre de pouvoir s’y connecter sans disposer d’un mot de passe utilisateur.
Ce cas est de moins en moins fréquent, mais je l’ai déjà rencontré dans certains Datacenter.

Installation du service de répartition de charge - HAPROXY

Ce service permet de communiquer avec des serveurs exposés ou non sur l’internet de manière transparente pour l’utilisateur. Elle permet aussi de répartir la charge d’un service tel un site web, une application de chat, etc… en répartissant les demandes sur plusieurs serveurs.

Pour installer le service “haproxy”, exécutez la commande suivante :

apt install haproxy

Installation du service de VPN - Openvpn

Je vous renvoie à mon instruction très détaillée sur l’installation d’un serveur Openvpn sécurisé : https://www.mytinydc.com/index.php/mytinydc-openvpn/

Topologie Finale

Paramétrage Firewall

  • VPS : INPUT TCP/443 - INPUT [Proto Openvpn]/[Port Openvpn]
  • MINIDATACENTER : Je ne rentre pas dans les détails, plusieurs cas sont possibles (PREROUTING, ou bien flux vers un autre Haproxy, …)

Paramétrage HAPROXY

Une fois que la communication VPN entre votre Datacentre et le VPS est établie, de manière stable, il est temps de configurer le répartiteur HAPROXY. Ce dernier sera l’interface entre les internautes et votre Datacenter.

Vous avez acheté le domaine “mondomaine.fr”, créer un enregistrement de type A, disposant du nom “nextcloud”, et de l’adresse IP exposée de votre VPS, dans mon exemple ce sera “1.2.3.4”. Attendre la propagation DNS. (commande : host nextcloud.mondomaine.fr). Cette commande doit présenter l’adresse de votre VPS (nécessaire pour créer le certificat SSL LetsEncrypt).
Créer le fichier /etc/haproxy/haproxy.cfg en indiquant ce contenu que vous devrez adapter à votre configuration.

global
    log /dev/log local0
    log /dev/log local1 notice
    chroot /var/lib/haproxy
    stats socket /run/haproxy/admin.sock mode 660 level admin
    stats timeout 30s
    user haproxy
    group haproxy
    daemon
    ca-base /etc/ssl/certs
    crt-base /etc/haproxy/certs
    ssl-default-bind-ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:RSA+AESGCM:RSA+AES:!aNULL:!MD5:!DSS
    ssl-default-bind-options no-sslv3
    tune.ssl.default-dh-param 2048
defaults
    log global
    mode http
    option httplog
    option dontlognull
    retries 3
    option redispatch
    option contstats
    option http-server-close
    maxconn 2000
    timeout connect 5000
    timeout client 7200000
    timeout server 7200000
    default-server inter 15s rise 2 fall 3
    option forwardfor
    errorfile 400 /etc/haproxy/errors/400.http
    errorfile 403 /etc/haproxy/errors/403.http
    errorfile 408 /etc/haproxy/errors/408.http
    errorfile 500 /etc/haproxy/errors/500.http
    errorfile 502 /etc/haproxy/errors/502.http
    errorfile 503 /etc/haproxy/errors/503.http
    errorfile 504 /etc/haproxy/errors/504.http
frontend **1.2.3.4**:443httpssl
    mode http
    bind 1.2.3.4:443 ssl crt nextcloud.mondomaine.fr.pem
    enabled
    acl nextcloudmondomaine.frssl hdr(host) -i nextcloud.mondomaine.fr
    use_backend nextcloudmondomaine.frssl  if nextcloudmondomaine.frssl
    backend nextcloudmondomaine.frssl
        mode http
        enabled
        server nextcloudmytinydc 172.28.0.10:443 ssl verify none check weight 100 maxconn 50

Création d’un certificat SSL (https) avec LetsEncrypt

LetsEncrypt est une autorité de certification pour les certificats HTTPS, au même titre que les autres sociétés proposant ce service. Sauf que l’obtention d’un certificat est gratuite.
Ainsi les navigateurs, applications, ne présenteront plus d’erreurs ou de messages indiquant que le certificat n’est pas vérifié par une autorité de certification. Pour créer un certificat LetEncrypt, veuillez vous reporter à la documentation : https://letsencrypt.org/
ATTENTION : Dans la configuration du serveur VPS proposé, ce dernier dispose du service HAPROXY, qui selon son paramétrage utilise les ports 80 et/ou 443 (respectivement http et https). Pour créer vos certificats, certbot lance un service qui écoute aussi, par défaut, sur les ports 80 ou 443.

Shell - Création d’un certificat

Ce shell est très simple, prend en paramètre le nom du certificat à créer. Vous devez vérifier, avant, la propagation DNS effective du nom de domaine, relatif au certificat à créer. LetsEncrypt fait appel aux services DNS afin d’effectuer des vérifications élémentaires de propriétaire.
Créer le fichier /root/LetsEncrypt-addcert.sh en indiquant ce contenu :

#!/bin/bash
if [ "$1" = "" ];then
       echo "Indiquez le nom de domaine à gérer"
       exit
fi
export DOMAIN=$1
certbot certonly --standalone --preferred-challenges http --tls-sni-01-port 30033 -n --rsa-key-size 4096 -d $DOMAIN
bash -c 'cat /etc/letsencrypt/live/$DOMAIN/fullchain.pem /etc/letsencrypt/live/$DOMAIN/privkey.pem > /etc/haproxy/certs/$DOMAIN.pem'

Exécutez ensuite :

chmod 750 /root/LetsEncrypt-addcert.sh
(*) L'utilisation du port 30033** est un choix de l'administrateur qui exécute la commande. Par défaut LetsEncrypt utilise les port 80 et 443 mais déjà utilisé par le service HAPROXY.
La longueur de la clé par défaut est des 2048 bits, il est aujourd'hui conseillé d'utiliser une clé de 4096 bits.

Shell - Renouvellement des certificats

Le renouvellement des certificats est exécuté par la tâche cron /etc/cron.d/certbot
Dans le cadre d’une utilisation avec HAPROXY, cette tâche ne concatène pas les certificats permettant d’obtenir un fichier “.pem” valide pour HAPROXY. Par conséquent,
Ajouter à la fin de la ligne du fichier **/etc/cron.d/certbot ** : " && /root/LetsEncrypt-renewcert.sh"

0 */12 * * * root test -x /usr/bin/certbot -a ! -d /run/systemd/system && perl -e 'sleep int(rand(43200))' && certbot -q renew** && /root/LetsEncrypt-renewcert.sh

La concaténation sera automatique après l’exécution de certbot. Créer le fichier /root/LetsEncrypt-renewcert.sh en indiquant ce contenu :

#!/bin/bash
PATHCERT="/etc/letsencrypt/live"
PATHCERTHAPROXY="/etc/haproxy/certs"
DIRS=``ls `$PATHCERT```
if [ "$DIRS" = "" ];then
        echo "Aucun certificat trouvé sur ce serveur"
        exit 1
fi
#Parcours des certs installés et création des PEM Haproxy
for DOMAIN in $DIRS
do
       if [ -d "$PATHCERT/$DOMAIN" ];then
                echo "Concat $PATHCERT/$DOMAIN/fullchain.pem $PATHCERT/$DOMAIN/privkey.pem to $PATHCERTHAPROXY/$DOMAIN.pem"
                cat $PATHCERT/$DOMAIN/fullchain.pem $PATHCERT/$DOMAIN/privkey.pem > $PATHCERTHAPROXY/$DOMAIN.pem
        fi
done
# Reload HAPROXY configuration
systemctl reload haproxy

Puis exécutez :

chmod 750 /root/LetsEncrypt-renewcert.sh

Mutualisation du serveur VPS

Pour réduire les coûts, nous pouvons mutualiser le service HAPROXY entre plusieurs acteurs. Chacun disposera d’une clé d’accès au VPN, et un administrateur sera chargé de gérer les certificats et la configuration du service HAPROXY.

Sécurité du service Haproxy

Vous devrez prêter attention aux logs de ce service, surtout si vous mutualisez l’utilisation. Les logs, et ce lié à l’implémentation des services mise en oeuvre, peuvent présenter des url contenant des metadonnées sensibles genre token d’accès etc… Ceci n’est pas lié à la sécurité brute du service HAPROXY mais aux effets de bords pouvant survenir dans le cadre d’une mauvaise utilisation de ces logs. Portez attention à la protection de l’accès de ces traces de leur durée de conservation,…

Sécurité du service Openvpn

Ceci peut présenter des problèmes de sécurité, dans le cas où les client VPN, une fois connectés, peuvent communiquer entre eux.
Par défaut, Openvpn n’active pas ce service, mais vous allez devoir vous assurer avec des outils, comme “tcpdump”, que le trafic soit bien bloqué entre ces différents acteurs.
Car si Openvpn n’active pas ce service dans sa configuration (option “client-to-client”), il peut se révéler que le kernel fasse son travail de routage comme pour toutes autres interfaces. Vous pourrez désactiver le Forward de la pile IP et/ou ajouter une règle iptables empêchant le Forward entre les acteurs :

FORWARD -i [nom de l'interface] -o [nom de l'interface] -j DROP

Vous trouverez une excellente explication ici : https://serverfault.com/questions/736274/openvpn-client-to-client
La gestion des certificats d’accès au VPN (openvpn) est rendue très facile avec l’outil associé à Openvpn, que j’ai développé et que vous pouvez trouver ici : https://www.mytinydc.com/index.php/mytinydc-openvpn/

Conclusion

Bien entendu, vous pouvez adapter ce cas “Nextcloud” à d’autres services, tels, la messagerie instantanée Matrix-Synapse-Element.io, Rocketchat, etc…

Licence de ce document : Creative Commons (CC BY-NC-ND 4.0)

CETTE DOCUMENTATION EST LIVRÉE “EN L’ÉTAT”, SANS GARANTIE D’AUCUNE SORTE ET DISTRIBUÉE DANS UN BUT ÉDUCATIF EXCLUSIVEMENT. L’AUTEUR, CONTRIBUTEURS DE CETTE DOCUMENTATION OU ©MYTINYDC.COM NE SAURAIENT EN AUCUN CAS ÊTRE TENUS RESPONSABLES DES DOMMAGES DIRECTS OU INDIRECTS POUVANT RÉSULTER DE L’APPLICATION DES PROCÉDURES MISES EN ŒUVRE DANS CETTE DOCUMENTATION, OU DE LA MAUVAISE INTERPRÉTATION DE CE DOCUMENT.