Intégration de Windows Server 2016 core sous KVM/QEMU

Windows Server 2016 core

La version core de Windows Server est globalement moins lourd et plus économe en ressources. Elle ne contient pas les logiciels intégrés de la version Expérience Utilisateur et cela participe à réduire la surface d’attaque du système de Microsoft.

L’intégration de Windows Server 2016 Core sous KVM/QEMU dans mon infrastructure me permet de centraliser mon identification et authentification mais également d’orchestrer mes sauvegardes avec Veeam Backup & Réplication 9.5.

Sommaire :

  1. Intégration de Windows Server dans KVM/QEMU
  2. Configuration de base de Windows Server 2016 Core
  3. Installation et configuration rapide de l’active directory
  4. Conclusion sur Windows Server 2016 Core

Intégration de Windows Server dans KVM/QEMU

Pour commencer, nous allons créer un fichier XML compatible avec notre hyperviseur :

<domain type='kvm' id='10'>
  <name>Windows2016core</name>
  <uuid>154d0X-va57-5fc4-f51c-c5d4fgg4rv</uuid>
  <description>None</description>
  <memory unit='KiB'>2000000</memory>
  <currentMemory unit='KiB'>0000000</currentMemory>
  <vcpu placement='static'>2</vcpu>
  <os>
    <type arch='x86_64' machine='pc-1.1'>hvm</type>
    <boot dev='hd'/>
    <boot dev='cdrom'/>
    <bootmenu enable='yes'/>
  </os>
  <features>
    <acpi/>
    <apic/>
    <pae/>
  </features>
  <cpu mode='host-model'>
    <model fallback='allow'/>
  </cpu>
  <clock offset='utc'/>
  <on_poweroff>destroy</on_poweroff>
  <on_reboot>restart</on_reboot>
  <on_crash>restart</on_crash>
  <devices>
    <emulator>/usr/bin/kvm</emulator>
    <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2'/>
      <source file='/var/lib/libvirt/images/windows2016core'/>
      <target dev='vda' bus='virtio'/>
      <alias name='virtio-disk0'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
    </disk>
    <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2'/>
      <source file='/var/lib/libvirt/images/windows2016core-vtl'/>
      <target dev='vdb' bus='virtio'/>
      <alias name='virtio-disk1'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
    </disk>
        <disk type='file' device='cdrom'>
      <source file='/var/lib/libvirt/iso/Microsoft/fr_windows_server_2016_standard_and_datacenter_x64.iso'/>
      <target dev='hdc' bus='sata'/>
      <readonly/>
    </disk>
    <disk type='file' device='cdrom'>
      <source file='/var/lib/libvirt/iso/Drivers/virtio-windows.iso'/>
      <target dev='hdb' bus='sata'/>
      <readonly/>
    </disk>
    <controller type='usb' index='0'>
      <alias name='usb0'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/>
    </controller>
    <controller type='ide' index='0'>
      <alias name='ide0'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>
    </controller>
    <interface type='network'>
      <mac address='52:54:5f:5v:5v:5v'/>
      <source network='lbr300'/>
      <target dev='vnet13'/>
      <model type='virtio'/>
      <alias name='net0'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
    </interface>
    <serial type='pty'>
      <source path='/dev/pts/0'/>
      <target port='0'/>
      <alias name='serial0'/>
    </serial>
    <console type='pty' tty='/dev/pts/0'>
      <source path='/dev/pts/0'/>
      <target type='serial' port='0'/>
      <alias name='serial0'/>
    </console>
    <input type='tablet' bus='usb'>
      <alias name='input0'/>
    </input>
    <input type='mouse' bus='ps2'/>
    <graphics type='vnc' port='5900' autoport='no' listen='127.0.0.1' keymap='fr'>
      <listen type='address' address='127.0.0.1'/>
    </graphics>
    <video>
      <model type='vga' vram='9216' heads='1'/>
      <alias name='video0'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
    </video>
    <memballoon model='virtio'>
      <alias name='balloon0'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
    </memballoon>
  </devices>
  <seclabel type='none'/>
</domain>

Pour information : il vous faudra adapter certaines balises à votre configuration : chemins des fichiers images,  ISO Windows Serveur et l’emplacement du driver VirtIO ainsi que la balise network et graphics.

Création d’une image disque

Nous débutons la génération d’un fichier image pour le volume C: (minimum de 32Go). Dans mon cas, j’ai créer deux images : une de 50Go (Système) et une de 100Go (Backups) en approvisionnement dynamique :

qemu-img create -f qcow2 windows2016core 50G
qemu-img create -f qcow2 windows2016core-vtl 100G

Nous intégrons notre fichier de configuration XML  : windows2016core.xml dans KVM/QEMU avec virsh :

virsh define windows2016core.xml
virsh start windows2016core

