Domotique et objets connectés à faire soi-même

Sécuriser Node-RED avec Nginx et OpenSSL sur Ubuntu 16.04

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 :

Répondez aux questions posées

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)

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 :

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 ?
[Total: 0 Moyenne: 0]
Quitter la version mobile