Rendre accessible le portail d'authentification depuis un reverse Proxy Nginx

Formation Libérez tout le potentiel de Microsoft ADFS

Tutorial Thumbnail

Il arrive que dans certains cas vous n'ayez pas plusieurs adresse IP à dédier pour un service particulier. Fort heureusement, il existe un serveur capable de résoudre ce problème et ainsi derrière une adresse IP publique de distribuer chaque service derrière un sous domaine de son choix (par exemple : mail.domain.com pour le serveur de messagerie, www.example.com pour le serveur Web...). Il existe de nombreuses solutions proposant ce service comme Apache2, Nginx ou bien HAProxy.


Dans notre cas, nous souhaitons ouvrir l'accès sur un sous-domaine particulier à notre portail d'authentification ADFS. Ainsi, au cours de ce tutoriel, nous allons voir l'intégration du serveur ADFS avec un reverse proxy Nginx.


Mise en situation

Lors d'une connexion directe ou d'une demande cURL à un point de terminaison ADFS 3.0 à partir d'une machine exécutant Nginx, tout semble aller bien, mais dès qu'il tente de transmettre la demande via une instruction Through, l'utilisateur reçoit une erreur HTTP avec le code 502 ou 503.


La machine exécutant ADFS ne fournit pas d'autres services Web. Il n'y a pas d'instance IIS sur le serveur. Il est correctement configuré avec des certificats TLS valides pour les domaines approuvés par le magasin de certificats de la machine Nginx.


Il s'avère que s'il s'agit du seul service HTTPS fourni nativement via HTTP.sys, quel certificat à présenter par défaut doit être explicitement configuré. Apparemment, il manque quelque chose à la requête passant par Nginx (prise de contact SNI ?) Qui permet à HTTP.sys de choisir le bon certificat à présenter.


Donc, si et seulement si vous êtes sûr que ADFS est le seul service HTTPS que vous servez sur la machine interne, vous pouvez forcer le bon certificat à être présenté par défaut, ce qui résout ce problème et permet aux requêtes par proxy inverse de Nginx de passer.


Serveur ADFS

Récupérer le Hash du certificat & l’ID d’application

Sur le serveur ADFS, on récupère dans un premier temps le hash du certificat de communication du service ADFS.

Dans la console ADFS, allez dans la section Service > Certificats > Communications du service, puis clic droit, puis "Afficher le certificat" :




Vous pouvez également récupérer cela en ligne de commandes et copier le Hash du certificat :

PS C:\> netsh http show sslcert


Vous devez noter l’AppID (ID de l'application) et le hachage du certificat (ou le CertHash) du service ADFS :

  • FQDN Hôte:Port        : adfs.domain.fr:49443
  • Hachage du certificat   : c05b0b6ead7e3c1869f29a0a16e770a604252b97
  • ID de l'application     : {5d89a20c-beab-4389-9447-324788eb944a}


Le hash d'un certificat TLS est une empreinte numérique unique qui identifie le certificat.


Définissez le certificat par défaut pour HTTP.sys

Par défaut, l'ADFS n'est joignable uniquement par le FQDN spécifié lors de l'installation du serveur ADFS. Cependant, nous devons autoriser une connexion sur l'adresse IP du serveur depuis n'importe où, sur le port 443.


Nous utiliserons le mode interactif de netsh, en ligne de commande de Windows.

PS C:\> netsh
PS C:\> netsh> http
PS C:\> netsh http> add sslcert ipport=0.0.0.0:443 appid={AppID} certhash=CertHash


Attention à bien garder les accolades autour de l’AppID, mais pas le CertHash.


La commande "netsh http add sslcert" est utilisée pour configurer un certificat TLS sur toutes les adresses de l'ADFS.

Les paramètres de la commande sont les suivants :

  • "ipport=0.0.0.0:443" : adresse IP et le port d'écoute de la WebUI de l'ADFS. Dans cet exemple, le site est configuré pour écouter toutes les adresses IP sur le port 443, qui est le port par défaut pour les connexions HTTPS.
  • "appid={AppID}" : ID de l'application associée au site web. Cela permet de lier le certificat SSL à l'application.
  • "certhash=CertHash" : Hash du certificat SSL qui sera utilisé pour sécuriser le site web.


Exemple :

PS C:\> netsh
PS C:\> netsh> http
PS C:\> add sslcert ipport=0.0.0.0:443 appid={5d89a20c-beab-4389-9447-324788eb944a} certhash=0e3d5ad3c205881778479bf916b1bc7317ead9ed certstorename=MY


Applicable si jamais sur un domaine de son choix :

PS C:\> netsh
PS C:\> netsh> http
PS C:\> add sslcert hostnameport=antoine.exer.fr:443 certhash=0e3d5ad3c205881778479bf916b1bc7317ead9ed appid={5d89a20c-beab-4389-9447-324788eb944a} certstorename=MY



Nous devons réussir à nous y connecter, en tentant d'y accéder directement avec l'adresse IP du serveur ADFS.


Ajouter les paramètres proxy_pass sur Nginx

Enfin, sur notre reverse proxy, nous devons rajouter des en-têtes serveurs afin de communiquer avec le serveur ADFS. Ajoutez les instructions suivantes dans votre fichier de configuration Nginx :

# Définitions de base du proxy
proxy_redirect off;
proxy_http_version 1.1;

# Augmenter taille de l'en-tête (afin d'avoir une erreur 500 : upstream sent too big header)
proxy_busy_buffers_size  512k;
proxy_buffers  4 512k;
proxy_buffer_size  256k;

# Définition du serveur proxy pour ADFS
more_set_headers "X-MS-Proxy: <IP_REVERSE_PROXY>";
more_set_headers "<YOUR_ADFS_FQDN>";


Pour des applications paramétrées avec une connexion SSO avec l'ADFS comme par exemple avec Exchange, rajoutez uniquement les en-têtes nécessaires afin d'augmenter la taille :

# Augmenter taille de l'en-tête (afin d'avoir une erreur 500 : upstream sent too big header)
proxy_busy_buffers_size 512k;
proxy_buffers 4 512k;
proxy_buffer_size 256


La connexion devrais normalement se faire ! 🎉



Sources :

  • Merci à Peter UPFOLD : https://peter.upfold.org.uk/blog/2016/05/31/reverse-proxying-adfs-with-nginx/

Niveau Débutant

Prérequis :

Proposer une modification
Antoine
Par Antoine
Rédigé le Dimanche 11 Juin 2023