Archives de catégorie : Web Application Proxy

Dépannage des publications Web Application Proxy avec Kerberos Constrained Delegation

Vous avez vraiment cru que je ferai un truc simple comme annoncé dans mon billet Kerberos Constrained Delegation avec Web Application Proxy expliquée? Je déconnais. L’application simple, c’est SharePoint 2013. J’avais déjà abordé Web Application Proxy dans le billet « Quand Windows Azure Pack rencontre Web Application Proxy (WAP versus WAP) » pour publier le portail est les API des tenant à l’extérieur. Ça c’était simple. Maintenant on passe la vitesse supérieure.

Pour ce billet, je pars du principe que les éléments suivants sont en place :

  • Vos contrôleurs de domaine reposent sur Windows Server 2012 minimum
  • Votre infrastructure ADFS est en place et opérationnelle (ADFS 3.0, donc Windows Server 2012 R2)
  • Votre serveur Web Application Proxy est déjà en place et membre du domaine
  • Votre infrastructure SharePoint 2013 est en place
  • Votre application dans SharePoint 2013 a été correctement configurée pour utiliser Windows Integrated Authentication (WIA) et plus précisément Kerberos

Coté SharePoint, je n’ai donc qu’un seul prérequis, mais un prérequis de taille, celui que notre front-end accepte d’utiliser des tickets Kerberos pour l’authentification et non pas du NTLM. En fait, rien que ça, c’est pas si simple que cela. De nombreux billets sont consacrés sur ce thème. Que l’admin SharePoint qui n’a pas transpiré lors de l’activation de l’authentification Keberos sur une ferme SharePoint se lève, je veux le voir, … Donc Si votre ferme SharePoint 2013 est correctement configurée, on peut continuer.

Pourquoi Kerberos?

Par défaut, SharePoint connais les méthodes d’authentifications suivantes :

  • Windows Integrated Authentication
  • Form-Based Authentication
  • SAML token-based authentication

Le dernier repose sur une mise en œuvre intégrée avec ADFS. Sur le papier c’est sexy mais c’est un poil compliqué à mettre en œuvre. Si nous n’avions que des utilisateurs externes (genre partenaires ça a du sens mais de moins en moins avec les solutions hybride). En plus dans un contexte de publication avec Web Application Proxy, c’est tellement simple à mettre en œuvre, presque trop simple.

Le Form-Based Authentication est le plus simple à mettre en œuvre mais dans ce cas, aucune chance de pouvoir faire de la pré-authentification en DMZ avec notre Web Application Proxy. Par exclusion, il ne reste qu’un seul choix : Windows Integrated Authentication.

WIA pour les intimes. Avec lui, on peut faire de la pré-authentification et même du SSO. Problème qui dit SSO, dit aussi Kerberos obligatoire. Le Windows Integrated Authentication n’est qu’un fournisseur qui permet de négocier une méthode d’authentification parmi une liste bien fournie :

  • Kerberos
  • NTLM
  • Digest
  • Basic

Exit les deux derniers et NTLM, on fait tout ce qu’on peut pour s’en débarrasser. Du point de vue de Web Application Proxy, on va fonctionner en Kerberos-Constrained Delegation. Cela signifie qu’une fois authentifié via l’ADFS Proxy (porté par WAP), le WAP va négocier et présenter un ticket Kerberos au nom de l’utilisateur connecté. Pourtant, celui qui fera la demande, c’est le compte de service ADFS. Si vous avez bien tout suivi, en toute logique, notre serveur WAP est donc membre du domaine ou alors membre d’un domaine avec lequel on dispose d’une relation d’approbation bidirectionnelle. Allez relire la section correspondante du document cité dans mon précédent billet.

Subtilités de mise en œuvre

La mise en œuvre est détaillé chez Microsoft à cette URL. Ça aide pas beaucoup pour SharePoint 2013. Une petite recherche sur Internet devrait vous aider sur ce sujet. Passons un peu de temps coté Web Application Proxy. Dans l’interface de configuration de WAP, on ne trouve pas le choix Kerberos Constrained Delegation. C’est vrai. Procédons par élimination. Si on choisissait « Pass-Throught », WAP ne serait utilisé que pour sa fonction de reverse-proxy HTTPS. L’authentification serait déportée sur le frontal SharePoint 2013, pas de Kerberos, pas de SSO. Logiquement, ce sera donc le choix « Active Directory Federation Services (ADFS).

