Cloud Privé sur Google Compute Engine avec NodeJS et Nginx

Voici un petit article afin de synthétiser mes pérégrinations pour mettre en place un Cloud Privé autour d’un serveur NodeJS. En gros un serveur qui sera bien sécurisé et accessible qu’a certaines adresses IP.

TLDR;
Je suis une méga quiche sous linux…

La platforme

Jusqu’à présent j’utilisais Gandi pour mes tests et le marketplace de SARAH. Pour ce nouveau projet, sous les conseils de maître David, je me suis tourné vers le Google Compute Engine.

  • Compute Engine et non pas App Engine car je souhaite avoir accès à l’OS
  • Google et non pas Azure car l’ergonomie semble plus simple
  • Dans cet article il est indiqué que GCE est HIPAA compliant
  • Les boites comme OVH ne savent pas vraiment faire

La VM

On trouve de nombreux tutorials sur le net. L’IHM de Compute Engine semble avoir pas mal évolué et les tutos ne sont pas forcément à jour.

Pour faire simple:

  • Créer la plus petite machine
  • Choisir la zone Europe
  • Partir sur une instance Debian ou Ubuntu
  • Activer HTTP et HTTPS
  • Mettre une IP Fixe

Le NodeJS

GCE propose un SSH Web directement depuis l’interface ! Ce qui permet d’installer NodeJS.

Remplacer dans cet exemple par la bonne version de NodeJS.

