26/12/2024

Infrastructure as Code

Déployer un domaine Active Directory avec Vagrant et Ansible

I. Présentation

Dans ce tutoriel, vous allez découvrir comment créer, et configurer de manière automatique un environnement de test sous Windows Server puisque nous allons déployer une VM Windows Server sous VirtualBox et mettre en place un domaine Active Directory. Le tout de manière automatique. En termes d'outillage, Vagrant sera utilisé pour le provisionning tandis qu'Ansible sera utilisé pour le paramétrage des rôles.

Avant de rentrer dans le vif du sujet, une présente succincte de Vagrant et Ansible s'impose.

  • Vagrant

Outil permettant de travailler avec des environnements virtuels (VM, containers). Vagrant fournit un client en ligne de commande simple et facile à utiliser pour gérer ces environnements, ainsi qu'un interpréteur permettant de "coder" (pardonnez-vous moi l'expression) vos VM avec du code au lieu de faire d'enchaîner les clics sur une interface graphique. 

L'usage premier de Vagrant est de s'interfacer avec des hyperviseur de type 2 comme VirtualBox, VMware ou encore Hyper-V. Cependant il est possible d'utiliser Vagrant avec un hyperviseur de type 1 comme VMware ESXi. Ce sont des plugins développés par la communauté open source qui le permette, donc pas forcement très stable. 

Plus d'info ici pour VMware ESXi  et Vagrant : GitHub - Vagrant + ESXi

  • Ansible

Logiciel permettant de provisionner l'infrastructure sous-jacente de votre environnement (hyperviseurs, VM, containers, etc.) par l'intermédiaire de fichiers .yml. Ansible intervient pour la partie "configuration logicielle" afin d'installer des services et de les paramétrer par la suite, mais ne permets pas d'instancier (au sens propre du terme des environnements virtuels).

Avant toute chose, je vais pousser un petit coup de gueule contre la doc d'Ansible. Nonobstant que cet outil soit vraiment pratique et très puissant pour les tâches d'automatisation, je trouve que la doc reste beaucoup trop verbeuse et flou à certains endroits. Personnellement, cela m'a fait perdre un temps pas possible pour la rédaction de mon playbook. Ma critique s'adresse uniquement si vous utilisez Ansible pour provisionner des machines Windows. Néanmoins, avec un environnement Linux, j'ai clairement moins galéré, car il y avait beaucoup plus de ressources en ligne (articles, forum, etc.). Globalement en fonction de ce que vous voulez faire, si c'est commun ou non, vous êtes très vite projeté dans l'inconnu avec Ansible. Voilà l'essence même de cet article :-). C'est regrettable au vu de la puissance de l'outil et j'espère qu'à l'avenir cela changera.

En revanche, la documentation de Vagrant est très bien structurée et claire. Vous verrez par vous-même. Bravo une fois de plus a l'éditeur Hashicorp !

Passons aux choses sérieuses.

Remarque : pour suivre ce tutoriel, il est préférable de connaître un minimum Vagrant et l'Active Directory.

II. Description de mon lab

Vous avez besoin d'une machine sur laquelle nous allons installer VirtualBox, Vagrant, et Ansible, afin de déployer la VM Windows Server. Dans mon cas, je vais utiliser un hôte physique sous Linux : Ubuntu 20.04 ou 22.04 (testé sur les deux).

Remarque : Vagrant et Ansible sont des outils qui s'utilisent plus facilement depuis Linux, bien qu'ils soient capables de gérer des hôtes Windows et Linux.

