AzMan et Hyper-V, ou comment déléguer l’accès aux machines virtuelles

Ce titre pourrait annoncer un nouveau film avec une vague de super héros, mais il n’en est rien !

L’intention de ce bulletin est d’expliquer brièvement ce qu’est AzMan et comment l’utiliser pour mettre en oeuvre de la délégation d’administration sur un serveur hébergeant le rôle Hyper-V.

 

AzMan

 

Hyper-V est désormais bien connu mais AzMan reste un peu dans l’ombre. De son vrai nom Windows Authorization Manager, AzMan est un framework de gestion des accès basé sur la notion de rôles (ou role-based access control, soit RBAC) qui permet de mettre à disposition des applications des stratégies auxquelles elles peuvent se référer pour contrôler ce que chaque utilisateur a la permission de faire.

Ce framework doit donc être pris en compte lors du développement de ces applications.

Je ne m’étendrais pas sur AzMan car cela ne fait pas parti de mes compétences au sein de l’équipe Windows Core mais il est nécessaire de détailler les quelques notions de base utilisées dans la suite de ce bulletin :

  • Authorization Store : l’emplacement de stockage de la stratégie d’autorisation, un fichier XML, une base SQL ou Active Directory
    -> L’authorization store de Hyper-V est un fichier XML situé sur le serveur Hyper-V : C:\ProgramData\Microsoft\Windows\Hyper-V\InitialStore.xml
  • Application : définit un namespace pour les rôles, tâches et opérations
  • Scope : une collection de ressources sur lesquelles la même stratégie d’autorisation s’applique
  • Role : correspond à la définition d’un rôle fonctionnel (administrateur, opérateur, invité, …) et de la collection de tâches dont un utilisateur dispose au sein de l’application
  • Task : une collection d’opérations correspondant à une tâche (démarrer une machine virtuelle, modifier les paramétres d’une machine virtuelle, …)
  • Operation : un jeu de permissions qui sont associées à des procédures de sécurité au niveau du système ou des APIs

image 

 

Comment attribuer des permissions sur Hyper-V

 

L’objectif ici est donc de détailler toutes les étapes nécessaires pour donner à certains utilisateurs la possibilité de travailler avec certaines machines virtuelles s’exécutant sur un hôte Hyper-V.

Avant de manipuler l’authorization store de Hyper-V, quelques pré-requis doivent être mis en oeuvre pour autoriser l’accès à distance de l’hôte Hyper-V :

  1. Créer un groupe (dans Active Directory ou sur l’hôte Hyper-V) : par exemple Hyper-V Access
  2. Rajouter dans le groupe local Distributed COM Users du serveur le groupe créé
  3. Lancer Computer Management puis aller dans Services and Applications | WMI Control
  4. Bouton droit sur WMI Control –> Properties | Onglet Security
  5. Sélectionner Root | CIMV2 et cliquer sur Security
    1. Cliquer sur Advanced puis Add…
    2. Ajouter le groupe nouvellement créé (Hyper-V Access) et cliquer sur OK
    3. Sélectionner Enable Account et Remote Enable
    4. Sélectionner Apply to : This namespace and subnamespaces
    5. Cocher Apply these permissions to objects and/or containers within this container only
    6. Cliquer sur OK
  6. Bouton droit sur WMI Control –> Properties | virtualization
  7. Sélectionner Root | CIMV2 et cliquer sur Security
    1. Cliquer sur Advanced puis Add…
    2. Ajouter le groupe nouvellement créé (Hyper-V Access) et cliquer sur OK
    3. Sélectionner Enable Account et Remote Enable
    4. Sélectionner Apply to : This namespace and subnamespaces
    5. Cocher Apply these permissions to objects and/or containers within this container only
    6. Cliquer sur OK

 

