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 backupC:\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_110247Inicia el fitxer de log a
C:\Logs\
Pas 2: Backup de l’Active Directory
Utilitza
ntdsutilper 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.