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.