Sécuriser Node-RED avec Nginx et OpenSSL sur Ubuntu 16.04 • Domotique et objets connectés à faire soi-même

Nginx est un serveur Web très populaire et très légers. Dans ce tutoriel, nous allons utiliser Nginx pour mettre en place un proxy sécurisé à l’aide d’un certificat auto-signé OpenSSL. Ce tutoriel a été mis au point sur Ubuntu 16.04 LTS mais la méthode reste similaire pour d’autres distributions. Pour installer Node-RED sur une distribution Ubuntu, suivez ce précédent tutoriel.

Installation de Nginx

Nginx s’installe très simplement à l’aide d’une simple commande apt-get.

sudo apt-get update
sudo apt-get install nginx

Acceptez l’installation de toutes les dépendances qui sont demandées durant l’installation.

Créer un certificat SSL avec openSSL

Commençons par créer un répertoire dans lequel sera stocké le certificat SLL

sudo mkdir /etc/nginx/ssl

Maintenant que nous avons un emplacement de destination, nous pouvons créer la clé et le certificat SSL

sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/nginx/ssl/nginx.key -out /etc/nginx/ssl/nginx.crt

Quelques explications :

  • openssl : la commande qui permet de créer et gérer les certificats, clés et autres fichiers
  • req : le type de certificat souhaité. dans ce cas X.509
  • -days 365 : durée durant laquelle le certificat est considéré comme valide

Répondez aux questions posées

  • Country Name (2 letter code) [AU]: code pays, par exemple FR
  • State or Province Name (full name) [Some-State]: département
  • Locality Name (eg, city) []: Ville
  • Organization Name (eg, company) [Internet Widgits Pty Ltd]: Nom de la société
  • Organizational Unit Name (eg, section) []: service
  • Common Name (e.g. server FQDN or YOUR name) []: nom de votre site, par exemple domaine.com
  • Email Address []: adresse email de contact

La commande openssl génère 2 fichiers à partir de ces informations, nginx.crt et nginx.key

Configurer Nginx pour utiliser une connexion SSL

Maintenant que nous possédons une clé et un certificat, nous allons créer un fichier de configuration. Nous pourrons l’appeler node-red.securise.com.

Ouvrez un nouveau fichier de configuration avec nano

sudo nano /etc/nginx/sites-available/node-red.securise.com

Adaptez l’exemple ci-dessous en fonction de vos besoins et collez le dans le fichier puis enregistrez avec CTRL+X puis O.

