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