NGINX partie 1 : Mettre en place un reverse-proxy pour Unifi


Mettre en place un contrôleur UniFi unique est très simple, mais dans des environnements de production, il est souvent nécessaire d’aller un peu plus loin que la simple mise en route d’une VM et d’y installer les paquets appropriés. En effet, il est généralement judicieux de faire appel à la magie du failover ou du load balancing (mise en place décrite dans cet article), mais aussi au reverse-proxy.

A quoi un reverse-proxy pourrait-il bien servir, me direz-vous. À ne pas exposer l’entièreté du serveur au grand public, pour commencer, mais aussi à tirer parti du cache qu’offre le reverse proxy. Ceci dans le but d’accélérer les requêtes par exemple.
Enfin, le reverse-proxy peut s’avérer très utile si on ne possède qu’un nom de domaine (avec ou sans sous-domaine), mais que l’on souhaite mettre en place plusieurs “points d’entrée” (Par exemple : https://unifi.domaine.fr et https://unms.domaine.fr ou encore https://tech.domaine.fr/unifi ou https://tech.domaine.fr/unms qui pointeront sur le même reverse-proxy qui fera l’aiguillage vers les machines correspondantes).

C’est ce dernier aspect du reverse-proxy que nous allons mettre en place dans cet article.
– Nous commencerons par installer et configurer Nginx pour exposer notre point d’entrée,
– nous installerons et configurerons Certbot (L’ensemble de scripts pour automatiser letsencrypt) pour installer des certificats TLS valides,
– enfin nous testerons le tout afin de s’assurer que tout fonctionne.

Certains aspects de la configuration ne seront pas traités par cet article et seront considérés acquis ou déjà en place. Si vous souhaitez en savoir plus sur certains de ces aspects, je vous conseille les excellents tutos DigitalOcean, et bien sûr tous les autres.

Pour ce qui est de la configuration, nous considèrerons ici que la machine est installée sous Ubuntu 16.04 (LTS), le réseau configuré et apt à jour. Dans mon cas, la machine est installée en local uniquement (zone Labo isolée, sur une infra dédiée), derrière un pare-feu depuis lequel je configurerai des redirections de ports vers le reverse-proxy :

80 (http)
443 (https)
8080 (adoptions des périphériques UniFi)
– 3478 (STUN pour la communication entre les périphériques UniFi et le contrôleur)
6789

La liste des ports utilisé par Unifi est disponible sur le site Ubiquiti à cette adresse : https://help.ubnt.com/hc/en-us/articles/218506997-UniFi-Ports-Used

Nous partons également du principe que vous possédez déjà un nom de domaine qui pointe vers l’adresse IP de votre infrastructure (Firewall, Machine, etc …) et un UniFi controller, peut en importe la version.


Nous aurons au final l’architecture suivante :



Installation et configuration de Nginx

Pour l’installation de Nginx, je vous dirige vers le tuto de DigitalOcean qui est très complet : https://www.digitalocean.com/community/tutorials/how-to-install-nginx-on-ubuntu-16-04

Une fois que vous avez un Nginx fonctionnel (Une page “Welcome to Nginx” s’affiche lorsque pour entrez l’adresse IP de la machine dans un navigateur), il faut passer à la configuration de ce dernier.

On va configurer le serveur pour “servir” du contenu à l’adresse unifi.lab.oxyline.ovh. On commence par se rendre dans le répertoire de configuration des hôtes virtuels de Nginx

$ cd /etc/nginx/conf.d/

Nous allons éditer notre propre fichier de conf : unifi.conf. Ce fichier est automatiquement ajouté à la conf de nginx (Directive include dans le fichier de conf général de Nginx)
J’explique dans les commentaires l’utilité des différentes parties

$ sudo vi unifi.conf



# On sert sur le port 80 pour rediriger vers le 443
server {
        listen 80;
# On écoute sur toutes les interfaces mais seuls les appels à l'adresse ci-dessous déclencheront le traitement de notre fichier de conf
        server_name unifi.lab.oxyline.ovh;
	return 301 https://$host$request_uri;
}

server {
        listen 443 ssl;
        server_name     unifi.lab.oxyline.ovh;

# On logue les acces et les erreurs dans leur journaux respectifs
        error_log  /var/log/nginx/unifi-443-error.log;
        access_log  /var/log/nginx/unifi-443-access.log;

# Partie importante pour s'affranchir des erreurs "Websocket connexion error" sur l'interface de l'UniFi. Dans les grandes lignes, on gère les alertes 
# dynamiques sur le dashboard UniFi qui seront (En développement et disponibles dans les prochaines versions de UniFi) véhiculées par websockets. 
# Plus d'infos : https://en.wikipedia.org/wiki/WebSocket
location /wss/ {
                proxy_pass https://lab-ubnt-uni01.lab:8443;
                proxy_http_version 1.1;
                proxy_buffering off;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection "Upgrade";
                proxy_read_timeout 86400;
}

# C'est ici que tout se joue. C'est avec ce bloc qu'on passe nos requêtes au serveur UniFi (Appelé Upstream) 
 location / {
        proxy_pass_header Authorization;
        proxy_pass https://lab-ubnt-uni01.lab:8443/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
	}

# Cette partie est également importante, elle servira pour le renouvellement des certificats par LetsEncrypt. 
 location /.well-known/acme-challenge/ {

	root /usr/share/nginx/html;
	}

}

On créé le répertoire /usr/share/nginx/html pour que Nginx puisse l’exposer au besoin

$ sudo mkdir /usr/share/nginx/html

Pour la suite, et pour que Certbot (que nous installerons juste après) ai conscience de l’existence de notre configuration il faut l’activer. Pour le faire c’est très simple, il nous suffit de redémarrer Nginx.

$ service nginx restart

On enregistre et on lance la commande

ubntrvs@lab-ubnt-rvs01:/etc/nginx/conf.d$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Nous avons à présent notre config prête. Il nous reste à installer LetsEncrypt pour demander et récupérer des certificats valides.

Installation et configuration de Certbot (LE)

Certbot, c’est le petit robot qui va vous simplifier la vie côté automatisation de l’obtention de vos certificats avec LetsEncrypt.

Comme pour l’installation de Nginx, je vous suggère le tuto de DigitalOcean pour installer LE : https://www.digitalocean.com/community/tutorials/how-to-secure-nginx-with-let-s-encrypt-on-ubuntu-16-04

En résumé, on ajoute le repo, on met à jour les dépôts, et on installe Certbot

sudo add-apt-repository ppa:certbot/certbot
sudo apt-get update
sudo apt-get install python-certbot-nginx

Et après, on demande notre certificat :

sudo certbot --nginx -d unifi.lab.oxyline.ovh

Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator nginx, Installer nginx
Enter email address (used for urgent renewal and security notices) (Enter 'c' to
cancel): votre.adresse@email.com

Repondez “A” pour accepter les termes, puis oui ou non si vous souhaitez communiquer votre adresse email. Vous verrez Certbot aller modifier le fichier de conf précédemment écrit par nos soins juste au dessus.

Obtaining a new certificate
Performing the following challenges:
http-01 challenge for unifi.lab.oxyline.ovh
Waiting for verification...
Cleaning up challenges
Deploying Certificate to VirtualHost /etc/nginx/conf.d/unifi.conf

La prochaine question permet à Certbot de savoir s’il doit, ou non, modifier notre configuration pour y ajouter une redirection HTTP -> HTTPS. Nous répondrons non (Choix 1) car nous l’avons déjà pris en compte dans notre configuration.

Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: No redirect - Make no further changes to the webserver configuration.
2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for
new sites, or if you're confident your site works on HTTPS. You can undo this
change by editing your web server's configuration.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 1
Redirecting all traffic on port 80 to ssl in /etc/nginx/conf.d/unifi.conf

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Congratulations! You have successfully enabled https://unifi.lab.oxyline.ovh

You should test your configuration at:
https://www.ssllabs.com/ssltest/analyze.html?d=unifi.lab.oxyline.ovh
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/unifi.lab.oxyline.ovh/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/unifi.lab.oxyline.ovh/privkey.pem
   Your cert will expire on 2019-05-30. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot again
   with the "certonly" option. To non-interactively renew *all* of
   your certificates, run "certbot renew"
 - Your account credentials have been saved in your Certbot
   configuration directory at /etc/letsencrypt. You should make a
   secure backup of this folder now. This configuration directory will
   also contain certificates and private keys obtained by Certbot so
   making regular backups of this folder is ideal.
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

Certbot gère le redémarrage de Nginx. Tout doit rouler à présent et si votre upstream (le serveur UniFi) fonctionne bien, vous devez pouvoir vous connecter dessus à l’adresse que vous aurez défini (Dans notre cas, http(s)://unifi.lab.oxyline.ovh).

Une jolie adresse avec HTTPS et un certificat valide



0 0 votes
Évaluation de l'article
S’abonner
Notification pour
guest
2 Commentaires
Le plus ancien
Le plus récent Le plus populaire
Commentaires en ligne
Afficher tous les commentaires
Webmail
Webmail
26 mars 2019 17 h 04 min

plus de nouveau articles? j’attend la partie 2 moi