clip_image001

 

Si on continue dans cette logique, on doit sélectionner un ADFS Relying Party. Dans une infrastructure ADFS 3.0 (Windows Server 2012 R2) fraichement installée, on nous propose un unique choix : Device Registration Service. Ce que nous recherchons, c’est une fournisseur d’identité auquel on va soumettre la demande d’authentification pour notre application publiée.

clip_image002

 

L’astuce, c’est comment faire consommer le Claims à notre SharePoint 2013 qui n’a aucune idée de ce que c’est. Lui, c’est WIA (Kerberos) ou rien. La réponse se trouve dans ADFS. Les applications dites « Claims-Aware » reconnaissent en ADFS un fournisseur d’identité de confiance qu’elles peuvent solliciter pour authentifier les utilisateurs. Pour cela on déclare un « relying Party » qui permet d’établir un lien de confiance entre l’infrastructure ADFS et l’application qui va venir consommer ce service. Le problème, c’est que notre SharePoint 2013, tel qu’il est configuré, il est tout sauf « Claims-Aware ». C’est pour cette raison que dans ADFS 3.0, on peut déclarer deux types de Trusts :

clip_image003

 

Les « Non-Claims Aware relying party trusts » ont été introduit pour les applications qui ne savent pas traiter les claims mais qui connaissent WIA. Le Welcome Screen du wizard de la console ADFS est très clair sur ce point.

clip_image004

 

Vu que notre application ignore le concept de claims, on a pas besoin de décrire le contenu du claims à construire, ni à configurer la dite application pour utiliser notre infrastructure ADFS comme fournisseur d’authentification. Les options configurables sur un « Non-Claims Aware relying party trust » sont :

  • Un nom unique clairement identifiable
  • Le fait d’utiliser un facteur d’authentification tier (Multi-Factor Authentication) et les exigences qui vont avec

 

Au final, notre utilisateur obtiendra bien un claims ADFS mais vu qu’il aura été délivré par un Relying Party ne supportant pas les Claims, notre serveur WAP devra jouer de sa personne et obtenir un ticket Kerberos pour le compte de l’utilisateur. C’est là que la Kerberos Constrained Delegation rentre en jeu.

Quelques points de configuration

Pour pouvoir déboguer le bouzin, il faut déjà avoir du contenu. Le problème, c’est que dans sa configuration par défaut, notre infrastructure ADFS ne journalise pas tout. Un peu de Powershell Get-AdfsProperties | Select Loglevel. Rien sur les authentification en elle-même, aucune trace des accès réussi ou des échecs. Certes on pourra retracer les jeton Kerberos mais si c’est pas Kerberos qui est en cause, ça va pas nous aider.

clip_image005

 

Pour cette raison, je recommande de reconfigurer l’attribut LogLevel de la manière suivante : Set-AdfsProperties -LogLevel $((Get-AdfsProperties).LogLevel + « SuccessAudits » + « FailureAudits »)

Get-AdfsProperties | Select Loglevel

clip_image006

 

Qu’est-ce que ça change me direz-vous. Tout.

clip_image007

 

On découvre qu’on est maintenant en mesure de journaliser les authentifications réussies et échouées mais qu’il faut encore un peu plus de travail. Plus précisément, il faut permettre à ADFS de générer des évènements dans le journal de sécurité, c’est un droit qui a été octroyé lors de l’installation d’ADFS. Le compte de service utilisé par ADFS a été configuré pour avoir le privilège de générer des évènements de sécurité.

clip_image008

Note : Si vous avez des GPO qui configurent les droits utilisateurs, pensez à repositionner le privilège, sinon ADFS n’aura rien à vous dire.

Enfin, il faut indiquer ce que l’on veut auditer. Pour les applications, on a un journal spécial nommé « Application Generated ». Avec la commande AuditPol.Exe, on constate que par défaut, ce journal ne contiendra rien. AuditPol.Exe /Get /Subcategory « Application Generated ».

clip_image009

 

Avec un peu de configuration, on arrive à corriger cela.