[crayon]
gce-vm$ wget -O nodejs.tar.gz http://nodejs.org/dist/v0.10.28/node-v0.10.28-linux-x64.tar.gz
gce-vm$ tar -xzf nodejs.tar.gz
gce-vm$ sudo cp node-v0.10.28-linux-x64/bin/* /usr/local/bin/
gce-vm$ sudo cp -r node-v0.10.28-linux-x64/lib/* /usr/local/lib/
gce-vm$ sudo mkdir -p /usr/local/share/man/man1
gce-vm$ sudo cp -r node-v0.10.28-linux-x64/share/man/man1/node.1 /usr/local/share/man/man1
gce-vm$ curl https://www.npmjs.org/install.sh | sudo sh
[/crayon]

Sur la dernière ligne j’ai du télécharger puis exécuter l’installation de NPM.

Le serveur HTTP

Ensuite il suffit de se faire un petit serveur.js:

[crayon]
// Load the http module to create an http server.
var http = require(‘http’);

// Configure our HTTP server to respond with Hello World to all requests.
var server = http.createServer(function (request, response) {
response.writeHead(200, {"Content-Type": "text/plain"});
response.end("Hello Worldn");
});

// Listen on port 8080, IP defaults to 127.0.0.1
server.listen(8080);

// Put a friendly message on the terminal
console.log("Server running at http://127.0.0.1:8080/");
[/crayon]

Et de le lancer:

[crayon]
gce-vm$ sudo node server.js
[/crayon]

Normalement le serveur se lance mais n’est pas accessible depuis l’IP statique de l’instance. Mettre le port 80 pour tester le serveur: Hello World !

Filtrage sur IP

A cette étape vous pouvez normalement définir des règles de Firewall GCE afin de n’autoriser QUE certaines IP à accéder à la machine. Pour cela aller dans Compute Engine > Réseaux > Default et modifier les règles de Firewall.

Mais dans le monde réel nous avons des IP Dynamiques (merci Orange) 🙁 il faut donc passer par un DNS Dynamique et Ngix un reverse proxy qui fera partiellement le boulot.

Je ne vais pas décrire ici l’installation de No-Ip mais sachez que le portail livebox intègre l’option.

Installation de Ngix

Modifier le source list de Debian:
[crayon]
gce-vm$ sudo nano /etc/apt/sources.list
[/crayon]

Et ajouter:
[crayon]
deb http://nginx.org/packages/mainline/debian/ wheezy nginx
deb-src http://nginx.org/packages/mainline/debian/ wheezy nginx
[/crayon]

Télécharger la clef:
[crayon]
gce-vm$ wget http://nginx.org/keys/nginx_signing.key
gce-vm$ sudo apt-key add nginx_signing.key
[/crayon]

Installer:
[crayon]
gce-vm$ sudo apt-get update
gce-vm$ sudo apt-get install nginx
[/crayon]

Configuration de Ngix

A priori a cette étape le serveur NGix est accessible sur le port 80 et présente une page par défaut. Il faut rooter vers le serveur NodeJS.

[crayon]
gce-vm$ cd /etc/nginx/conf.d/
gce-vm$ sudo nano default.conf
[/crayon]

Et remplacer location /
[crayon]
location / {
proxy_pass http://localhost:8080; #change port to your node.js port
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection ‘upgrade’;
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
[/crayon]

Relancer Nginx :
[crayon]
gce-vm$ sudo /etc/init.d/nginx restart
[/crayon]

Normalement si votre serveur NodeJS est lancé sur le port 8080 la redirection se fera correctement. Hello World !

IP Dynamiques

Tout comme la console Computer Engine, Nginx ne prends QUE des adresses IP. Une astuce simple consiste à interroger périodiquement le DNS pour mettre à jour un fichier de configuration et relancer Nginx.

Installer les outil nslookup, host, dig:
[crayon]
sudo apt-get update
sudo apt-get install dnsutils
[/crayon]

Créer un script dans /etc/cron.hourly
[crayon]
#!/bin/bash
host maison.ddns.net | grep "has address" | sed ‘s/.*has address //’ | awk ‘{print "allowtt" $1 ";tt# Home IP" }’ > /etc/nginx/conf.d/homeip.inc
service nginx reload > /dev/null 2>&1
[/crayon]

Ajouter une règle dans Nginx:
[crayon]
location / {
include /etc/nginx/conf.d/homeip.inc;
deny all;
[/crayon]

Et relancer le serveur:
[crayon]
gce-vm$ sudo /etc/init.d/nginx restart
[/crayon]

Conclusion

Le besoin de départ était d’avoir une bête machine linux dans le cloud sécurisée comme à la maison. Des dizaines de lignes de commandes plus tard (je déteste linux) c’est en partie fait.

  • Il faut encore acheter une clef SSL et configurer Nginx en https
  • Le filtrage IP ne se fait QUE sur la partie HTTP(S)
  • Tester le coût et les perfs de la plateforme

Pour en arriver là j’ai mixé plusieurs articles dont celui de Mike Hua et celui de ZenCoffee.

Je suis super preneurs de vos remarques !

One more thing !

Si vous êtes un super Ninja des Nuages, mouton à 5 pattes, intéressé par la mise en place d’une plateforme ambitieuse recoupant:

  • Sécurité & Pentest
  • Internet des objets
  • Machine Learning
  • Virtual Reality

Nous devrions prochainement recruter pour WhatsHome. Alors Contactez-nous !

3 pensées sur “Cloud Privé sur Google Compute Engine avec NodeJS et Nginx

  • 13 mai 2015 à 12 h 02 min
    Permalink

    Après quelques tests avec FFMPEG je me rends compte qu’une instance de base 1 CPU est a peu prêt 3x plus lente que mon Core i7.

    La politique de tarification fonctionne en croisant CPU, Mémoire, Réseau avec des discount sur l’usage dans le mois. Du coup pour savoir ce que coute une conversion FFMPEG c’est super compliqué …

    En jouant un tout petit peu, avec un peu d’upload, etc … j’ai quand même bouffé 10$ ! Ce qui est proportionnellement super cher

    Répondre
    • 4 juillet 2015 à 19 h 10 min
      Permalink

      Salut JP (si je eut me permettre ;-),

      Pour ce qui est de la tarification VM global, je te conseil d’aller chez ceux qui ne tarif pas à l’heure d’utilisation, ces sans doute moins écolo te dirons ces hoster, mais ce n’est pas l’écologie qui les préoccupe (ces pas nouveau), mais vous ne dite pas sur quel CPU (XENON) votre host vous héberge, ni si votre vCPU vous est dédié ou s’il est mutualisé.
      Si vous ne pouvez répondre car votre hébergeur ne donne pas d’information, ces qu’il ne vous ment pas légalement comme ça, et à de très forte chance que vos ressources global (vCPU/vRAM) soit mutualisé ^^

      Le virtualisation ces bien beau, très beau, surtout paradisiaque pour les hosteur/GSP qui évite d’informer et de réellement former à la simple clarification de ce qu’est la virtualisation.

      Amicalement.

      Répondre
      • 4 juillet 2015 à 19 h 42 min
        Permalink

        Salut,

        Bah là ce sont des serveurs Google Compute Engine. J’ai pris le premier modèle ultra minimaliste.
        Mais Google te permets de choisir précisément la machine que tu souhaites: mutualisées, zone euro, plutôt orienté CPU ou Ram suivant les usages, les distrib, etc …

        Le besoin sous-jacent n’etait pas le coût mais surtout la sécurité.

        Répondre

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.