Audit AI al configurațiilor GPO – identificare riscuri de securitate cu Ollama (Local AI) + PowerShell

Configurare noua (How To)

Situatie

Administratorii de sistem gestionează zeci sau sute de Group Policy Objects (GPO-uri) într-un domeniu Active Directory. Verificarea manuală a acestora pentru riscuri de securitate (parole slabe, drepturi excesive, setări periculoase) este consumatoare de timp și predispusă la erori umane.

Această soluție automatizează exportul configurațiilor GPO și le trimite unui model AI local (rulat prin Ollama) care analizează setările și returnează un raport cu riscuri identificate și recomandări — fără ca datele să părăsească rețeaua internă.

Backup

  • Soluția este read-only — nu modifică niciun GPO
  • Se recomandă backup GPO-uri înainte de orice modificare sugerată de AI:
— powershell
Backup-GPO -All -Path "C:\GPO_Backup\$(Get-Date -Format 'yyyy-MM-dd')"
  • Salvează raportul generat de AI în C:\GPO_Audit\

Solutie

Pasi de urmat

Pasul 1 — Instalare Ollama pe Windows Server

Descarcă și instalează Ollama:

# Descarca installerul
Invoke-WebRequest -Uri "https://ollama.com/download/OllamaSetup.exe" `
  -OutFile "$env:TEMP\OllamaSetup.exe"

# Instaleaza silentios
Start-Process "$env:TEMP\OllamaSetup.exe" -ArgumentList "/S" -Wait

Verifică instalarea și descarcă modelul:

# Verifica ca Ollama ruleaza
ollama --version

# Descarca modelul (llama3 sau mistral - recomandat pentru analiza text)
ollama pull llama3

Pasul 2 — Export GPO-uri în format HTML + XML

powershell
# Creeaza directorul de lucru
$AuditPath = "C:\GPO_Audit"
$ExportPath = "$AuditPath\Export"
New-Item -ItemType Directory -Force -Path $ExportPath | Out-Null

# Exporta toate GPO-urile ca rapoarte HTML si XML
Import-Module GroupPolicy

$AllGPOs = Get-GPO -All
foreach ($GPO in $AllGPOs) {
    $SafeName = $GPO.DisplayName -replace '[\\/:*?"<>|]', '_'
    
    # Export HTML (human-readable)
    Get-GPOReport -Guid $GPO.Id -ReportType HTML `
      -Path "$ExportPath\$SafeName.html"
    
    # Export XML (pentru parsing)
    Get-GPOReport -Guid $GPO.Id -ReportType XML `
      -Path "$ExportPath\$SafeName.xml"
}

Write-Host "Export complet: $($AllGPOs.Count) GPO-uri exportate in $ExportPath"

Pasul 3 — Script de extragere setări relevante din XML

powershell
function Extract-GPOSettings {
    param([string]$XmlPath)
    
    [xml]$xml = Get-Content $XmlPath -Encoding UTF8
    $output = @()

    # Nume GPO
    $gpoName = $xml.GPO.Name
    $output += "GPO: $gpoName"

    # Politica de parole
    $passwordPolicy = $xml.GPO.Computer.ExtensionData | 
        Where-Object { $_.Name -like "*Security*" }
    if ($passwordPolicy) {
        $output += "Password Policy: $($passwordPolicy.InnerText.Substring(0, [Math]::Min(500, $passwordPolicy.InnerText.Length)))"
    }

    # Drepturi utilizatori
    $userRights = $xml.GPO.Computer.ExtensionData | 
        Where-Object { $_.Name -like "*UserRights*" }
    if ($userRights) {
        $output += "User Rights: $($userRights.InnerText.Substring(0, [Math]::Min(500, $userRights.InnerText.Length)))"
    }

    # Scripts la logon/logoff/startup/shutdown
    $scripts = $xml.GPO.Computer.ExtensionData | 
        Where-Object { $_.Name -like "*Scripts*" }
    if ($scripts) {
        $output += "Scripts: $($scripts.InnerText.Substring(0, [Math]::Min(300, $scripts.InnerText.Length)))"
    }

    # Setari firewall
    $firewall = $xml.GPO.Computer.ExtensionData | 
        Where-Object { $_.Name -like "*Firewall*" }
    if ($firewall) {
        $output += "Firewall Settings: $($firewall.InnerText.Substring(0, [Math]::Min(300, $firewall.InnerText.Length)))"
    }

    return ($output -join "`n")
}

Pasul 4 — Funcție de trimitere către Ollama API