Pour référence, voici la liste des opérations qui peuvent être déléguées à des utilisateurs dans Hyper-V :

  • Read Service Configuration : permet de visualiser la configuration du service Virtual Machine Management Service
  • Reconfigure Service : permet de reconfigurer le service Virtual Machine Management Service
  • Create Virtual Switch : permet la création du switch virtuel
  • Delete Virtual Switch : permet la suppression d’un switch virtuel
  • Create Virtual Switch Port : permet la création d’un port de switch virtuel
  • Delete Virtual Switch Port : permet la suppression d’un port de switch virtuel
  • Connect Virtual Switch Port : permet la connection à un port de switch virtuel
  • Disconnect Virtual Switch Port : permet la déconnection d’un port de switch virtuel
  • Create Internal Ethernet Port : permet la création d’un port ethernet interne
  • Delete Internal Ethernet Port : permet la suppression d’un port ethernet interne
  • Bind External Ethernet Port : permet de lier à un port ethernet externe
  • Unbind External Ethernet Port : permet de délier à un port ethernet externe
  • Change VLAN Configuration on Port : permet de modifier la configuration VLAN d’un port
  • Modify Switch Settings : permet de modifier les paramètres d’un switch
  • Modify Switch Port Settings : permet de modifier les paramètres d’un port de switch
  • View Switches : permet de visualiser les switches
  • View Switch Ports : permet de visualiser les ports de switches disponibles
  • View External Ethernet Ports : permet de visualiser les ports ethernet externes
  • View Internal Ethernet Ports : permet de visualiser les ports ethernet internes
  • View VLAN Settings : permet de visualiser la configuration de VLAN
  • View LAN Endpoints : permet de visualiser les LAN endpoints
  • View Virtual Switch Management Service : permet de visualiser le service Virtual Switch Management Service
  • Create Virtual Machine : permet de créer une machine virtuelle
  • Delete Virtual Machine : permet de supprimer une machine virtuelle
  • Change Virtual Machine Authorization Scope : permet de changer une machine virtuelle de scope
  • Start Virtual Machine : permet de démarrer une machine virtuelle
  • Stop Virtual Machine : permet de stopper une machine virtuelle
  • Pause and Restart Virtual Machine : permet de mettre en pause et de redémarrer une machine virtuelle
  • Reconfigure Virtual Machine : permet de reconfigurer une machine virtuelle
  • View Virtual Machine Configuration : permet de visualiser la configuration d’une machine virtuelle
  • Allow Input to Virtual Machine : permet d’interagir avec l’OS d’une machine virtuelle
  • Allow Output from Virtual Machine : permet de visualiser l’OS d’une machine virtuelle
  • Modify Internal Ethernet Port : permet la modification d’un port ethernet interne

 

Pour la partie réseau, ces deux schémas seront peut-être plus explicites pour décrire a quoi correspondent les différents composants :

image image
Schéma théorique Vue du Virtual Network Manager

 

Démarche

 

Je vais prendre l’exemple suivant : un administrateur Hyper-V souhaite déléguer la création et l’administration des machines virtuelles à un groupe d’utilisateurs (groupe Hyper-V Admins) et autoriser un autre groupe de personnes à utiliser ces machines virtuelles (groupe Hyper-V Users).

La démarche consiste donc à créer dans cette ordre depuis AzMan :

  1. Des définitions de tâches (Task Definitions)
  2. Des définitions de rôles (Roles Definitions)
  3. Des assignations de rôles (Roles Assignments)

Pour simplifier la compréhension, j’utilise une terminologie spécifique pour chaque type d’élément créé en préfixant chacun de ces éléments :

  • T- pour les définitions de tâches
  • R- pour les définitions de rôles
  • G- pour les groupes applicatifs
  • AD- pour les groupes Active Directory

 

Création des définitions de tâches

 

L’adresse suivante donne un grand nombre d’exemples de tâches correspondants à des scénarios de délégation : Example Authorization Manager Tasks and Operations

Il s’agit tout d’abord d’ouvrir l’authorization store de Hyper-V :

  1. Exécuter Start | Run –> azman.msc
  2. Menu Action | Open Authorization Store…
  3. Sélectionner XML File puis spécifier le fichier C:\ProgramData\Microsoft\Windows\Hyper-V\InitialStore.xml

Note : si SCVMM est utilisé pour gérer l’hôte Hyper-V, les modifications apportées au fichier InitialStore.xml ne seront pas prises en compte. SCVMM permet de déléguer l’accès à un hôte Hyper-V via son propre fichier (HyperVAuthStore.xml). La modification de ce fichier n’est pas supportée.

