• en: Nextcloud - Expose your instance on the Internet ()
  • 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-Riot, 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.

    Poster un commentaire

    Désolé, la réponse à la question Captcha est incorrecte
    Merci. le message est dans le tuyau :)
    Désolé, il y a un problème dans le tuyau, veuillez réessayer plus tard :(
    Un champs est invalide

    Commentaires (non traduits)

    Pas de commentaires