Il est désormais possible en VNC ou via spice (au choix) suivant votre solution de mangement de réaliser l’installation.
Lors du processus d’installation : rien de particulier, il faut laisser le choix par défaut : sans expérience utilisateur.

Les drivers VirtIO de RedHat pour Windows Server 2016

L’intégration des drivers VirtIO contenus dans l’ISO est très importante : lien de téléchargement VirtIO. Elle permet de charger à l’installation de Windows le pilote du bus virtio pour la reconnaissance des images disques avec visostor.
Le pilote NetKVM prends en charge la reconnaissance de la carte réseau – voici le contenu de l’ISO :

Configuration de base de Windows Server 2016 Core

Une fois votre mot de passe administrateur configuré une interface cmd.exe s’affiche. Pour profiter des fonctionnalités de Windows 2016, il est nécessaire de basculer vers PowerShell comme ceci :

start powershell

A chaque connexion, il faut jongler entre cmd.exe et powershell.exe. Je vous invite à changer la valeur d’une clé dans le registre afin de démarrer par défaut avec Powershell :

Set-ItemProperty -Path 'HKLM:SOFTWAREMicrosoftWindows NTCurrentVersionWinlogon' -Name Shell -Value 'PowerShell.exe -NoExit'

Bien débuter, c’est également lancer la commande serveur configuration du mode core :

sconfig

Un menu apparaît avec différents choix numérotés de 1 à 15, voici serveur actuellement :

Microsoft (R) Windows Script Host Version 5.812
Copyright (C) Microsoft Corporation. Tous droits réservés.

Inspection en cours du système...

===============================================================================
                         Configuration du serveur
===============================================================================

1) Domaine ou groupe de travail :               Domaine:  kassianoff.local
2) Nom d’ordinateur :                           DC-W2K16
3) Ajouter l’administrateur local
4) Configurer l’administration à distance       désactivé

5) Paramètres de Windows Update :               Manuel
6) Télécharger et installer les mises à jour
7) Bureau à distance :                          Activé (tous les clients)

8) Paramètres réseau
9) Date et Heure
10) Paramètres de télémétrie                  Sécurité
11) Activation de Windows

12) Fermer la session utilisateur
13) Redémarrer le serveur
14) Arrêter le serveur
15) Quitter pour revenir à la ligne de commande

Entrez un nombre pour sélectionner une option :

Pour commencer, je vous invite à renommer l’ordinateur, à modifier les paramètres réseau et vérifier la date et l’heure.
Pour le reste ceci est une question d’appréciation personnelle. Une fois fait : un redémarrage est nécessaire.

Nous allons dès lors initialiser le second disque présent sur le serveur de 100GB :

Get-Disk |
Where partitionstyle -eq 'raw' |
Initialize-Disk -PartitionStyle MBR -PassThru |
New-Partition -AssignDriveLetter -UseMaximumSize |
Format-Volume -FileSystem NTFS -NewFileSystemLabel "disk2" -Confirm:$false

Pour lister les volumes présents sur le serveur :

Get-PSDrive -PSProvider 'FileSystem'

Name           Used (GB)     Free (GB) Provider      Root                                               CurrentLocation
----           ---------     --------- --------      ----                                               ---------------
C                  15,60         33,91 FileSystem    C:                                               Windowssystem32
D                   0,29          0,00 FileSystem    D:
E                   5,36          0,00 FileSystem    E:
G                   0,11         99,89 FileSystem    G:

Pour assigner une autre lettre à un volume : exemple de la lettre G vers V

Get-Partition -DriveLetter G | Set-Partition -NewDriveLetter V.

Je n’utiliserai pas la protection en temps réel de Windows Defender, voici comment la désactiver :

Set-MpPreference -DisableRealtimeMonitoring $true

Installation et configuration de l’active directory

Ajoutons les services de domaine Active Directory :

Install-WindowsFeature AD-Domain-Services -IncludeManagementTools

Nous terminons en réalisant la promotion du système Server Core vers le contrôleur de domaine :

Install-ADDSforest -DomainName kassianoff.local
A la fin du processus d’installation nous devons fournir un mot de passe pour le mode restauration des services d’annuaire. Une fois fait, redémarrons le serveur pour découvrir la promotion du serveur.

Commandes utiles

Créons notre premier utilisateur en Powershell comme cela  :

New-ADUser -Name "Jérémie KASSIANOFF" -GivenNaMe Jeremie -Surname KASSIANOFF -SamAccountName Jeremie -Ac
countPassword (Read-Host -AsSecureString "AccountPassword") -PassThru | Enable-ADAccount

Nous avons également une autre possibilité avec dsadd :

dsadd user "cn=Jeremie, dc=kassianoff, dc=local" -fn Jeremie -ln KASSIANOFF -pwd (Read-Host -AsSecureString "pwd") -disabled no
pwd: ***********************
dsadd réussite:cn=Jeremie,dc=kassianoff,dc=local

