web-dev-qa-db-fra.com

Intégration de l'authentification Windows dans l'application ASP.NET Docker Container

J'ai créé un conteneur à partir du référentiel Microsoft/aspnet. Je souhaite conteneuriser une application Web ASP.NET 4.x dans IIS dans laquelle je peux obtenir l'utilisateur connecté accédant au site. Je veux être en mesure de tirer parti de l'authentification Windows intégrée car il s'agit d'une application interne.

J'ai créé un réseau transparent pour l'hôte conteneur.

De plus, j'ai configuré l'authentification Windows sur le IIS dans le conteneur. J'ai lu comment créer un compte de service géré de groupe sur l'hôte du conteneur, mais je ne l'ai pas encore fait et non sûr si cela suffit ou je devrais prendre des mesures supplémentaires.

11
Charles Owen

La création d'un compte de service géré de groupe (gMSA) n'est qu'une des étapes à suivre pour que l'authentification Windows fonctionne avec le conteneur. Vous aurez également besoin d'une spécification d'informations d'identification, qui contient des informations sur le gMSA que vous créez, et sera utilisée par le conteneur pour échanger le compte gMSA pour les comptes intégrés (LocalSystem, NetworkService, ApplicationPoolIdentity) utilisés par le pool d'applications de votre application.

En réalité, l'ensemble minimal d'étapes serait:

1) Créez un groupe AD que vous pouvez utiliser pour ajouter les machines qui seront utilisées pour héberger vos conteneurs.

PS> New-ADGroup "Container Hosts" -GroupScope Global
PS> $group = Get-ADGroup "Container Hosts"
PS> $Host = Get-ADComputer "mydockerhostmachine"
PS> Add-ADGroupMember $group -Members $Host

2) Créez votre compte gMSA à utiliser pour votre application:

PS> New-ADServiceAccount -name myapp -DNSHostName myapp.mydomain.local -ServicePrincipalNames http/myapp.mydomain.local -PrincipalsAllowedToRetrieveManagedPassword "Container Hosts"

La valeur de PrincipalsAllowedToRetrieveManagePassword doit être le nom du groupe AD que vous avez créé à l'étape 1.

3) Ensuite, sur chaque conteneur hôte:

une. Installez le module Powershell Active Directory et testez pour voir que vous pouvez utiliser le gMSA à partir de l'hôte:

PS> Add-WindowsFeature RSAT-AD-PowerShell    
PS> Import-Module ActiveDirectory    
PS> Install-AdServiceAccount myapp    
PS> Test-AdServiceAccount myapp

b. Installez le module Crowersential Spec Powershell et créez une spécification d'informations d'identification:

PS> Invoke-WebRequest https://raw.githubusercontent.com/Microsoft/Virtualization-Documentation/live/windows-server-container-tools/ServiceAccounts/CredentialSpec.psm1 -OutFile CredentialSpec.psm1
PS> Import-Module .\CredentialSpec.psm1
PS> New-CredentialSpec -Name myapp -AccountName myapp

c. Maintenant, si tout a été configuré correctement, vous pouvez alors exécuter votre conteneur avec cette spécification d'informations d'identification:

docker run --security-opt "credentialspec=file://myapp.json" -d -p
80:80 -h myapp.mydomain.local [my-image-name:tag]

Une chose à garder à l'esprit avec ce qui précède - assurez-vous que le nom principal du service que vous utilisez lors de la création du gMSA correspond au nom d'hôte (argument -h) du conteneur. Sinon, vous aurez des problèmes si votre application utilise l'authentification Windows pour accéder à d'autres ressources ou services de domaine (par exemple, SQL Server). De plus, si vous allez accéder à d'autres ressources comme SQL Server, assurez-vous également d'accorder les autorisations appropriées au compte gMSA à ces services.

Enfin, lors de la création de votre Dockerfile, n'essayez pas d'attribuer le compte gMSA directement à votre pool d'applications. Utilisez l'un des comptes intégrés et laissez le moteur échanger le compte dans le conteneur pour vous. En d'autres termes, la création de votre pool d'applications dans votre Dockerfile devrait ressembler à quelque chose comme ceci:

RUN Import-Module WebAdministration; `
    New-Item -Path IIS:\AppPools\MyAppPool; `
    Set-ItemProperty -Path IIS:\AppPools\MyAppPool -Name managedRuntimeVersion -Value 'v4.0'; `
    Set-ItemProperty -Path IIS:\AppPools\MyAppPool -Name processModel -value @{identitytype='ApplicationPoolIdentity'}
10
Bart X. Tubalinal