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.
Sommaire
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
- Article inspiré de cet article
Avez-vous aimé cet article ?