Realització de backups

Aquest tutorial explica com configurar un sistema de còpies de seguretat automàtiques d’Active Directory des d’un Windows Server 2k19 cap a un servidor Samba. Utilitzarem PowerShell i l’eina ntdsutil per crear backups complets de l’AD que es transferiran automàticament a un servidor de la xarxa.

Preparació del Sistema

Verificar Windows Server Backup

Primer, hem de comprovar que tenim instal·lat el component Windows Server Backup.

Obrir PowerShell com a administrador i executar:

Get-WindowsFeature -Name Windows-Server-Backup

Si no està instal·lat, executar:

Install-WindowsFeature -Name Windows-Server-Backup

Aquest component proporciona les eines necessàries per fer còpies de seguretat del sistema, tot i que utilitzarem principalment ntdsutil per l’Active Directory.

 

Crear l’Estructura de Directoris

Creem les carpetes necessàries per a l’script i els logs:

New-Item -Path “C:\Scripts” -ItemType Directory -Force
New-Item -Path “C:\Logs” -ItemType Directory -Force
New-Item -Path “C:\Temp\ADBackup” -ItemType Directory -Force

  • C:\Scripts → on guardarem l’script de backup

  • C:\Logs → on es guardaran els logs de cada execució

  • C:\Temp\ADBackup → directori temporal per les còpies locals

Configurar Credencials per al Servidor Samba

Per connectar al servidor Samba de forma segura, guardarem la contrasenya encriptada:

Read-Host “Contrasenya de Samba” -AsSecureString | ConvertFrom-SecureString | Out-File “C:\Scripts\samba_cred.txt”

Quan s’executi, escriu la contrasenya de l’usuari del Samba i prem Enter.

Què fa: Emmagatzema la contrasenya de forma encriptada al fitxer samba_cred.txt. Només el mateix usuari en el mateix servidor pot desencriptar-la.

Preparar el Recurs Compartit

Al servidor Samba, necessitem tenir configurat un recurs compartit.

Edita el fitxer /etc/samba/samba.conf a la shell del servidor amb Vi, Vim o Nano.

[backups] path = /srv/samba/backups

writable = yes

valid users = usuari_backup

create mask = 0644

directory mask = 0755

Després, reinicia el servei:

 
sudo systemctl restart smbd
 

L'Script de Backup

Copiem l’script que hem creat (del artifact) i el guardem com a C:\Scripts\backup_ad_samba.ps1.

notepad backup_ad_samba.ps1

Com funciona l’Script?

L’script realitza les següents accions en ordre:

Pas 1: Inicialització

  • Crea el directori de backup amb data i hora: AD_Backup_20260112_110247

  • Inicia el fitxer de log a C:\Logs\

Pas 2: Backup de l’Active Directory

  • Utilitza ntdsutil per crear un backup IFM (Install From Media)

  • Guarda la base de dades NTDS.dit i els fitxers de registre

  • Verifica que els fitxers s’han creat correctament

Pas 3: Connexió al Servidor Samba

  • Llegeix les credencials encriptades

  • Munta temporalment el recurs compartit com a unitat de xarxa

Pas 4: Transferència

  • Copia recursivament tot el backup al servidor Samba

  • Manté l’estructura de directoris

Pas 5: Neteja

  • Desconnecta del servidor Samba

  • Elimina backups locals amb més de 7 dies d’antiguitat

 
Script

# Script de Backup de Active Directory a servidor Samba
# Windows Server 2019

# Configuración
$sambaServer = “10.4.0.30”
$sambaShare = “backups” # Modificar según el nombre del recurso compartido
$sambaPath = “\\$sambaServer\$sambaShare”
$localBackupPath = “C:\Temp\ADBackup”
$backupDate = Get-Date -Format “yyyyMMdd_HHmmss”
$backupFolder = “AD_Backup_$backupDate”
$logFile = “C:\Logs\ADBackup_$backupDate.log”

# Credenciales para el servidor Samba
$sambaUser = “usuario_samba” # Modificar con usuario real
$sambaPasswordFile = “C:\Scripts\samba_cred.txt” # Archivo con contraseña encriptada

# Función para escribir en el log
function Write-Log {
param($Message)
$timestamp = Get-Date -Format “yyyy-MM-dd HH:mm:ss”
$logMessage = “$timestamp – $Message”
Write-Host $logMessage
Add-Content -Path $logFile -Value $logMessage
}

# Crear directorio de logs si no existe
$logDir = Split-Path $logFile
if (!(Test-Path $logDir)) {
New-Item -ItemType Directory -Path $logDir -Force | Out-Null
}

Write-Log “=== Iniciando proceso de backup de Active Directory ===”