AuditPol.Exe /Set /SubCategory: »Application Generated » /Success:Enable /failure:Enable

AuditPol.Exe /Get /Subcategory « Application Generated »

clip_image010

 

Dans la GPO locale, c’est plus clair :

clip_image011

 

Pourtant, il reste une subtilité. Nous sommes dans la section « Advanced Audit Policy Configuration » introduite avec Windows Server 2008 R2. Si on remonte d’un niveau, on voit bien que le paramètre précédemment configuré est bien présent. Ce qui m’intéresse, c’est l’avertissement.

clip_image012

 

Allons voir le paramètre qui manque. On a donc besoin de lui.

clip_image013

 

Suivi de bout en bout

Maintenant qu’on a de quoi journaliser les accès, voyons à quoi ressemble un accès utilisateur fonctionnel depuis le Web Application Proxy pour notre application SharePoint 2013 publiée. La première trace, c’est sur le serveur ADFS qu’on va la trouver. C’est notre point de départ. La chose à noter ici, c’est l’Activity ID. Il est unique pour chaque accès, c’est donc lui qui nous permettra de relier les évènements.

clip_image014

Note : L’évènement 403 référence une autre information importante : L’adresse IP source de la demande, donc de notre client.

En suivant l’Activcity ID, on trouve l’évènement 410. Son intérêt, c’est de savoir par quel Endpoint la demande d’accès est arrivée. Avec une infrastructure basique composée d’un seul serveur ADFS c’est facile mais si on a une infrastructure utilisant plus de cinq serveur ADFS (on utilise donc plus le Windows Integrated Database mais une véritable instance SQL Server), ça se complique. En plus, c’est Event nous précise que la demande est arrivée par le serveur Web Application Proxy. C’est un attribut qui sera référencé dans le claims. C’est que qui permettra par exemple d’exiger une authentification additionnelle tel que Multi-Factor Authentication (MFA).

clip_image015

 

Coté ADFS, l’évènement 412 nous indique qu’un jeton a été délivré par notre infrastructure ADFS. L’Activity ID que nous connaissons déjà nous permet de suivre le cheminement de notre demande d’accès. Maintenant, on va garder l’attribut Instance ID dans un coin de notre tête.

clip_image016

 

Car on va suivre l’évènement 501 ou plutôt les évènements 501. Si toutes les informations ne peuvent figurer dans un même évènement, on en aura donc plusieurs. Le lien entre eux, ce sera notre Instance ID. ADFS nous donne le contenu du claims, aussi bien les attributs contenus que les valeurs associées.

clip_image017

 

Dans mon cas, cet évènement est intéressant car il indique les groupes dont mon utilisateur est membre (attribut GroupSid).

clip_image018

 

A ce stade, notre infrastructure ADFS a délivré un claims. Or, notre infrastructure sait que notre application n’est pas Claims-Aware. Elle doit donc demander un ticket Kerberos pour le compte de l’utilisateur qu’elle vient d’authentifier. Sur nos contrôleurs de domaine, on va donc trouver le trace d’un évènement 4768. C’est juste la demande. Au passage, on remarque que celle-ci a été réalisée localement par la mention ::1. Ben oui, sur ma maquette, mon ADFS est installé sur mon contrôleur de domaine, je sais c’est mal.

clip_image019

 

Toujours sur nos contrôleurs de domaine, l’évènement 4769, nous donne un peu plus d’informations, genre l’UPN de l’utilisateur qui fait la demande de ticket Kerberos.

clip_image020

 

C’est maintenant qu’on sait si la délégation Kerberos fonctionne. Notre ADFS tente de l’utiliser pour s’authentifier. On voit bien que c’est le process « C:\Windows\ADFS\Microsoft.Identity.Server.ServiceHost.Exe » qui fait la tentative.

clip_image021

 

L’évènement 4624 nous confirme que la demande d’authentification utilisant mon identité a bien fonctionné. L’évènement précise bien que c’est le compte de service ADFS qui a obtenu une ouverture de session pour mon compte.

clip_image022

 

