Sécurité et hardening¶
Hardening intermédiaire de l'image Windows : firewall, Windows Defender, GPO locales, restriction PowerShell et desactivation des services inutiles.
Rôle security¶
Variables par défaut¶
Créez roles/security/defaults/main.yml :
security_enabled: true
security_rdp_port: 3389
security_winrm_port: 5986
security_password_min_length: 12
security_lockout_threshold: 5
security_lockout_duration: 30
security_powershell_execution_policy: "RemoteSigned"
security_disable_services:
- XblAuthManager
- XblGameSave
- XboxGipSvc
- XboxNetApiSvc
- DiagTrack
- dmwappushservice
- RetailDemo
- WSearch
Firewall Windows¶
Créez roles/security/tasks/firewall.yml :
---
- name: Activer le firewall sur tous les profils
community.windows.win_firewall:
profiles:
- Domain
- Private
- Public
state: enabled
- name: Autoriser RDP
community.windows.win_firewall_rule:
name: "VDI-RDP"
localport: "{{ security_rdp_port }}"
protocol: tcp
direction: in
action: allow
enabled: true
- name: Autoriser WinRM HTTPS (build only)
community.windows.win_firewall_rule:
name: "VDI-WinRM-HTTPS"
localport: "{{ security_winrm_port }}"
protocol: tcp
direction: in
action: allow
enabled: true
- name: Bloquer les connexions sortantes non-essentielles par defaut
community.windows.win_firewall:
profiles:
- Public
default_outbound_action: block
state: enabled
- name: Autoriser les sorties DNS, HTTP, HTTPS
community.windows.win_firewall_rule:
name: "VDI-Outbound-{{ item.name }}"
localport: any
remoteport: "{{ item.port }}"
protocol: tcp
direction: out
action: allow
enabled: true
loop:
- { name: "DNS", port: "53" }
- { name: "HTTP", port: "80" }
- { name: "HTTPS", port: "443" }
Windows Update¶
Créez roles/security/tasks/updates.yml :
---
- name: Installer toutes les mises a jour critiques
ansible.windows.win_updates:
category_names:
- CriticalUpdates
- SecurityUpdates
state: installed
reboot: true
reboot_timeout: 1200
- name: Configurer Windows Update en mode automatique
ansible.windows.win_regedit:
path: HKLM:\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU
name: AUOptions
data: 4
type: dword
Windows Defender¶
Créez roles/security/tasks/defender.yml :
---
- name: Activer la protection en temps reel
ansible.windows.win_shell: Set-MpPreference -DisableRealtimeMonitoring $false
- name: Activer la protection cloud
ansible.windows.win_shell: Set-MpPreference -MAPSReporting Advanced
- name: Ajouter les exclusions pour les repertoires de dev
ansible.windows.win_shell: |
Add-MpPreference -ExclusionPath "C:\containerd"
Add-MpPreference -ExclusionPath "C:\ProgramData\chocolatey"
when: containers_enabled | default(false) or chocolatey_enabled | default(false)
- name: Lancer un scan rapide
ansible.windows.win_shell: Start-MpScan -ScanType QuickScan
GPO locales¶
Créez roles/security/tasks/gpo.yml :
---
- name: Politique de mot de passe — longueur minimale
community.windows.win_security_policy:
section: System Access
key: MinimumPasswordLength
value: "{{ security_password_min_length }}"
- name: Politique de mot de passe — complexite requise
community.windows.win_security_policy:
section: System Access
key: PasswordComplexity
value: 1
- name: Verrouillage de compte — seuil
community.windows.win_security_policy:
section: System Access
key: LockoutBadCount
value: "{{ security_lockout_threshold }}"
- name: Verrouillage de compte — duree (minutes)
community.windows.win_security_policy:
section: System Access
key: LockoutDuration
value: "{{ security_lockout_duration }}"
- name: Audit — succes et echecs de connexion
community.windows.win_audit_policy_system:
subcategory: Logon
audit_type: success, failure
Restriction PowerShell¶
Créez roles/security/tasks/powershell.yml :
---
- name: Configurer la politique d'execution
ansible.windows.win_shell: "Set-ExecutionPolicy {{ security_powershell_execution_policy }} -Force -Scope LocalMachine"
- name: Desactiver PowerShell v2
ansible.windows.win_optional_feature:
name: MicrosoftWindowsPowerShellV2Root
state: absent
- name: Activer la journalisation PowerShell
ansible.windows.win_regedit:
path: HKLM:\SOFTWARE\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging
name: EnableScriptBlockLogging
data: 1
type: dword
Services inutiles¶
Créez roles/security/tasks/services.yml :
---
- name: Desactiver les services inutiles
ansible.windows.win_service:
name: "{{ item }}"
start_mode: disabled
state: stopped
loop: "{{ security_disable_services }}"
ignore_errors: true
Tâches principales¶
Créez roles/security/tasks/main.yml :
---
- name: Configurer le firewall
ansible.builtin.include_tasks: firewall.yml
- name: Installer les mises a jour
ansible.builtin.include_tasks: updates.yml
- name: Configurer Windows Defender
ansible.builtin.include_tasks: defender.yml
- name: Appliquer les GPO locales
ansible.builtin.include_tasks: gpo.yml
- name: Restreindre PowerShell
ansible.builtin.include_tasks: powershell.yml
- name: Desactiver les services inutiles
ansible.builtin.include_tasks: services.yml
- name: Validation du role
ansible.builtin.include_tasks: validate.yml
tags: [validate]
Assertions¶
Créez roles/security/tasks/validate.yml :
---
# --- Niveau 1 : technique ---
- name: "Assert : Firewall actif"
ansible.windows.win_shell: "(Get-NetFirewallProfile).Enabled"
register: fw_status
failed_when: "'False' in fw_status.stdout"
- name: "Assert : Windows Defender actif"
ansible.windows.win_shell: "(Get-MpComputerStatus).RealTimeProtectionEnabled"
register: defender_status
failed_when: "'True' not in defender_status.stdout"
- name: "Assert : PowerShell v2 desactive"
ansible.windows.win_optional_feature:
name: MicrosoftWindowsPowerShellV2Root
state: absent
check_mode: true
register: psv2_check
failed_when: psv2_check.changed
# --- Niveau 2 : cas d'usage ---
- name: "Assert : Politique de mot de passe appliquee"
ansible.windows.win_shell: "net accounts | Select-String 'Minimum password length'"
register: pwd_policy
failed_when: "{{ security_password_min_length }} > (pwd_policy.stdout | regex_search('\\d+') | int)"
- name: "Assert : Services inutiles arretes"
ansible.windows.win_service:
name: "{{ item }}"
register: svc_status
failed_when: svc_status.state == "running"
loop: "{{ security_disable_services }}"
ignore_errors: true
Recap des mesures¶
| Mesure | Module Ansible | Effet |
|---|---|---|
| Firewall active | win_firewall, win_firewall_rule | Filtrage entrant/sortant |
| Windows Update | win_updates | Correctifs critiques et sécurité |
| Windows Defender | Set-MpPreference | Protection temps réel + cloud |
| Mot de passe | win_security_policy | Min 12 caractères, complexité |
| Verrouillage compte | win_security_policy | 5 tentatives, 30 min blocage |
| Audit connexion | win_audit_policy_system | Journalisation succès/échec |
| PowerShell | Set-ExecutionPolicy | RemoteSigned + v2 désactivé |
| Services | win_service | Xbox, DiagTrack, etc. arretes |