Add one-command server and client bootstraps

This commit is contained in:
2026-09-03 16:34:21 -06:00
parent 742ae9c2b5
commit 3a10098239
19 changed files with 1569 additions and 37 deletions
+146
View File
@@ -0,0 +1,146 @@
# Recuperación desde cero y alta en una sola ejecución
Los releases entregan dos ZIP independientes. Cada uno contiene sus binarios,
scripts, instalador offline requerido y un manifiesto SHA-256 interno. No contienen
contraseñas, claves privadas ni certificados reutilizables.
> Importante: reconstruir un bosque con el mismo nombre DNS **no** restaura el
> bosque anterior. Cambia el SID del dominio. Los equipos unidos al bosque viejo
> deberán borrarse/reinstalarse o salir de aquel dominio y unirse al nuevo. Para
> conservar cuentas, SID, contraseñas y relaciones de confianza se necesita una
> copia de estado del sistema de Active Directory y un procedimiento de
> recuperación de bosque, no este bootstrap.
## Windows Server nuevo
Compatible con Windows Server con Windows PowerShell 5.1. El servidor necesita
una interfaz privada para el dominio y, para autenticar contra SGU, salida HTTPS
por esa u otra interfaz.
1. Descargar y extraer `sgu-server-bootstrap-VERSION.zip`.
2. Abrir el directorio extraído.
3. Ejecutar, indicando la IP fija que tendrá el controlador:
```bat
Start-SguServerBootstrap.cmd 192.168.50.10
```
El iniciador solicita elevación UAC. El script pide una contraseña de Directory
Services Restore Mode sin guardarla, instala AD DS/DNS/GPMC, crea el bosque y
reinicia una vez. Un trabajo local bajo `SYSTEM` continúa automáticamente un
minuto después del arranque; no hace falta ejecutar un segundo comando.
Cuando hay más de una interfaz candidata, o se necesita gateway/prefijo/forwarders
explícitos, usar Windows PowerShell elevado:
```powershell
powershell.exe -NoProfile -ExecutionPolicy Bypass `
-File .\Initialize-SguDomainController.ps1 `
-ServerIPv4Address 192.168.50.10 `
-PrefixLength 24 `
-NetworkInterfaceAlias 'Ethernet' `
-DnsForwarders 172.21.80.1,1.1.1.1
```
El proceso crea o configura de forma idempotente:
- bosque y DNS `lci.lasalle.mx` / `LCI`;
- registro `sgu-auth.lci.lasalle.mx` apuntando a la IP proporcionada;
- `OU=Laboratorio`, `OU=Usuarios-SGU` y sus OU `Docentes`, `Alumnos` y
`Administrativos`;
- grupo de seguridad `SG-Laboratorio-Usuarios-RDP`;
- GPO de experiencia del equipo y restricciones de sesión SGU;
- certificado de servidor no exportable y broker mTLS en TCP 8443;
- recurso `\\SERVIDOR\Packages`, con lectura para Domain Computers;
- RDP con NLA, WinRM/PowerShell Remoting y reglas administrativas sólo en el
perfil Domain;
- pantalla, suspensión e hibernación en Nunca.
El broker arranca con una lista de clientes vacía. Eso no abre el servicio: mTLS
rechaza todos los certificados hasta que el primer cliente registra el suyo.
Los archivos opcionales colocados en `payload\server-content\Packages` al crear
el release se copian al recurso compartido. Si allí existe `wallpaper.jpg`,
`wallpaper.jpeg`, `wallpaper.png` o `wallpaper.bmp`, la GPO de usuarios lo aplica
automáticamente como fondo con ajuste Fill.
Estado y diagnóstico:
```powershell
Get-Content C:\ProgramData\SGU\Bootstrap\Server\bootstrap.log
Get-Content C:\ProgramData\SGU\Bootstrap\Server\bootstrap-complete.json
Get-ScheduledTask SGU-Complete-Domain-Controller-Bootstrap -ErrorAction SilentlyContinue
```
La tarea programada se elimina únicamente cuando todas las verificaciones
finales concluyen. Si algo externo falla, corregirlo y volver a ejecutar el mismo
script; las operaciones terminadas se reutilizan.
## Windows 10/11 nuevo
Se admiten Pro, Enterprise y Education. Windows Home no puede unirse a Active
Directory local ni actuar como host RDP; el bootstrap lo detecta antes de cambiar
el equipo y explica que se debe actualizar la edición.
1. Descargar y extraer `sgu-client-bootstrap-VERSION.zip`.
2. Ejecutar con la IP fija actual del controlador de dominio:
```bat
Start-SguClientEnrollment.cmd 192.168.50.10
```
Después de UAC, se solicita interactivamente la credencial autorizada para unir
equipos. La contraseña existe sólo en memoria. El bootstrap:
1. apunta el DNS del adaptador al IP proporcionado;
2. abre una sesión WinRM autenticada con el DC y verifica que pertenece al
dominio esperado;
3. crea en el cliente un certificado mTLS RSA-3072 no exportable y envía sólo su
parte pública al broker;
4. recupera por esa sesión autenticada el certificado público del broker;
5. instala el runtime .NET 10 offline y el Credential Provider;
6. valida binarios, registro COM, certificados y salud del broker;
7. instala el guardián de reparación al arranque;
8. sólo entonces ejecuta `Add-Computer` dentro de `OU=Laboratorio` y reinicia;
9. al arrancar, activa RDP/NLA, WinRM y las reglas Domain, y vuelve a validar el
enrolamiento.
Para elegir adaptador o nombre del equipo explícitamente:
```powershell
powershell.exe -NoProfile -ExecutionPolicy Bypass `
-File .\Invoke-SguClientBootstrap.ps1 `
-DomainControllerIPv4Address 192.168.50.10 `
-NetworkInterfaceAlias 'Ethernet' `
-NewComputerName 'LCI-101'
```
La IP del argumento es siempre la IP fija **actual del servidor**, no una IP que
queda compilada en el Credential Provider. El proveedor usa después el nombre
DNS `sgu-auth.lci.lasalle.mx`, que el bootstrap del servidor actualiza.
Un administrador del dominio todavía puede ignorar deliberadamente este flujo y
ejecutar `Add-Computer` a mano; ninguna GPO puede impedir a un administrador del
bosque modificar el dominio. Para la operación soportada, el script aplica una
transacción proveedor-primero y se niega a unir un equipo que no haya pasado las
validaciones.
## Crear y publicar un release
Desde el repositorio y con el SDK fijado en `global.json`:
```powershell
.\scripts\New-SguBootstrapPackages.ps1 -Version 0.1.0
.\scripts\Publish-GiteaRelease.ps1 -Version 0.1.0
```
El segundo comando usa `GITEA_TOKEN` sólo en memoria o, si no está definido,
solicita la credencial existente a Git Credential Manager. No coloca el token en
la línea de comandos. Para empaquetar recursos institucionales adicionales:
```powershell
.\scripts\New-SguBootstrapPackages.ps1 `
-Version 0.1.0 `
-ServerContentPath C:\Preparacion\Packages
```
`SHA256SUMS-VERSION.txt` permite comprobar ambos ZIP antes de usarlos.