Add one-command server and client bootstraps
This commit is contained in:
@@ -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.
|
||||
Reference in New Issue
Block a user