Qnap [Tuto] Reverse proxy avec Caddy

Mikiya

Chevalier Jedi
25 Octobre 2016
440
0
0
Salut
Suite au récent ajout de Caddy par Qoolbox (merci encore à lui pour tous ces paquets !), je vais simplement écrire ici un petit récapitulatif de la marche à suivre pour s'en servir en reverse proxy. C'est grandement tiré de l'exemple donné par Celena donc merci aussi !
Déjà, un reverse proxy, c'est pour accéder à un serveur "interne" (pas directement ouvert sur le web) depuis l'extérieur. L'utilité ? Gérer du load-balancing, ouvrir en https des serveurs qui ne sont que en http, rajouter une couche d'authentification si on veut,... c'est pas inutile selon les cas ;)

Alors pour ça il vous faut déjà installer le paquet de Qoolbox depuis le store https://www.forum-nas.fr/viewtopic.php?f=21&t=8864.
Je vous incite fortement à suivre mon tuto pour avoir un certificat LE : https://www.forum-nas.fr/viewtopic.php?f=55&t=7078&p=47912#p47912 il sera commun pour l'ensemble du NAS ça aide.
Une fois fait, un simple fichier suffit, Caddy est bluffant de simplicité !
Vous pouvez écrire :
Code:
(sslconf) {
        tls CHEMIN_VERS_VOTRE_CERTIFICAT_COMPLET CHEMIN_VERS_VOTRE_KEY {
                ciphers ECDHE-ECDSA-AES256-GCM-SHA384 ECDHE-RSA-AES256-GCM-SHA384 ECDHE-ECDSA-AES128-GCM-SHA256 ECDHE-RSA-AES128-GCM-SHA256 ECDHE-ECDSA-WITH-CHACHA20-POLY1305 ECDHE-RSA-WITH-CHACHA20-POLY1305 ECDHE-RSA-AES256-CBC-SHA ECDHE-RSA-AES128-CBC-SHA ECDHE-ECDSA-AES256-CBC-SHA ECDHE-ECDSA-AES128-CBC-SHA
                curves  X25519 p256 p384 p521
                protocols tls1.2
        }
}

(gzipconf) {
        gzip {
                level 5
                min_length 1
        }
}

(addheader) {
        header / {
                Strict-Transport-Security "max-age=31536000;"
                X-Frame-Options "DENY"
                X-Content-Type-Options "nosniff"
                x-xss-protection "1; mode=block"
                Referrer-Policy "strict-origin-when-cross-origin"
                -Server
        }
}

https://VOTRE_NOM_DE_DOMAINE:PORT_OUVERT {
        import sslconf
        import gzipconf
        import addheader
        proxy / http://IP_DU_SERVEUR_INTERNE:PORT_INTERNE {
                keepalive 32
                transparent
        }
}

Une fois ceci copié dans un fichier (par exemple /share/homes/admin/caddy.conf), vous pouvez lancer le serveur simplement en tapant :
Code:
caddy -conf /share/homes/admin/caddy.conf&

Normalement depuis internet vous accèderez au serveur interne c'est bon !
Vous devriez avoir un grade A+ sur SSLLabs en sécurité, et grade A sur SecurityHeaders.

Mais au reboot ce n'est pas persistant...

Donc je propose de mettre ça dans un script :

Code:
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/bin/X11:/usr/local/sbin:/usr/local/bin

# Attendre le démarrage de tous les services avant
sleep 600

# Couper l'ecoute de caddy de base qui ne sert pas
killall caddy
# Lancer notre serveur bien configuré
caddy -conf /share/homes/admin/caddy.conf&