powershell
function Invoke-OllamaAnalysis {
    param(
        [string]$GpoContent,
        [string]$GpoName,
        [string]$Model = "llama3"
    )

    $Prompt = @"
Esti un expert in securitate Active Directory si Group Policy.
Analizeaza urmatoarele setari GPO si identifica:
1. Riscuri de securitate (ex: parole slabe, drepturi excesive, setari periculoase)
2. Setari non-conforme cu best practices Microsoft
3. Recomandari concrete de remediere

Raspunde DOAR in limba romana, structurat pe cele 3 puncte de mai sus.
Fii concis si tehnic. Daca nu exista riscuri, spune "Nu s-au identificat riscuri majore."

Setari GPO pentru "$GpoName":
$GpoContent
"@

    $Body = @{
        model  = $Model
        prompt = $Prompt
        stream = $false
    } | ConvertTo-Json -Depth 3

    try {
        $Response = Invoke-RestMethod `
            -Uri "http://localhost:11434/api/generate" `
            -Method POST `
            -ContentType "application/json" `
            -Body $Body `
            -TimeoutSec 120

        return $Response.response
    }
    catch {
        return "EROARE la analiza GPO: $_"
    }
}

Pasul 5 — Script principal de audit complet

powershell
# ============================================================
# GPO AI Audit - Main Script
# Autor: Claudiu Ceausescu
# Descriere: Analizeaza GPO-uri cu Ollama AI si genereaza raport
# ============================================================

$AuditPath   = "C:\GPO_Audit"
$ExportPath  = "$AuditPath\Export"
$ReportFile  = "$AuditPath\Raport_GPO_AI_$(Get-Date -Format 'yyyy-MM-dd_HH-mm').txt"
$Model       = "llama3"

# Verifica daca Ollama este pornit
try {
    Invoke-RestMethod -Uri "http://localhost:11434/api/tags" -TimeoutSec 5 | Out-Null
    Write-Host "[OK] Ollama este activ." -ForegroundColor Green
}
catch {
    Write-Host "[EROARE] Ollama nu raspunde. Porneste serviciul si incearca din nou." -ForegroundColor Red
    exit 1
}

# Incepe raportul
$Report = @()
$Report += "=" * 60
$Report += "RAPORT AUDIT GPO CU AI - $(Get-Date -Format 'dd.MM.yyyy HH:mm')"
$Report += "Model AI folosit: $Model"
$Report += "=" * 60
$Report += ""

# Proceseaza fiecare GPO exportat
$XmlFiles = Get-ChildItem -Path $ExportPath -Filter "*.xml"
$Total    = $XmlFiles.Count
$Counter  = 0

foreach ($File in $XmlFiles) {
    $Counter++
    $GpoName = [System.IO.Path]::GetFileNameWithoutExtension($File.Name)
    
    Write-Host "[$Counter/$Total] Analizez: $GpoName" -ForegroundColor Cyan

    # Extrage setarile
    $Settings = Extract-GPOSettings -XmlPath $File.FullName

    if ($Settings.Length -lt 50) {
        $Report += "-" * 40
        $Report += "GPO: $GpoName"
        $Report += "STATUS: GPO fara setari configurate (skip)"
        $Report += ""
        continue
    }

    # Trimite la Ollama pentru analiza
    $Analysis = Invoke-OllamaAnalysis `
        -GpoContent $Settings `
        -GpoName $GpoName `
        -Model $Model

    # Adauga la raport
    $Report += "-" * 40
    $Report += "GPO: $GpoName"
    $Report += "ANALIZA AI:"
    $Report += $Analysis
    $Report += ""
    
    # Pauza scurta intre requesturi
    Start-Sleep -Seconds 2
}

# Sumar final
$Report += "=" * 60
$Report += "AUDIT FINALIZAT - Total GPO-uri analizate: $Total"
$Report += "=" * 60

# Salveaza raportul
$Report | Out-File -FilePath $ReportFile -Encoding UTF8
Write-Host "`n[DONE] Raport salvat: $ReportFile" -ForegroundColor Green

# Deschide raportul
notepad.exe $ReportFile

Pasul 6 — Rulare și verificare raport

powershell
# Ruleaza scriptul principal (ca Administrator)
Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass
.\GPO_AI_Audit.ps1

# Verifica raportul generat
Get-Content "C:\GPO_Audit\Raport_GPO_AI_*.txt" | Select-Object -First 50
```

Exemplu output în raport:
```
--------------------------------------------
GPO: Default Domain Policy
ANALIZA AI:
1. Riscuri identificate:
   - Lungimea minima a parolei este setata la 7 caractere (recomandat: minim 12)
   - Complexitatea parolei este dezactivata
2. Non-conformitati:
   - Lockout threshold nu este configurat (risc brute-force)
3. Recomandari:
   - Setati minimum password length la 12+ caractere
   - Activati account lockout dupa 5 incercari esuate

Tip solutie

Permanent

Voteaza

(13 din 18 persoane apreciaza acest articol)

Despre Autor

Leave A Comment?