Se connecter à un serveur Windows 2022 Core
Introduction
Comment travailler sur un serveur Core depuis un poste client, sans une interface de plateforme cloud et en sachant que ce poste client n'est pas dans un domaine (et que le serveur n'est pas un contrôleur).
Plusieurs façons de faire à ma connaissance (je rappelle que je ne suis pas un expert Windows du tout, même si j'adore rigoler avec PowerShell).
- 1) La plus simple, c'est le serveur SSH : A installer sur le serveur core (il y a un article à ce sujet)
- 2) La version webadmin ou les outils RSAT... Installer WAC sur votre serveur (Windows Admin Center) (il y a également un article) ou les outils RSAT (à installer sur serveur ET sur client)
- 3) La plus chiante : les sessions powershell distantes en HTTPS avec WinRM
Nous allons essayer la 3)... vous allez voir, c'est pas triste du tout :-D...
Récapitulatif de ce qu'il conviendrait de faire en situation réelle
Pour résumer ce qu'il conviendrait normalement de faire en situation réelle si vraiment on tenait à se servir de WinRM (ce qui n'est clairement pas la meilleure des idées...), voici un récapitulatif :
I - Sur le serveur Core (Cible de la Connexion) :
- Intégrer le certificat SSL reconnu établi spécifiquement pour le serveur Core, à WinRM : Configurer WinRM pour utiliser un certificat SSL validé par une autorité de certification reconnue. Cela garantit une connexion sécurisée et cryptée, à destination du seul serveur Core.
- Créer ou utiliser un Utilisateur Spécifique pour la connexion via WinRM : Créer ou choisir un utilisateur dédié (avec des privilèges restreints) pour les connexions via WinRM. Si nécessaire, créer également le groupe WinRMRemoteWMIUsers__.
- Ajouter l'Utilisateur au Groupe en question : Ajouter cet utilisateur au groupe WinRMRemoteWMIUsers__. Ce groupe permet de limiter l'accès à WinRM sans donner de droits administratifs complets.
- Configurer l'Endpoint WinRM : Utiliser Set-PSSessionConfiguration pour configurer les endpoints WinRM, en limitant l'accès uniquement aux membres du groupe WinRMRemoteWMIUsers__. Il faudra s'assurer de supprimer ou limiter les accès pour les autres groupes ou utilisateurs.
Set-PSSessionConfiguration -Name 'Microsoft.PowerShell' -ShowSecurityDescriptorUI
- Ajouter une règle de Pare-feu pour limiter la surface de connexion : Mettre en place une règle de pare-feu pour n'autoriser les connexions WinRM que de l'adresse IP du client, renforçant ainsi la sécurité de la connexion.
II - Sur le client (Initiateur de la Connexion) :
- Ajouter le serveur Core à la Liste des Ordinateurs de Confiance : Ajouter le serveur Core à la liste des ordinateurs de confiance pour WinRM sur le client. Cela permet de confirmer que le client reconnaît et accepte les connexions sécurisées avec le serveur Core.
Ce que nous allons faire
Ce que nous allons faire à présent est légèrement différent, puisque nous n'allons pas demander de faire certifier notre requête SSL auprès d'une autorité reconnue juste pour faire un test. Nous allons donc générer un certificat auto-signé sur le serveur Core et l'utiliser. La différence avec les étapes ci-dessous, c'est qu'il faudra également intégrer ce certificat au client.
Enfin, nous ne créerons pas l'utilisateur spécifique ni le groupe, nous allons rester très basique. L'idée ici, c'est juste de comprendre la mécanique et de voir comment on peut procéder au transfert de données entre les 2 protagonistes (du client au serveur core) de cette façon. Bien entendu, on peut aussi utiliser robocopy par ce biais.
SUR LE SERVEUR CORE :
1) Créer un certificat auto-signé
(ou importez-en un signé si vous êtes dans ce contexte car ça évitera de devoir ajouter le certificat au magasin du client comme on le fera après).
D'abord, récupérer le nom de votre serveur :
$env:COMPUTERNAME
(on va prendre 'WIN-KAUMG9A63UJ' pour l'exemple)
New-SelfSignedCertificate -DnsName 'WIN-KAUMG9A63UJ' -CertStoreLocation 'Cert:\LocalMachine\My'
(L'empreinte thumbprint et le CN du serveur vont s'afficher.. Pratique, on pourra les copier/coller dans les commandes suivantes)
2) Intégrer le certificat à WinRM :
winrm create winrm/config/Listener?Address=*+Transport=HTTPS '@{Hostname='WIN-KAUMG9A63UJ'; CertificateThumbprint='9E095CBCCF54FCC93024ACB6725DB89D4819E334'}'
(il est preferrable de restreindre la surface de connexion au serveur à la seule adresse IP de votre client plutôt que d'ouvrir à tout le monde. Pour cela, nous allons écrire une règle de pare-feu pour restreindre à une seule adresse IP : 192.168.1.105 par exemple)
Voici le résultat qui confirme que cela a fonctionné :
ResourceCreated
Address = http://shcemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous
ReferenceParameters
ResourceURI = http://schemas.microsoft.com/wbem/wsman/1/config/listener
SelectorSet
Selector: Address = *, Transport = HTTPS
3) Créer la règle de pare-feu restreinte à l'IP de notre client.
New-NetFirewallRule -Name 'WinRM HTTPS' -DisplayName 'WinRM HTTPS' -Enabled True -Direction Inbound -Protocol TCP -Action Allow -LocalPort 5986 -RemoteAddress 192.168.1.105
SUR LE PC CLIENT DISTANT
Ouvrir PowerShell en mode Administrateur
1) Rajouter une correpondance entre l'IP du serveur et son nom d'hôte dans le fichier hosts.
Add-Content -Path 'C:\Windows\System32\drivers\etc\hosts' -Value '`n192.168.1.44`tWIN-KAUMG9A63UJ'
(remplacez 192.168.1.44 et WIN-KAUMG9A63UJ par l'IP et le nom d'hôte du serveur, mais ne touchez pas à `n et `t)
2) Créez un dossier C:\TEMP (ce sera utile pour plus tard)
New-Item -Path 'C:\TEMP' -ItemType Directory
3) Connectez-vous au serveur depuis votre client :
Enter-PSSession -ComputerName 'WIN-KAUMG9A63UJ' -UseSSL -Credential (Get-Credential) -SessionOption (New-PSSessionOption -SkipCACheck -SkipCNCheck)
Vous devrez entrer l'identifiant/mot de passe d'un utilisateur du serveur autorisé à être contacté à distance et vous devez absolument placer les -SessionOption qui ne vérifient pas le certificat..
Autrement la connexion vous est refusée (pour l'instant, nous allons changer cela)
4) Une fois connecté au serveur depuis notre client, il nous faut exporter le certificat auto-signé du serveur
New-Item -Path 'C:\TEMP' -ItemType Directory
$CertPath = 'Cert:\LocalMachine\My'
$Cert = Get-ChildItem -Path $CertPath | Where-Object {$_.Subject -like '*CN=WIN-KAUMG9A63UJ*'}
Export-Certificate -Cert $Cert -FilePath C:\TEMP\server_certificate.cer
5) Déconnectez-vous du serveur :
exit
6) Transférer le certificat du serveur sur le client :
$Session = New-PSSession -ComputerName 'WIN-KAUMG9A63UJ' -Credential (Get-Credential) -UseSSL -SessionOption (New-PSSessionOption -SkipCACheck -SkipCNCheck)
Copy-Item -Path 'C:\TEMP\server_certificate.cer' -Destination 'C:\TEMP\server_certificate.cer' -FromSession $Session
7) Importer le certificat du serveur reçu dans le magasin de certificats du système du client.
Import-Certificate -FilePath 'C:\TEMP\server_certificate.cer' -CertStoreLocation Cert:\LocalMachine\Root
8) Voilà. Vous pouvez désormais vous connecter sans les options -SessionOption.
Enter-PSSession -ComputerName 'WIN-KAUMG9A63UJ' -UseSSL -Credential (Get-Credential)
Envoyer des données (dossiers/fichiers) du poste client au serveur core
(Je veux envoyer le dossier ISO qui se trouve sur le poste client de Marcel vers le serveur Windows Core, dans le dossier C:\TEMP)
$session = New-PSSession -ComputerName 'WIN-KAUMG9A63UJ' -UseSSL -Credential (Get-Credential)
Copy-Item -Path 'C:\Users\Marcel\Documents\VM\ISO' -Destination 'C:\TEMP' -ToSession $session -Recurse
Récupérer des données du serveur Windows depuis le poste client
(vous avez l'exemple du certificat dans la procédure au-dessus, je la remets ici)
$Session = New-PSSession -ComputerName 'WIN-KAUMG9A63UJ' -Credential (Get-Credential) -UseSSL -SessionOption (New-PSSessionOption -SkipCACheck -SkipCNCheck)
Copy-Item -Path 'C:\TEMP\server_certificate.cer' -Destination 'C:\TEMP\server_certificate.cer' -FromSession $Session
Articles connexes
↑ Haut de page