Affichons désormais le groupe principal de notre utilisateur :

Get-ADPrincipalGroupMembership Jeremie | select name

name
-----
Utilisateurs du domaine

Il est possible d’ajouter l’utilisateur dans un autre groupe, par exemple en tant que admins du domaine

Add-ADGroupMember "Admins du domaine" Jeremie

En cas d’oubli nous avons la possibilité de changer le mot de passe d’un utilisateur de façon sécurisée en deux étapes :

$newpwd = Read-Host "Enter the new password" -AsSecureString
Enter the new password: ********

Nous terminons par la commande en y incluant la variable sécurisée :

Set-ADAccountPassword Jeremie -NewPassword $newpwd –Reset

Une solution plus standard est également possible pour continuer la configuration des objets dans l’Active Directory. Utiliser un client Windows compatible avec les outils d’administration AD DS – AD LDS et DNS.  Celles-ci permettent simplement d’ouvrir une mmc distance pour manager le serveur comme l’expérience utilisateur standard.

Sauvegarde du l’état du système Windows

La sauvegarde du systemstate permet de conserver la configuration l’Active Directory mais également des fichiers systèmes (Boot et WFP), Sysvol, des certificats de l’autorité, de la base de registre et des bases des Component Service Class. Pour ce faire il faut installer l’outil en ligne de commande Windows Backup Server :

Install-WindowsFeature -Name Windows-Server-Backup

Success Restart Needed Exit Code      Feature Result
------- -------------- ---------      --------------
True    No             Success        {Sauvegarde Windows Server}

Nous utiliserons la commande wbadmin, sauvegarderons désormais l’état du système Windows vers la cible V: :

wbadmin.exe start systemstatebackup -backuptarget:v:

wbadmin 1.0 - Outil en ligne de commande de sauvegarde
(C) Copyright 2013 Microsoft Corporation. Tous droits réservés.

Démarrage de la sauvegarde de l’état du système [17/10/2017 18:23]...
Récupération des informations de volume...
Cette opération va sauvegarder l’état du système du ou des volumes Réservé au système (500.00 Mo),(C:) vers v:.
Voulez-vous démarrer l’opération de sauvegarde ?
[O] Oui [N] Non O

Création d’un cliché instantané des volumes spécifiés pour la sauvegarde...
Création d’un cliché instantané des volumes spécifiés pour la sauvegarde...
La Sauvegarde Windows Server met à jour la sauvegarde existante pour supprimer les fichiers
qui ont été supprimés du serveur depuis la dernière sauvegarde.
Cette opération peut prendre quelques minutes.
(128) fichiers trouvés.
(128) fichiers trouvés.
(5759) fichiers trouvés.
(16838) fichiers trouvés.
(25640) fichiers trouvés.
(27545) fichiers trouvés.
(32136) fichiers trouvés.
(38401) fichiers trouvés.
(40891) fichiers trouvés.
(46330) fichiers trouvés.
(51592) fichiers trouvés.
(57589) fichiers trouvés.
(62223) fichiers trouvés.
(65702) fichiers trouvés.
(67775) fichiers trouvés.
(74302) fichiers trouvés.
(80408) fichiers trouvés.
(86037) fichiers trouvés.
(91284) fichiers trouvés.
(93183) fichiers trouvés.
La recherche des fichiers sur l’état du système est terminée.
Démarrage de la sauvegarde des fichiers...
La sauvegarde des fichiers signalés par « Task Scheduler Writer » est terminée.
La sauvegarde des fichiers signalés par « VSS Metadata Store Writer » est terminée.
La sauvegarde des fichiers signalés par « Performance Counters Writer » est terminée.
État d’avancement : 0 %.
Sauvegarde des fichiers signalés par « System Writer » en cours...
État d’avancement : 100 %.
Sauvegarde des fichiers signalés par « System Writer » en cours...

Récapitulatif de l’opération de sauvegarde :
-------------------------

L’opération de sauvegarde a abouti.
La sauvegarde de l’état du système a abouti [16/10/2017 16:37].
Journal des fichiers sauvegardés correctement :
C:WindowsLogsWindowsServerBackupBackup-16-10-2017_16-23-37.log

Une planification de tâche est recommandée pour sauvegarder l’état du système :

wbadmin enable backup -addtarget:V: -schedule:00:00 -systemState -quiet

Conclusion sur Windows Server 2016 Core

Je dirais que Windows Server 2016 Core m’a bien plus séduit par sa faible consommation de ressources que par son ergonomie à utiliser du PowerShell. Fort heureusement, j’ai pu installer mon annuaire et le configurer avec l’aide du site technet de Microsoft.

Aujourd’hui, je suis satisfait du résultat et je me suis empressé de le sauvegarder.
Les étapes de bases m’ont été relativement pénible pour ma première expérience avec PowerShell.