Formation Libérez tout le potentiel de Microsoft ADFS
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.
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.
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 :
Le hash d'un certificat TLS est une empreinte numérique unique qui identifie le certificat.
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.
proxy_pass
sur NginxEnfin, 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 :