Dernière étape, le Web Application Proxy. Ça se passe dans le journal « Microsoft-Windows-Web Application Proxy/Admin ». Jusqu’à maintenant mon Web Application Proxy se contentait de jouer son rôle de Proxy ADFS. Maintenant c’est au tour de la publication. Suite à l’authentification, le WAP connecte l’utilisateur en utilisant le Claims ADFS précédemment obtenu. C’est l’évènement 12027 qui va nous intéresser.

clip_image023

 

Pour finir avec l’évènement 14008 qui nous indique que le Web Application Proxy a réussi à présenter le ticket Kerberos obtenu par notre ADFS. On notera que le mode d’authentification auprès du back-end server est bien « Windows Integrated Authentication (WIA) »

clip_image024

 

A ce stade, Web Application Proxy a fini son travail. Si cela échoue à ce niveau, c’est que l’utilisateur connecté n’a pas accès. Il est peut-être pas membre des bons groupes. Si la négociation venait à échouer, c’est que la délégation Kerberos n’est pas correctement configurée, on a alors l’évènement 13022.

clip_image025

Note : Un truc tout bête mais lorsqu’on met en place une nouvelle publication qui repose sur le KDC, on met donc en place de nouveaux SPN sur notre serveur WAP. Pour que ceux-ci soient pris en compte, encore faut-il redémarrer le serveur WAP. Merci pour ce rappel Maxime RASTELLO.

Si cela ne fonctionne toujours pas, il faut se poser les bonnes questions. Pour cela, le document publié par l’équipe produit est excellent. Tout est dit dans l’illustration ci-dessous : clip_image026

 

Conclusion

Si par malheur, notre mise en place ne fonctionne pas avec SharePoint 2013 ou tout autre application, commencez par séparer les problèmes. D’un côté assurez-vous que lorsque vous vous connectez, il y a bien un jeton Kerberos d’obtenu et de présenté, de l’autre utilisez une ressource plus simple que SharePoint 2013 pour tester. Pour cela, je conseille de mettre en œuvre un simple site web IIS tel que documenté ici : Walkthrough Guide: Connect to Applications and Services from Anywhere with Web Application Proxy.

 

Bonus Track

Pour le bonus track, j’ai retenu Windows XP. Par défaut, cela ne fonctionne pas pour ces clients, au motif que seuls les clients supportant SNI sont supportés. Si on observe notre publication WAP au travers d’un outil tel que celui de Qualys SSL Labs. On observe le résultat illustré ci-dessous :

clip_image027

 

Par défaut, c’est donc pas possible. La solution, c’est le mode FallBack de SNI que l’équipe en charge de Web Application Proxy a documenté dans ce billet : How to support non-SNI capable Clients with Web Application Proxy and AD FS 2012 R2.

BenoîtS – Simple and secure by design but Business compliant (with disruptive flag enabled)

Kerberos Constrained Delegation avec Web Application Proxy expliquée

Cela faisait quelques temps que je tournais autour de Web Application Proxy. Tant que les applications que je devais publier utilisaient directement ADFS, pas de problème. Problème, un jour, un client m’a demandé de publier des applications Web avec Web Application Proxy alors que celles-ci reposent uniquement sur l’authentification Windows intégrée. Pour mettre dans l’ambiance, on parle de SharePoint 2013 et d’Exchange 2013.

 

Immédiatement dans mon souvenir est revenu Forefront UAG 2010 et sa prise en charge de la Kerberos constrained delegation. Bref, pas un truc simple, et je confirme. Heureusement, l’équipe qui a conçu Web Application Proxy et Azure Active Directory Application Proxy (les anciens de l’équipe de Forefront UAG Sourire) a eu la bonne idée de publier un document très détaillé sur les mécanismes autour de Kerberos constrained Delegation. Le document ne précise pas le détail de la configuration requise pour SharePoint 2013 et Exchange 2013 mais s’attarde sur tous les Fondamentaux qui s’il sont respectés feront que cela fonctionnera.

 

Je publierai un article plus complet sur le sujet dans les jours prochain, mon client ayant été joueur avec ADFS, il y a des choses à dire. Je ne vais donc pas de publier une énième guide de publication avec Web Application Proxy mais m’attarder sur ce qui se passe sous la moquette. Dommage que ce document n’ai pas été publié avant, …

 

BenoîtS – Simple and secure by design but Business compliant (with disruptive flag enabled)

