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=adfs.vemotech.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