Et appelez ce script en fond (avec &) par une des deux techniques comme dans le tuto pour le certificat LE : la technique du autorun (https://techlightup.blogspot.fr/2013/08/qnap-automatically-run-script-at-startup.html) ou avec BashIT (https://www.forum-nas.fr/viewtopic.php?f=21&t=2020&p=16572&hilit=autorun#p16572)

Quelques remarques :
  • Vous pouvez personnaliser la partie proxy pour faire pointer autre chose que / (/contacts, ...) vers divers serveurs différents.
  • Vous pouvez monter encore la sécurité en rajoutant une directive Content-Security-Policy, par exemple Content-Security-Policy "", mais cela demandera peut être un ajustement du serveur interne, s'il va chercher des ressources sur d'autres sites il faudra les ajouter une à une dans cette directive.
  • Vous pouvez rajouter d'autres possibilités à ce proxy, comme du websocket, de l'authentification,... Les options sont ici : https://caddyserver.com/docs
  • Vous pouvez aussi renforcer la sécurité en ne faisant pas tourner Caddy en admin mais sur un user limité, il faut alors remplacer la fin du script par :
    Code:
    cd /share/homes/USER_LIMITE
    sudo -u USER_LIMITE caddy -conf /share/homes/USER_LIMITE/caddy.conf&
    Par contre veuillez à ce que les certificats et le script de conf lui soit bien accessibles en lecture seulement !
 
Salut,

je vais apporter juste une info :

Caddy est capable de générer automatiquement les certificats LE, il s'occupera aussi de les renouveler.
Code:
(sslconf) {
	tls EMAIL {
		ciphers	ECDHE-ECDSA-AES256-GCM-SHA384 ECDHE-RSA-AES256-GCM-SHA384 ECDHE-ECDSA-AES128-GCM-SHA256 ECDHE-RSA-AES128-GCM-SHA256 ECDHE-ECDSA-WITH-CHACHA20-POLY1305 ECDHE-RSA-WITH-CHACHA20-POLY1305 ECDHE-RSA-AES256-CBC-SHA ECDHE-RSA-AES128-CBC-SHA ECDHE-ECDSA-AES256-CBC-SHA ECDHE-ECDSA-AES128-CBC-SHA
		curves	X25519 p256 p384 p521
		key_type rsa4096
		protocols tls1.2
	}
}

Note Importante : cette configuration génère 1 certificat par site héberger, ce ne sera donc plus celui générer par le Tuto de Mikiya
 
Oui je n'ai pas parlé de la génération par Caddy, tu as raison de le préciser :)
Par contre je pense pas que LE vive bien si on veut un certificat par Caddy et un autre pour le NAS en général sur le même domaine, à tester avant pour vérifier.
 
Comme promis je met le fichier de conf que j'ai fais pour pouvoir utiliser caddy avec le certificat let'sencrypt générer via myqnapcloud.

Code:
(sslconf) {
        tls /mnt/HDA_ROOT/.config/QcloudSSLCertificate/cert/cert /mnt/HDA_ROOT/.config/QcloudSSLCertificate/cert/key {
                ciphers ECDHE-ECDSA-AES256-GCM-SHA384 ECDHE-RSA-AES256-GCM-SHA384 ECDHE-ECDSA-AES128-GCM-SHA256 ECDHE-RSA-AES128-GCM-SHA256 ECDHE-ECDSA-WITH-CHACHA20-POLY1305 ECDHE-RSA-WITH-CHACHA20-POLY1305 ECDHE-RSA-AES256-CBC-SHA ECDHE-RSA-AES128-CBC-SHA ECDHE-ECDSA-AES256-CBC-SHA ECDHE-ECDSA-AES128-CBC-SHA
                curves  X25519 p256 p384 p521
                protocols tls1.2
        }
}

(gzipconf) {
        gzip {
                level 5
                min_length 1
        }
}

(addheader) {
        header / {
                Strict-Transport-Security "max-age=31536000;"
                X-Frame-Options "DENY"
                X-Content-Type-Options "nosniff"
                x-xss-protection "1; mode=block"
                Referrer-Policy "strict-origin-when-cross-origin"
                -Server
        }
}

https://VOTRE_NOM_DE_DOMAINE.myqnapcloud.com:PORT_OUVERT {
        import sslconf
        import gzipconf
        import addheader
        proxy /radarr http://VOTRE_IP_RADARR:PORT_RADARR {
                keepalive 32
                transparent
        }
        proxy /sonarr http://VOTRE_IP_SONARR:PORT_SONARR {
                keepalive 32
                transparent
        }
         proxy /transmission http://VOTRE_IP_TRANSMISSION:PORT_TRANSMISSION {
                keepalive 32
                transparent
        }
}