Web Application Proxy erreur 0x8007520C

Ça faisait quelques temps que j’avais pas mis les mains dans ma plateforme Windows Azure Pack. C’est lors de la séquence de patch management mensuelle que je suis tombé sur ce problème.

Problème

Mon WAP (Web Application Proxy) qui ne démarrait plus.

clip_image001

Dans les faits, le service ADFS (adfssrv) est bien démarré mais le service Web Application Proxy (AppProxySvc) refuse de démarrer. Il indique même une erreur 401. En cherchant un peu dans le journal « AD FS/Admin », on nous parle d’accès refusé (ce qui correspond au code erreur 401) et d’une empreinte de certificat.

clip_image002

Sur la ferme ADFS, on trouve une erreur en corrélation qui fait référence au même certificat avec la même empreinte numérique.

clip_image003

Analyse

On sait maintenant que cela concerne le certificat « ADFS ProxyTrust -WEBAPPROXY ». On voit bien que cela concerne un certificat auto-signé, dont la durée de vie est de quelques jours (10 jours). Vu que mon infrastructure a été offline pendant plus de 10 jours, il est logique que le certificat ne soit plus valide. Ce qu’on a du mal à comprendre, c’est de ne pas retrouver le certificat en question sur le serveur Web Application Proxy. Avec un peu de lecture ici et là, on finit par tomber sur ce billet de l’équipe produit : Understanding and fixing Proxy Trust CTL Issues with AD FS 2012 R2 and Web Application Proxy.

On y découvre que c’est bien un problème d’authentification par certificat. Le certificat auto-signé généré lors de la configuration du Web Application Proxy doit normalement être injecté dans la configuration de la ferme ADFS ainsi que dans le magasin de certificats AdfsTrustedDevices des serveurs de la ferme ADFS. Allons faire un tour dans le magasin certificats de notre serveur Web Application Proxy pour retrouver notre certificat auto-signé :

Get-ChildItem Cert:\LocalMachine\My | Where {$_.Subject -match « CN=ADFS ProxyTrust »} | Format-Table -Property Subject, NotBefore, NotAfter, Thumbprint -Autosize

clip_image004

 

Correction

Il y a beaucoup trop de certificats auto-signés. Beaucoup de tentatives pour corriger le problème mais sans résultat. Le message sur la ferme ADFS nous recommande de refaire l’initialisation du Web Application Proxy, c’est ce que nous allons faire. Pour cela un peu de Powershell pour retrouver le certificat public que nous avons utilisé pour publier notre infrastructure ADFS :

Get-ChildItem Cert:\Localmachine\My | Where {$_.Subject -match « CN=adfs.Windowsazurepack.Fr »} | Format-Table -Property Subject, Thumbprint

$Cred = Get-Credential

Install-WebApplicationProxy -FederationServiceName ‘adfs.windowsazurepack.fr’ -FederationServiceTrustCredential $cred -certificateThumbprint ‘XXXXXXXXXXX’

clip_image005

Maintenant le service est de nouveau opérationnel. Sur la ferme ADFS, on peut constater la présence d’un nouveau certificat auto-signé sur notre serveur Web Application Proxy.

clip_image006

On retrouve la trace de ce même certificat auto-signé dans le conteneur ADFSTrustedDevices sur ma ferme ADFS.

clip_image007

Le Web Application Proxy est de nouveau opérationnel.

clip_image008

Dans le journal « AD FS/Admin », on constate la présence de l’évènement 245, qui reviendra cycliquement toutes les minutes. C’est ce qui nous indique que le Web Application Proxy est bien opérationnel pour sa fonction Proxy de l’infrastructure ADFS.

clip_image009

Ainsi que l’Event 396, nous indiquant que le certificat auto-signé nouvellement généré est bien reconnu par notre ferme ADFS pour authentification.

clip_image010

Conclusion

Ce problème amène deux réflexions :

  • Si votre maquette ADFS n’est pas online en permanence, oubliez le Web Application Proxy dans votre lab.
  • Quand on va renouveler le certificat public de l’infrastructure ADFS, va y avoir un peu de travail

BenoîtS – Simple and secure by design but Business compliant (with disruptive flag enabled)