server {
    listen 80;
    listen 443 ssl http2;
    server_name node-red.securise.com;
    ssl_certificate /etc/nginx/ssl/nginx.crt;
    ssl_certificate_key /etc/nginx/ssl/nginx.key;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+$
    ssl_prefer_server_ciphers On;
    ssl_session_cache shared:SSL:128m;
    ssl_stapling on;
    ssl_stapling_verify on;
    resolver 8.8.8.8;

    location / {
        if ($scheme = http) {
            return 301 https://$server_name$request_uri;
        }
        proxy_pass http://localhost:1880;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }

    location '/.well-known/acme-challenge' {
        root /var/www/html;
    }
}

Quelques explications (rapides)

  • La clé server_name permet de définir le nom du site internet par lequel on obtiendra une connexion sécurisée via Nginx.
  • Les clés ssl_certificate et ssl_certificate_key permettent de définir le dossier dans lequel se trouvent le certificat et la clé créée précédemment.
  • Le bloc “if ($scheme = http) { return 301 https://$server_name$request_uri; }" permet de renvoyer toutes les connexions http non sécurisées vers une liaison HTTPS
  • "proxy_pass http://localhost:1880;" permet de pointer vers la page de Node-RED

Il reste à créer un lien symbolique vers le dossier sites-enabled pour rendre actif la configuration.

sudo ln -s /etc/nginx/sites-available/node-red.securise.com /etc/nginx/sites-enabled/

Configuration du fichier hosts

Pour que l’URL soit accessible depuis un navigateur, il faut modifier le fichier hosts. Récupérez l’adresse IP de votre PC avec la commande ifconfig puis modifiez le fichier /etc/hosts

sudo nano /etc/hosts

et ajoutez par exemple

127.0.0.1       localhost
192.168.2.2     node-red.securise.com

Enregistrez avec CTRL+X puis O.

Configuration du Firewall

Nous allons maintenant configurer le pare-feu afin d’empêcher la connexion via le port 1880. Commençons par ajouter une règle pour autoriser les connexion HTTP et HTTPS depuis Nginx.

Vérifions tout d’abord les applications disponibles :

$ sudo ufw app list
Applications disponibles :
  CUPS
  Nginx Full
  Nginx HTTP
  Nginx HTTPS

Trois profiles Nginx sont disponibles :

  • Nginx Full : ce profile ouvre les ports 80 (trafic non crypté) et 443 (trafic crypté TLS/SSL)
  • Nginx HTTP : ouvre uniquement le port 80 (non crypté)
  • Nginx HTTPS : ouvre uniquement le port 443 crypté

On active le profil “Nginx Full” comme ceci

sudo ufw allow 'Nginx FULL'

Pour savoir si le pare-feu est démarré, faites

$ sudo ufw status
Etat : inactif

Si le pare-feu n’est pas encore démarré, exécutez

sudo ufw enable

Maintenant vérifions la configuration du pare-feu

Status: active

To                         Action      From
--                         ------      ----
1880                       ALLOW       Anywhere                  
Nginx Full                 ALLOW       Anywhere                  
1880 (v6)                  ALLOW       Anywhere (v6)             
Nginx Full (v6)            ALLOW       Anywhere (v6)

A ce stade, Node-RED est encore accessible à l’adresse http://localhost:1880. Nous allons ajouter une règle pour interdire toute connexion depuis le port 1880.

sudo ufw deny 1880

Vérifions de nouveau la configuration du pare-feu

Status: active

To                         Action      From
--                         ------      ----
1880                       DENY       Anywhere                  
Nginx Full                 ALLOW      Anywhere                  
1880 (v6)                  DENY       Anywhere (v6)             
Nginx Full (v6)            ALLOW      Anywhere (v6)

Modification du fichier settings.js de Node-RED

Il ne nous reste plus qu’à ajouter une authentification par mot de passe à Node-RED. Pour cela, commençons par ajouter le module node-red-admin (sauf s’il est déjà installé).

sudo npm install -g --unsafe-perm node-red-admin

Générons maintenant une empreinte (hash) de votre mot de passe. Exécutez la commande  suivante. Saisissez le mot de passe et validez. En retour, vous obtiendrez l’empreinte de votre mot de passe. Sélectionnez la et faites un clic droit puis copier.

node-red-admin hash-pw

Ouvrez le fichier de configuration

nano ~/.node-red/settings.js

Recherchez la section adminAuth et dé-commentez tout le bloc

adminAuth: {
    type: "credentials",
    users: [{
        username: "admin",
        password: "%2a$08$Ab9prIr1M8a5a1LZx8.B9.uIOCPe.v90ZGuZc2kAATp6BHJ/WV5KS",
        permissions: "*"
    }]
},

Ne modifiez pas les permissions. Changez le nom de l’utilisateur si vous voulez et collez l’empreinte générée précédemment. Pour la coller, placez le curseur avec les flèches puis clic droit et coller entre les guillemets.

Si vous ne voulez pas que Node-RED soit accessible depuis un autre ordinateur du réseau, dé-commentez la ligne uihost

uiHost: "127.0.0.1",

Mise en service

Tout est prêt. Commençons par redémarrer Nginx

sudo systemctl reload nginx

Puis, on redémarre Node-RED

sudo systemctl start node-red

Il ne vous reste plus qu’à nous connecteur avec la nouvelle adresse http://node-red.securise.com.

A la première connexion, le navigateur (Firefox en l’occurrence) va refuser la connexion et vous signaler que le certificat n’est pas valide. Comme nous avons créé un certificat auto-signé à l’aide d’OpenSSL c’est parfaitement normal.

Il suffit simplement d’ajouter une règle d’exception avant de continuer.

Saisissez votre identifiant et mot de passe

Et voilà, vous êtes maintenant connecté à Node-RED de manière plus sécurisée.

Liens utiles

Avez-vous aimé cet article ?