La première définition de tâche que je vais créer permettra de donner l’accès à la console Hyper-V (visualisation des machines virtuelles) :

  1. Sélectionner Authorization Manager | InitialStore.xml | Hyper-V Services | Definitions | Task Definitions
  2. Menu Action | New Task Definition…
  3. Spécifier un nom : T-Accès au serveur Hyper-V et cliquer sur Add..
  4. Dans l’onglet Operations, sélectionner :
    1. Allow output from Virtual Machines
    2. Read Service Configuration
    3. View Virtual Machine Configuration
  5. Cliquer sur OK

image

 

La seconde définition de tâche que je vais créer permettra de donner les permissions suffisantes pour gérer les machines virtuelles :

  1. Sélectionner Authorization Manager | InitialStore.xml | Hyper-V Services | Definitions | Task Definitions
  2. Menu Action | New Task Definition…
  3. Spécifier un nom : T-Administration des VMs et cliquer sur Add..
  4. Dans l’onglet Tasks sélectionner T- Accès au serveur Hyper-V
    En sélectionnant la définition de tâche créée à l’étape précédente, celle-ci héritera de ses permissions
  5. Dans l’onglet Operations, sélectionner :
    1. Create Virtual Machine
    2. Delete Virtual Machine
    3. Connect Virtual Switch Port
    4. Allow Intput from a Virtual Machine
    5. Pause and Restart Virtual Machine
    6. Start Virtual Machine
    7. Stop Virtual Machine
    8. Reconfigure Virtual Machine
  6. Cliquer sur OK

 

La dernière définition de tâche que je vais créer permettra de donner les permissions suffisantes pour utiliser les machines virtuelles sans pouvoir modifier leur configuration :

  1. Sélectionner Authorization Manager | InitialStore.xml | Hyper-V Services | Definitions | Task Definitions
  2. Menu Action | New Task Definition…
  3. Spécifier un nom : T-Utilisation des VMs et cliquer sur Add..
  4. Dans l’onglet Tasks sélectionner T- Accès au serveur Hyper-V
    En sélectionnant la définition de tâche créée à la première étape, celle-ci héritera de ses permissions
  5. Dans l’onglet Operations, sélectionner :
    1. Allow Intput from a Virtual Machine
    2. Pause and Restart Virtual Machine
    3. Start Virtual Machine
    4. Stop Virtual Machine
  6. Cliquer sur OK

 

Au final, j’ai donc la liste suivante de définitions de tâches :

image

 

Création des définitions de rôle

 

Depuis AzMan :

  1. Sélectionner Authorization Manager | InitialStore.xml | Hyper-V Services | Definitions | Role Definitions
  2. Menu Action | New Role Definition…
  3. Spécifier un nom : R-Hyper-V Admins et cliquer sur OK
  4. Effectuer la même chose pour la définition de rôle R-Hyper-V Users

 

Au final, j’ai donc la liste suivante de définitions de rôles :

image

 

Il faut maintenant attribuer à chaque définition de rôle les permissions adéquates :

  1. Sélectionner Authorization Manager | InitialStore.xml | Hyper-V Services | Definitions | Role Definitions | R-Hyper-V Admins
  2. Menu Action | Properties
  3. Dans l’onglet Definition, cliquer sur Add…
  4. Dans l’onglet Tasks, sélectionner T-Administration des VMs
  5. Cliquer sur OK
  6. Sélectionner Authorization Manager | InitialStore.xml | Hyper-V Services | Definitions | Role Definitions | R-Hyper-V Users
  7. Menu Action | Properties
  8. Dans l’onglet Definition, cliquer sur Add…
  9. Dans l’onglet Tasks, sélectionner T-Utilisation des VMs
  10. Cliquer sur OK

 

Assignation des rôles

 

Si nous suivons les best practices Microsoft, l’attribution définitive des permissions sur l’hôte Hyper-V se fera par des groupes Active Directory (à la rigueur à travers les groupes locaux de l’hôte Hyper-V).

Je reprends donc la nomenclature AD-Hyper-V Admins et AD-Hyper-V Users pour créer mes deux groupes dans Active Directory.