Si vous souhaitez réaliser ce tutoriel depuis un hôte physique sous Windows, vous pouvez le faire, mais votre PC doit soit :

  • Prendre en charge la "virtualisation imbriquée" (c'est le fait de créer une machine virtuelle depuis une machine qui est elle-même virtualisée) aussi appelée "nested virtualization"  en anglais, pour créer une VM Linux dans laquelle vous allez installer les outils.
    • Ce qui implique que vous devez utiliser un hyperviseur qui est capable de gérer cette fonction comme VMware Workstation ou VirtualBox. Pour cela, accéder aux paramètres de votre VM, puis cocher la case "Virtualize Intel VT-x/EPT or AMD-V/RVI". 

  • L'alternative consiste à installer directement Vagrant et Ansible sur votre hôte Windows. Mais bon, personnellement, je ne vous le recommande pas, car la quasi-totalité des documentations que vous trouverez sur ces deux technologies sont rédigées depuis un environnement Linux.

III. Installation des prérequis

Détendez-vous, ça va bien se passer...

Dans un premier temps, commencez par installer VirtualBox et Ansible ainsi que le gestionnaire Pip pour Python si-vous ne l'avez pas déjà :

sudo apt update && sudo apt install virtualbox ansible python3-pip

Ensuite, vous devez installer Vagrant en utilisant les instructions fournies sur le site officiel :

Pour Ubuntu/Debian, voici les instructions fournies :

wget -O- https://apt.releases.hashicorp.com/gpg | gpg --dearmor | sudo tee /usr/share/keyrings/hashicorp-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/hashicorp.list
sudo apt update && sudo apt install vagrant

Préférez l'installation de Vagrant via le dépôt APT officiel d'Hashicorp (éditeur de Vagrant) comme ci-dessus plutôt qu'avec les repos officiels d'Ubuntu 22.04. En effet, j'ai rencontré des problèmes étranges avec les plugins sous-jacents de Vagrant qui ne voulaient pas s'installer. Ceci s'est produit lorsque j'ai fait mes tests en passant par les dépôts officiels d'Ubuntu 22.04 pour installer Vagrant.

Suite à cela, installez la dépendance python "pywinrm" qui est une des "briques" qui va vous permettre de pouvoir de faire communiquer votre machine Windows avec Vagrant puis Ansible par l'intermédiaire du protocole WinRM.

python3 -m pip install pywinrm

Continuons avec l'installation des plugins WinRM pour Vagrant :

vagrant plugin install winrm 
vagrant plugin install winrm-elevated
vagrant plugin install winrm-fs

Ceux-ci vont permettre à Vagrant de pouvoir se connecter à la machine Windows via le protocole WinRM.

En quoi cela est nécessaire ?

Dans le cas de cet article, cela va permettre à Vagrant de pouvoir communiquer avec la VM afin de préparer ses "fondations" (setup de l'heure, installation de dépendances "core" pour l'ADDS, etc...), pour qu'ensuite Ansible puisse prendre le relais sur la configuration.

Vérifiez que les plugins se sont bien installés par l'intermédiaire de la commande :

vagrant plugin list

Vous devriez voir les plugins suivants :

Enfin, nous allons installer les plugins d'Ansible dont nous avons besoin  :

ansible-galaxy collection install community.windows 
ansible-galaxy collection install ansible.windows

Ouf... j'espère que tout s’est bien passé pour vous. Croyez-moi que j'ai bien galéré afin de comprendre et rassembler tous les éléments dans l'ordre pour vous, afin que vous ayez un article simple à comprendre et à tester de votre côté...

IV. Vagrant : création de la VM Windows Server

Créez un fichier de configuration nommé "Vagrantfile" sur votre machine :

touch Vagrantfile

Éditez le fichier afin d'insérer le bloc de code ci-dessous. Ici, on est clairement sur de l'Infrastructure as Code.

Vagrant.configure("2") do |config|
config.vm.box = "peru/windows-server-2019-standard-x64-eval"
config.vm.provider "virtualbox" do |hv|
hv.cpus = "2"
hv.memory = "2048"
hv.linked_clone = true
end

config.vm.provision "ansible" do |ansible|
ansible.playbook = "playbook-ansible.yml"
end
end

Les instructions sont suffisamment claires si vous connaissez un minimum Vagrant.

Précisons tout de même que Vagrant va créer une VM VirtualBox avec 2 Go de RAM, 2 vCPU et qu'après avoir mis en place la machine virtuelle, il va exécuter le playbook Ansible ("playbook-ansible.yml").

Note : vous pouvez aussi utiliser Vagrant pour exécuter des commandes sur le serveur, mais préférez l'utilisation d'Ansible si possible, car cela vous permettra de bien séparer les responsabilités de chacun de vos deux outils. 

  • Vagrant : utilisé la plupart du temps pour le provisionnement matériel
  • Ansible : utilisé pour le provisionnement "logiciel" (exécution de commandes, installation de services, etc.)

V. Ansible - Configuration du rôle ADDS pour notre machine

Maintenant, nous allons nous occuper de la configuration "logiciel" de notre serveur. On crée un fichier pour notre playbook Ansible :

touch playbook-ansible.yml

Voici ce que nous allons faire sur ce serveur : 

  • Installation de fonctionnalités basiques pour l'installation du rôle ADDS
  • Mise à jour de l'heure (fuseau horaire Europe/Paris) 
  • Changement du nom d'hôte
  • Redémarrage de la machine 
  • Changement de l'adresse IP de celle-ci, afin que la machine puisse disposer d'une adresse IP fixe (dans le réseau NAT de VirtualBox)
  • Installation et configuration du rôle ADDS en utilisant la plupart du temps les options par défaut
  • Redémarrage du serveur afin de finir la configuration du rôle ADDS (et donc la promotion de celui-ci en tant que contrôleur de domaine)

Puis, insérez le bloc de code ci-dessous :

- name: Configure role(s) on a Windows server instance
  hosts: all
  tasks: 

  - name: Run powershell commands to prepare the DC 
    ansible.windows.win_powershell:
      script: |
- name: Configure role(s) on a Windows server instance
  hosts: all
  tasks: 

  - name: Run powershell commands to prepare the DC 
    ansible.windows.win_powershell:
      script: |        Add-WindowsFeature AD-Domain-Services
        Set-TimeZone -Name "Romance Standard Time"

  - name: Change the hostname 
    ansible.windows.win_hostname:
      name: dc
    register: hostname
  
  - name: Reboot
    ansible.windows.win_reboot:
    when: hostname.reboot_required

  - name: Set up static IP address
    win_shell: "Get-NetIpAddress -InterfaceAlias 'Ethernet*' | New-NetIpAddress -IpAddress 10.0.2.100 -PrefixLength 24 -DefaultGateway 10.0.2.2"
    async: 100 # Using "fire-and-forget" asynchronous execution for this task, otherwise it will always fail and timeout
    poll: 0

  - name: Wait for the hosts network interface to come back up
    local_action:
      module: wait_for
      host: "{{ ansible_host }}"
      port: 5985
      delay: 10
      state: started
    register: wait_result

  - name: Install ADDS role and configure it with minimal option
    ansible.windows.win_domain:
      dns_domain_name: itconnect.local
      safe_mode_password: password123!
    register: domain_install
  
  - name: Reboot after promotion
    ansible.windows.win_reboot:
    when: domain_install.reboot_required

Ce playbook reprend les étapes classiques de la configuration d'un contrôleur de domaine avec des étapes fondamentales (adresse IP fixe, paramétrage du rôle ADDS). Voici quelques précisions sur la configuration déployée (vous pouvez adapter le playbook à votre guise) :

  • Nom de l'hôte : dc
  • Nom du domaine Active Directory : itconnect.local
  • Mot de passe de récupération de l'Active Directory : password123!
  • Adresse IP de la VM : 10.0.2.100/24
  • Fuseau horaire : Romance Standard Time

Si vous souhaitez plus de granularité pour la configuration du rôle, je vous invite à consulter le lien suivant (bon courage, c'est la doc d'Ansible) :

VI. Déploiement de notre machine Windows Server 

Maintenant que tous les prérequis sont remplis, et que nos fichiers de configuration pour le déploiement sont prêts, vous pouvez utiliser la commande "vagrant up" afin de lancer le processus d'instanciation et de configuration de la VM.

Dans un premier temps, Vagrant va télécharger l'image "peru/windows-server-2019-standard-x64-eval" depuis le Vagrant "store". En général, une image Windows Server fait entre 7 et 10 Go, donc vous pouvez aller prendre un café le temps que le téléchargement s'effectue...

Ensuite, une fois que l'importation de la VM est terminée, celle-ci va démarrer. C'est à partir de ce moment que Vagrant va tenter de communiquer avec la VM en utilisant le protocole d'administration WinRM, afin qu'il puisse (Vagrant) passer la main à Ansible. Autrement dit, Vagrant exécute le playbook Ansible !

Dès lors, c'est Ansible qui prend le relais pour la configuration logiciel en exécutant l'ensemble des actions définies dans le playbook

Pour s'authentifier sur la nouvelle machine Windows Server, il faudra utiliser les informations suivantes :

  • Utilisateur : Administrator
  • Mot de passe : vagrant (clavier en Qwerty par défaut)

Ces informations sont issues de l'image Vagrant utilisée. Bien sûr, vous devez modifier le mot de passe, car il s'agit du compte Administrateur du domaine.

VII. Conclusion 

J'espère que tout s'est bien passé pour vous de votre côté ! Votre VM Windows Server est déployée sur VirtualBox et elle est déjà préconfigurée avec un domaine Active Directory !

Si vous souhaitez changer d'images à l'avenir afin d'utiliser une version différente de Windows Server, essayez d'en trouver une où WinRM est déjà actif et qu'il est autorisé dans le pare-feu Windows.

author avatar
Geoffrey Sauvageot-Berland Ingénieur Cybersécurité
Ingénieur diplômé par l’état en Informatique et Cybersécurité. Généraliste, à l'origine administrateur systèmes et réseaux, j’occupe actuellement un poste d’auditeur en sécurité offensive. J’apprécie également la programmation/automatisation. Fondateur du blog : "Le Guide du SecOps", anciennement "Le Guide du SysOps"
Partagez cet article Partager sur Twitter Partager sur Facebook Partager sur Linkedin Envoyer par mail

10 commentaires sur “Déployer un domaine Active Directory avec Vagrant et Ansible

  • Par contre tu peux instaurer le vaut pour cacher le mot de passe

    Ansible-vault encrypt_string ‘achiffrer’ –vault-password-file ton fichier.key

    Puis tu comme le résultat dans le yaml

    Répondre
  • Très bon article, par conte j’ai une question au niveau de la commande  » vagrant up ».
    de mon côté, une fois arrivé à la ligne « WinRM transport: negotiate », ça se bloque.

    Répondre
  • Bloqué à python3 -m pip install pywinrm

    error : externally-managed-environment.

    Pourrais tu m’aider ?

    Répondre
    • il est installé par défaut à présent, il faut abandonner cette commande

      Répondre
  • Impossible de changer l’ip perso.. Apres un reboot : timeout

    Répondre
  • Bonjour, votre playbook présente pas mal de mauvais copier-coller.

    Pouvez-vous corriger ?

    Répondre

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.