Sécuriser Kuzzle avec SSL et NGINX

English version

 

   Bonjour tout le monde ! Il y a quelques semaines, cette question a été beaucoup publiée sur notre Gitter. Nous avons donc décidé d'écrire un court article de blog pour aider les débutants en administration système à configurer correctement un proxy SSL pour Kuzzle. Dans cet article, je partirai du principe que vous avez un Kuzzle opérationnel. Si ce n'est pas le cas, utilisez notre script d'installation disponible sur le site web ou récupérez le fichier Docker Compose.

Choisissez votre proxy

    Une fois votre serveur Kuzzle démarré, vous devrez choisir le proxy que vous souhaitez utiliser. NGINX et HAProxy peuvent être des solutions très simples à mettre en place. Notez que lorsque NGINX recharge sa configuration, il ne ferme pas les connexions WebSocket existantes. Si vous êtes sous Linux, vous pouvez facilement les installer en utilisant votre gestionnaire de paquets préféré. Les utilisateurs de MacOS et Windows doivent les utiliser dans des conteneurs Docker en utilisant les images officielles NGINX et HAProxy.

Génération du certificat SSL

    Que vous utilisiez NGINX, HAProxy ou un autre proxy. Vous devez d'abord obtenir un certificat SSL. Pour cela, vous pouvez générer votre propre fichier (surtout si vous êtes encore en phase de développement) ou simplement en obtenir un gratuit en utilisant Let's Encrypt. Supposons que nous sommes toujours en développement et que nous générions un certificat auto-signé pour localhost en utilisant OpenSSL :
 


~ $
openssl req -x509 -newkey rsa:4096 -keyout localhost.key -out localhost.crt -days 365 -nodes

 

Quelques questions vous serons posées:

 


Generating a RSA private key
.......................................................++++.......................................................++++....................
writing new private key to 'localhost.key'
----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. -----
Country Name (2 letter code) [AU]:FR State or Province Name (full name) [Some-State]:Occitanie Locality Name (eg, city) []:Montpellier Organization Name (eg, company) [Internet Widgits Pty Ltd]:Kuzzle Organizational Unit Name (eg, section) []:IT Common Name (e.g. server FQDN or YOUR name) []:localhost Email Address []:it@kuzzle.io

 

Les réponses à ces questions ne sont pas très importantes, puisque nous sommes en train de générer un certificat de développement. Cependant, Common Name doit correspondre au FQDN que vous voulez utiliser pour Kuzzle. Gardez ces fichiers de côté, nous les utiliserons dans les prochaines étapes. Si OpenSSL n'est pas installé sur votre machine (notamment sur MacOS ou Windows) jetez un coup d’œil à ce site. Il générera une clé et un certificat SSL pour un nom de domaine donné et vous permettra de les télécharger.

Configuration du proxy

Si vous avez bien suivi toutes les étapes jusqu'ici, vous devriez avoir:

  • Un serveur Kuzzle opérationnel.
  • Un proxy de votre choix installé sur votre machine ou dans un conteneur.
  • Les deux fichiers générés précédemment.

Il est temps de configurer votre proxy pour gérer les requêtes et les connexions vers votre Kuzzle. Voici un exemple de configuration pour NGINX :

 


map
$http_upgrade $connection_upgrade { default upgrade; '' close; } upstream kuzzle { server localhost:7512; } server { listen 17512 ssl; proxy_read_timeout 3600s; ssl_certificate /path/to/your/ssl/cert/localhost.crt; ssl_certificate_key /path/to/your/ssl/key/localhost.key; error_page 497 https://$host:17512$request_uri; location / { proxy_pass http://kuzzle; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; } }

 

Ce fichier devra être placé dans /etc/nginx/sites-available et vous devrez créer un lien symbolique à destination de celui-ci dans le répertoire /etc/nginx/sites-enabled:

  


~ #
vim /etc/nginx/sites-available/kuzzle.conf
~ # ln -s /etc/nginx/sites-available/kuzzle.conf /etc/nginx/sites-enabled/kuzzle.conf
~ # systemctl reload nginx.service
 

 

Si vous utilisez NGINX dans un conteneur Docker,  jetez un œil aux instructions dans la description de l'image du Docker pour savoir où monter le fichier de configuration et les fichiers SSL en volume. Une fois NGINX redémarré, votre Kuzzle devrait être disponible sur https://locahost:17512. Notez que votre navigateur Web peut vous afficher un message d'erreur concernant la sécurité. Si vous avez créé un certificat auto-signé, c'est un comportement normal.

 

J'espère que cet article répondra à vos questions, n'hésitez pas à venir nous rejoindre sur Gitter. Nous sommes également disponibles sur le chat intégré à notre site et la documentation

 

Tous nos tutos ici: Backend Tech Tutorials

 

Alexandre Bouthinon

Postes associés