Ensuite, depuis AzMan, je vais créer des groupes “application” dans l’authorization store incluant ces groupes Active Directory :

  1. Sélectionner Authorization Manager | InitialStore.xml | Groups
  2. Menu Action New Application Group…
  3. Spécifier le nom G-Hyper-V Admins, sélectionner Basic Application Group puis cliquer sur OK
  4. Spécifier le nom G-Hyper-V Users, sélectionner Basic Application Group puis cliquer sur OK

Je vais ensuite lier les groupes Active Directory avec les groupes applicatifs :

  1. Sélectionner Authorization Manager | InitialStore.xml | Groups | G-Hyper-V Admins
  2. Menu Action | Properties
  3. Dans l’onglet Members :
    1. Laisser la sélection sur Windows and Active Directory et cliquer sur Select…
    2. Sélectionner le groupe AD-Hyper-V Admins depuis Active Directory (ou depuis la SAM locale de l’hôte Hyper-V)
    3. Cliquer sur OK
  4. Sélectionner Authorization Manager | InitialStore.xml | Groups | G-Hyper-V Users
  5. Menu Action | Properties
  6. Dans l’onglet Members :
    1. Laisser la sélection sur Windows and Active Directory et cliquer sur Select…
    2. Sélectionner le groupe AD-Hyper-V Users depuis Active Directory (ou depuis la SAM locale de l’hôte Hyper-V)
    3. Cliquer sur OK

 

Au final, j’ai donc les groupes applicatifs suivants :

image

Cette étape n’est pas nécessaire mais elle permet de définir une seule fois dans l’authorization store le relation entre les groupes Active Directory et des groupes propres à ce store.

 

Il s’agit enfin d’attribuer à ces groupes applicatifs la délégation créée au travers des définitions de rôles et de tâches.

Depuis AzMan, je vais créer des assignations de rôles dans l’authorization store :

  1. Sélectionner Authorization Manager | InitialStore.xml | Hyper-V Services | Role Assignments
  2. Menu Action | New Role Assignment…
  3. Sélectionner R-Hyper-V Admins et R-Hyper-V Users
  4. Cliquer sur OK

Jusque là, ces assignations de rôles ne sont définies que par les opérations qui leur sont autorisées et ne définissent pas encore quels utilisateurs peuvent en bénéficier. Il faut donc lier ces assignations de rôles aux groupes applicatifs.

Depuis AzMan :

  1. Sélectionner Authorization Manager | InitialStore.xml | Hyper-V Services | Role Assignments | R-Hyper-V Admins
    1. Menu Action | Assign Users and Groups –> From Authorization Manager
    2. Sélectionner G-Hyper-V Admins
    3. Cliquer sur OK
  2. Sélectionner Authorization Manager | InitialStore.xml | Hyper-V Services | Role Assignments | R-Hyper-V Users
    1. Menu Action | Assign Users and Groups –> From Authorization Manager
    2. Sélectionner G-Hyper-V Users
    3. Cliquer sur OK

 

Ce qui me donne en définitive ceci :

image

 

Scopes

 

La seule notion que je n’ai pas encore abordé sont les scopes.

Un scope définit un périmètre au sein d’un authorization store sur lequel s’appliquent des définitions de rôles et de tâches ainsi que des assignations de rôles.

Il est ainsi possible de définir plusieurs scopes (Maquettage, Pré-Production, Production, …) disposant de leur propre délégation. Ceci permet d’affiner encore plus la délégation en attribuant des permissions à un groupe de machines virtuelles et non à toutes.

image

Des exemples de scripts permettant de mainpuler les scopes sont disponibles ici : Script AzMan Scopes in Hyper-V

 

Ressources

 

Windows Authorization Manager (en Anglais)

Developing Applications Using Windows Authorization Manager (en Anglais)

Authorization Manager Terminology (en Anglais)

Configure Hyper-V for Role-based Access Control (en Anglais)

Virtualization Security Best Practices – How to Lockdown a Hyper-V Host (blog de Tony Soper en Anglais)

Hyper-V Security Getting Started Guide (blog de Tony Soper en Anglais)

 

Guillaume

Windows Core Support Escalation Engineer