Pour Radarr et Sonarr il faut aussi aller dans les paramètres "general" et compléter le champ "URLBASE" avec "/radarr", "/sonarr" ou autre (si vous le changez ne pas oublier de le modifier aussi dans le fichier de conf de caddy.
Pour Transmission c'est pareil mais via le fichier de config "settings.json" ("rpc-url": "/transmission/", )

Du coup tous est accessible via "https://VOTRE_NOM_DE_DOMAINE.myqnapcloud.com:pORT_OUVERT/VOTRE_APPLIS" et le tous via un seul port. :-o

On peut rajouter autant d'applis que l'on veut en utilisant le certificat fourni par let'sencrypt via qnap et aussi utiliser myqnapcloud normalement (filestation, ...)

Meme si le certificat est renouvelé cela ne pose pas de problème c'est totalement transparent. :p :geek:
 
Je me rejoins à cette discussion. Je suis arrivé à configurer enfin caddy en HTTPS. Le seule problème mnt est que les applis sur téléphone de QNAP essaient d’utiliser [user].myqnapcloud.com pour accéder au NAS.

Avec caddy j’ai bien configuré la partie proxy (et en effet avec mon user.myqnapcloud.com sur mon browser j’arrive à y accéder sans problèmes), mais je crois que l’appli s’attend de voir un certificat valable (ou bien déclaré) et non pas un certificat LetsEncrypt pour donner access au NAS.

J’ai vu dans les examples ci dessus qu’on fait référence à la directory /mint/HDA_ROOT/.config/QCloudSSLCertificate/ mais cela est vide pour moi et je ne sais pas ce qu’il faut mettre comme donnés ciphers; curves et protocols.

Comment faut il configurer cela, dans QTS et dans Caddy?

Merci d’avance!

giopas
 
Personne qui sait comment il faut configurer dans Caddy et dans QTS les certificats pour faire marcher myqnapcloud.com?
 
Je sais que QTS utilise in certificat pour les connexions tls. Ce certificat, à travers QTS, peut être soit celui émis par QNAP, soit celui de Letsencrypt et cela s'applique pour le sous-domaine xxx.myqnapcloud.com.

Ce que je voudrais faire est de faire pointer caddy vers le certificat qui est utilisé par QTS. Mais je ne sais pas comment le trouver et aussi comment trouver l'information "ciphers" qui est mentionné dans les réponses avant.

J'espère que cela est plus clair maintenant.

Merci!

Sent from my ONEPLUS A5000 using Tapatalk


 
Bonjour!

Est-ce qu'il y a quelqu'un qui a une idée par rapport à mon souci? Peut être que je suis en train de me perdre dans un verre d'eau...

Merci!
 
Code:
(sslconf) {
        tls /mnt/HDA_ROOT/.config/QcloudSSLCertificate/cert/cert /mnt/HDA_ROOT/.config/QcloudSSLCertificate/cert/key {
                ciphers ECDHE-ECDSA-AES256-GCM-SHA384 ECDHE-RSA-AES256-GCM-SHA384 ECDHE-ECDSA-AES128-GCM-SHA256 ECDHE-RSA-AES128-GCM-SHA256 ECDHE-ECDSA-WITH-CHACHA20-POLY1305 ECDHE-RSA-WITH-CHACHA20-POLY1305 ECDHE-RSA-AES256-CBC-SHA ECDHE-RSA-AES128-CBC-SHA ECDHE-ECDSA-AES256-CBC-SHA ECDHE-ECDSA-AES128-CBC-SHA
                curves  X25519 p256 p384 p521
                protocols tls1.2
        }

A part cela je vois pas se que tu veut, il y a l’emplacement du certificat et de la clé.
 
Merci! Mais c'est quoi le chipher?

Edit: en fait, vu que je n'ai rien dans /mnt/HDA_ROOT/.config/QcloudSSLCertificate/, j'ai essayé à laisser Caddy faire tout et mnt ça marche!

Nickel!

Sent from my ONEPLUS A5000 using Tapatalk