Blog de Florent Appointaire

Blog sur les technologies Microsoft (Windows Server, System Center, Azure, Windows Azure Pack/Azure Stack, etc;)
    • 21/12/2016

    [ADFS] Authentification avec un certificat

    Ayant marre d'écrire mon nom d'utilisateur/mot de passe à chaque fois, j'ai décidé d'implémenter l'authentification avec un certificat. Je vais donc vous expliquer comment faire. Vous pouvez également utiliser ce tutoriel pour le MFA (Multi Factor Authentication). Seul la configuration ADFS changera.

    Pour commencer, vous devez avoir une PKI d'entreprise (vous pouvez lire cette très bonne série d'articles de mon collègue Romain :) ) et un ou plusieurs serveurs ADFS fonctionnelles.

    Une fois que vous avez ces prérequis, vous pouvez commencer. La première chose à faire est de déployer un template dans votre PKI. Ce template, de type Client Authentication, vous donnera la possibilité de vous authentifier, via un certificat. Allez dans la console Certification Authority et cliquez sur Certificate Template puis Manage. Dupliquez le certificat User. Je vais lui donner le nom de User_adfs:

    Donnez ensuite la possibilité de faire un Autoenroll à un groupe, ou aux utilisateurs authentifiés:

    Retournez sur la console Certification Authority et cliquez sur Certificate Template puis New > Certificate Template to issue et choisissez votre certificat User_adfs pour publier votre certificat:

    Nous allons maintenant activer l'auto enrollement via GPO. Comme ça, dès que un utilisateur va se logguer sur sa session pour la première fois, un certificat lui sera généré. Modifiez votre GPO de base, et allez dans User Configuration > Policies > Windows Settings > Security Settings > Public Key Policies. Activez la GPO avec le paramètre Auto-Entollment et modifiez la comme dans ma capture:

    Si vous faites gpupdate /force sur un serveur/laptop avec votre utilisateur actuel, un certificat sera généré:

    La partie autoenrollment fonctionne donc correctement. La prochaine étape est de modifier l'ADFS pour utiliser ce certificat. Mon ADFS étant en server core, je vais faire ces modifications en PowerShell. 

    Commençons par ouvrir le port 49443 en TCP IN sur nos serveurs WAP, si vous en avez, sinon, sur votre ADFS. C'est un prérequis pour utiliser l'authentification via certificat: https://blogs.technet.microsoft.com/pauljones/2014/06/10/adfs-needs-port-49443/

    Je vais exécuter les commandes suivantes, pour rajouter l'authentification via certificat disponible, en plus de la partie Windows authentication, etc. La première partie de la commande modifie pour les utilisateurs qui sont dans l'intranet, et l'autre depuis Internet. Je redémarre ensuite le service et vérifie que les paramètres sont bien appliqués:

    Set-AdfsGlobalAuthenticationPolicy -PrimaryIntranetAuthenticationProvider CertificateAuthentication, WindowsAuthentication, FormsAuthentication, MicrosoftPassportAuthentication
    Set-AdfsGlobalAuthenticationPolicy -PrimaryExtranetAuthenticationProvider CertificateAuthentication, FormsAuthentication, MicrosoftPassportAuthentication
    Restart-Service adfssrv
    Get-AdfsGlobalAuthenticationPolicy

    N'oubliez pas que vous pouvez également faire ceci pour le MFA.

    Je vais maintenant lancer une application qui utilise mon ADFS, Windows Azure Pack. Comme vous pouvez le voir, je peux m'authentifier avec un utilisateur/mot de passe ou avec un certificat:

    Si je choisis l'option avec certificat, mon store personel avec les certificats est listé, et je peux choisir le certificat qui convient:

    Après l'avoir choisi, je suis connecté, avec le bon compte utilisateur associé à ce certificat:

    Enjoy :)

    • 16/12/2016

    [Docker] Image2Docker: Bye bye IIS sur Windows Server, Hello IIS sur Windows Containers

    Image2Docker est un outil de conversion de certains de vos rôles Windows Server vers des Containers docker (sur Windows, évidemment).

    Avec cette nouvelle version, il est possible d'extraire les sites web ASP.NET pour les faire tourner dans des conteneurs. Pour commencer, j'ai créé une VM avec 3 sites ASP.NET. Voici la vue depuis IIS Manager:

    Et la vue depuis Internet Explorer:

    Ici, nous allons migrer le site web WebApiApp. Pour commencer, sur la machine d'où vous voulez convertir ces sites, installez le module PowerShell Image2Docker:

    Install-Module Image2Docker

    Voici les rôles qu'il est possible de convertir en conteneur windows:

    Maintenant, copiez le VHD ou VHDX où sont stockés les sites web. Exécutez la commande suivante pour extraire tous les sites web:

    ConvertTo-Dockerfile -ImagePath C:\Temp\FLOAPP-IIS01_OS.vhdx -OutputPath C:\Temp\GlobalIIS -Artifact IIS -Verbose

    L'argument ImagePath contient le chemin vers votre VHD/VHDX, le paramètre OutputPath est le chemin où les fichiers seront copiés et enfin, le paramètre Artifact est IIS pour préciser de s'occuper que des sites web et rien d'autre. Après quelques instants, vos sites sont extraits:

    Comme vous le voyez, un fichier Dockerfile est apparu. Ce fichier contient tous les paramètres nécéssaires pour créer une image WindowsServerCore sur un container, ajouter les features IIS pour exécuter des sites web ASP.NET, copiez les sources dans le bon dossier IIS du container, créer le site web associé et enfin, exposer le port publiquement:

    Je vais maintenant extraire un seul site, en rajoutant le paramètre ArtifactParam suivi du nom du site web:

    ConvertTo-Dockerfile -ImagePath C:\Temp\FLOAPP-IIS01_OS.vhdx -OutputPath C:\Temp\WebApiApp -Artifact IIS -ArtifactParam WebApiApp -Verbose

    Voici le Dockerfile associé, avec cette fois, un seul site web à créé, ce qui est normal, car j'ai demandé l'extraction d'un seul site:

    Nous allons maintenant créer l'image docker à partir de ce Dockerfile. Pour créer l'image, déplacez vous dans le dossier où est le Dockerfile et exécutez la commande suivante. Vous pouvez modifier le nom de l'image qui est dans mon cas florentapp/webapiapp:

    cd C:\Temp\WebApiApp
    docker build -t florentapp/webapiapp .

    Créez maintenant un container à partir de cette image. Pour ma part, j'expose le port 8080 que je lie avec le port 8080 du site web qui est sur mon container. Je lui donne également le nom webapiapp. La commande docker logs me donne l'information des logs du container, et notamment le moment quand le service IIS est démarré:

    docker run -d -p 8080:8080 --name webapiapp florentapp/webapiapp
    docker logs webapiapp

    Utilisez ensuite la commande docker inspect pour retrouver l'adresse IP de votre container:

    docker inspect webapiapp

    Avec Internet Explorer, vous pouvez accéder à votre site web qui est sur votre container:

    http://172.19.136.162:8080

    Sur le serveur qui exécute le container IIS, vous aurez pour chaque container IIS un service w3wp qui sera créé.

    En espérant que ce script vous aidera à migrer rapidement vos sites web vers des containers Windows.

    Si vous avez des questions, n'hésitez pas :)