try {
# Verificar que Windows Server Backup está instalado
$wsb = Get-WindowsFeature -Name Windows-Server-Backup
if (!$wsb.Installed) {
Write-Log “ERROR: Windows Server Backup no está instalado”
Write-Log “Ejecutar: Install-WindowsFeature -Name Windows-Server-Backup”
exit 1
}

# Crear directorio local temporal si no existe
if (!(Test-Path $localBackupPath)) {
New-Item -ItemType Directory -Path $localBackupPath -Force | Out-Null
Write-Log “Directorio local creado: $localBackupPath”
}

# Crear subdirectorio para este backup
$fullLocalPath = Join-Path $localBackupPath $backupFolder
New-Item -ItemType Directory -Path $fullLocalPath -Force | Out-Null
Write-Log “Directorio de backup creado: $fullLocalPath”

# Realizar backup de Active Directory usando ntdsutil (IFM)
Write-Log “Iniciando backup de Active Directory con ntdsutil…”

# Crear archivo de comandos para ntdsutil
$ntdsutilScript = @”
activate instance ntds
ifm
create full “$fullLocalPath”
quit
quit
“@

$scriptFile = “$env:TEMP\ntdsutil_commands.txt”
$ntdsutilScript | Out-File -FilePath $scriptFile -Encoding ASCII

# Ejecutar ntdsutil con el archivo de comandos
Write-Log “Ejecutando: ntdsutil < $scriptFile”
$output = cmd /c “ntdsutil < `”$scriptFile`” 2>&1″
$exitCode = $LASTEXITCODE

Write-Log “Salida de ntdsutil:”
$output | ForEach-Object { Write-Log $_ }

# Limpiar archivo temporal
Remove-Item $scriptFile -Force -ErrorAction SilentlyContinue

if ($exitCode -eq 0) {
# Verificar que se crearon los archivos necesarios
if (Test-Path “$fullLocalPath\Active Directory”) {
Write-Log “Verificado: Archivos de Active Directory creados”
$adFiles = Get-ChildItem “$fullLocalPath\Active Directory” -Recurse
Write-Log “Total de archivos creados: $($adFiles.Count)”
} else {
Write-Log “ERROR: No se encontró la carpeta ‘Active Directory'”
exit 1
}

if (Test-Path “$fullLocalPath\registry”) {
Write-Log “Verificado: Archivos de registro del sistema creados”
} else {
Write-Log “ADVERTENCIA: No se encontró la carpeta ‘registry'”
}

Write-Log “Backup de Active Directory completado exitosamente”
} else {
Write-Log “ERROR: Falló el backup de Active Directory (código: $exitCode)”
exit 1
}

# Leer credenciales para Samba
if (Test-Path $sambaPasswordFile) {
$sambaPassword = Get-Content $sambaPasswordFile | ConvertTo-SecureString
$credential = New-Object System.Management.Automation.PSCredential($sambaUser, $sambaPassword)
} else {
Write-Log “ADVERTENCIA: Archivo de credenciales no encontrado”
Write-Log “El script intentará usar las credenciales del usuario actual”
$credential = $null
}

# Conectar al servidor Samba
Write-Log “Conectando al servidor Samba: $sambaPath”

if ($credential) {
New-PSDrive -Name “SambaBackup” -PSProvider FileSystem -Root $sambaPath -Credential $credential -ErrorAction Stop | Out-Null
} else {
New-PSDrive -Name “SambaBackup” -PSProvider FileSystem -Root $sambaPath -ErrorAction Stop | Out-Null
}

Write-Log “Conexión establecida con el servidor Samba”

# Copiar backup al servidor Samba
$remotePath = “SambaBackup:\$backupFolder”
Write-Log “Copiando backup a $sambaPath\$backupFolder…”

Copy-Item -Path $fullLocalPath -Destination “SambaBackup:\” -Recurse -Force
Write-Log “Backup copiado exitosamente al servidor Samba”

# Desconectar unidad
Remove-PSDrive -Name “SambaBackup” -Force
Write-Log “Desconectado del servidor Samba”

# Opcional: Eliminar backup local después de copiar
# Remove-Item -Path $fullLocalPath -Recurse -Force
# Write-Log “Backup local eliminado”

# Limpieza de backups antiguos (mantener últimos 7 días)
Write-Log “Limpiando backups antiguos (>7 días)…”
$oldBackups = Get-ChildItem -Path $localBackupPath -Directory |
Where-Object { $_.CreationTime -lt (Get-Date).AddDays(-7) }

foreach ($old in $oldBackups) {
Remove-Item -Path $old.FullName -Recurse -Force
Write-Log “Eliminado backup antiguo: $($old.Name)”
}

Write-Log “=== Proceso de backup completado exitosamente ===”
exit 0

} catch {
Write-Log “ERROR: $($_.Exception.Message)”
Write-Log “Detalle: $($_.Exception.StackTrace)”
exit 1
}

Executar l'Script

Per provar l’script, tornem a powershell i fem:

cd C:\Scripts

.\backup_ad_samba.ps1

Veuràs una sortida similar a:

Accedir als Backups al Servidor Samba

Des de l’Explorador de Windows

Obre l’explorador i escriu a la barra d’adreces:

\\10.4.0.30\backups

Introdueix les credencials quan et les demani.

(Altre test, en Linux)

Estructura del Backup

Dins de cada carpeta de backup trobaràs:

AD_Backup_20260112_110247/
├── Active Directory/
│ ├── ntds.dit (Base de dades d’AD)
│ ├── ntds.jfm (Fitxer de metadades)
│ └── edb*.log (Logs de transaccions)
└── registry/
├── SYSTEM (Registre del sistema)
├── SECURITY (Configuració de seguretat)
└── SAM (Base de dades de comptes)
 

NOTA: L’script automàticament esborra cada backup del servidor per no tindre menys espai al disc.

Justificació: Per què un Script Personalitzat és Millor?

Un script personalitzat ofereix control total sobre el procés de backup, permetent adaptar-lo exactament a les necessitats específiques del nostre entorn (ubicacions, nomenclatura, validacions). A diferència de les solucions comercials preconfigurades com Veeam o Acronis, no té cost de llicències ni requereix infraestructura addicional. S'integra perfectament amb el servidor Samba existent utilitzant protocols estàndard (SMB), sense necessitat d'agents o software propietari. A més, és completament transparent i auditable: pots veure, modificar i entendre cada línia de codi, cosa que garanteix seguretat i facilita la resolució de problemes. Finalment, no genera dependència de proveïdors externs, evitant problemes futurs si una empresa canvia les seves polítiques o deixa de donar suport al producte.

Cookie Consent Banner by Real Cookie Banner