Files
SGU-CredentialProvider/docs/client-enrollment.md
T

183 lines
8.8 KiB
Markdown

# Enrolamiento obligatorio de clientes SGU
Para una instalación limpia de Windows se prefiere el único punto de entrada
empaquetado:
```bat
Start-SguClientEnrollment.cmd 192.168.50.10 192.168.50.11
```
Este comando realiza el intercambio de certificados descrito abajo sin mover
una clave privada y luego ejecuta la transacción proveedor-primero. Las
instrucciones completas están en
[`bootstrap-recovery.md`](bootstrap-recovery.md).
El primer argumento es la IP fija del controlador; el segundo es una IP fija y
única para el cliente en la misma subred. Si el segundo se omite y la NIC
privada no tiene una IP válida, se solicita en pantalla. El bootstrap prefiere
la única NIC activa sin puerta de enlace para no reemplazar el adaptador de
Internet. Ante cualquier error conserva la ventana y escribe el diagnóstico en
`C:\ProgramData\SGU\Bootstrap\Client\latest-error.log`.
El flujo administrado instala y valida el Credential Provider **antes** de
ejecutar `Add-Computer`. La pertenencia al dominio es el último cambio; si falta
el runtime, un certificado, el registro COM, la directiva predeterminada o la
salud mTLS del broker, el script rechaza la unión.
Una cuenta administrativa todavía puede modificar Windows fuera de este flujo.
Por eso el enrolamiento también instala la tarea
`SGU-CredentialProvider-EnrollmentGuard`, ejecutada como `SYSTEM` al iniciar y
diariamente. La tarea conserva un paquete local protegido, repara el registro o
los binarios y vuelve a habilitar RDP/WinRM en equipos unidos al dominio. No
guarda contraseñas.
## 1. Preparar el nuevo Windows Enterprise
En la VM nueva, antes de unirla al dominio:
1. copiar `artifacts\credential-provider` y todos los scripts de `scripts`;
2. copiar el instalador offline más reciente de .NET 10 x64;
3. crear el certificado cliente no exportable:
```powershell
powershell.exe -NoProfile -ExecutionPolicy Bypass `
-File .\New-LabCertificate.ps1 `
-Role CredentialProviderClient
```
Copiar únicamente el `.cer` público al broker y registrarlo:
```powershell
powershell.exe -NoProfile -ExecutionPolicy Bypass `
-File .\Register-SguClientCertificate.ps1 `
-CertificatePath C:\SGUDeploy\new-client.cer
```
Exportar únicamente el certificado público actual del broker e importarlo en
el cliente con `Import-LabPeerCertificate.ps1`. Nunca copiar claves privadas.
## 2. Instalar, comprobar y unir en una sola operación
Ejecutar como administrador local dentro de la VM nueva. La credencial del
dominio se solicita de forma segura si no se proporciona como objeto
`PSCredential`:
```powershell
powershell.exe -NoProfile -ExecutionPolicy Bypass `
-File .\Enroll-SguDomainClient.ps1 `
-PublishPath C:\SGUDeploy\credential-provider `
-BrokerEndpoint https://sgu-auth.lci.lasalle.mx:8443/v1/authenticate `
-ClientCertificateThumbprint CLIENT_CERT_THUMBPRINT `
-ServerCertificateThumbprint SERVER_CERT_THUMBPRINT `
-DotNetRuntimeInstallerPath C:\SGUDeploy\dotnet-runtime-10-win-x64.exe `
-ComputerOuDn 'OU=Laboratorio,DC=lci,DC=lasalle,DC=mx' `
-NewComputerName LAB-W11-001
```
Orden de la transacción:
1. instala .NET y los binarios versionados;
2. registra COM, configura SGU como proveedor predeterminado y oculta el
último usuario que cerró sesión;
3. crea o actualiza la cuenta local estándar `alumno` con la contraseña
`ingenieria`, la habilita y garantiza que no pertenezca a Administradores;
4. instala el guard de autorreparación;
5. exige health mTLS del broker y ejecuta las comprobaciones locales;
6. configura DNS del dominio;
7. sólo entonces ejecuta `Add-Computer` en `OU=Laboratorio` y reinicia;
8. al arrancar, el guard habilita RDP, NLA y WinRM y comprueba el estado final.
La directiva de Windows **Assign a default credential provider** selecciona SGU
por defecto. El instalador también habilita **Interactive logon: Don't display
last signed-in** y deshabilita **Enumerate local users on domain-joined
computers**. De este modo un usuario SGU desaparece después de cerrar sesión y
permanece el mosaico genérico **Other user**. No se instala ningún filtro: el
proveedor de contraseña de Microsoft permanece disponible para cuentas creadas
manualmente y recuperación.
La GPO existente **Deploy VSCodium** debe estar vinculada una vez a
`OU=Laboratorio` (configuración de equipo) y a `OU=Usuarios-SGU` (configuración
de usuario: fondo institucional). El parámetro `ComputerOuDn` coloca los
equipos nuevos directamente en `Laboratorio`; VSCodium se instala en el
siguiente arranque síncrono y el fondo se aplica al siguiente inicio de sesión
del usuario SGU.
En el controlador de dominio, aplicar una vez la directiva de usuario al árbol
completo `Usuarios-SGU` y la directiva de equipo a `Laboratorio`:
```powershell
.\Set-SguDomainUserPolicies.ps1
.\Set-SguDomainComputerPolicies.ps1
```
El script crea y vincula de forma idempotente el GPO
`SGU - User session restrictions` y configura `DisableLockWorkstation=1` para
Administrativos, Alumnos y Docentes; también deshabilita el protector de
pantalla. El segundo crea `SGU - Windows client experience` y, antes del primer
inicio de sesión de dominio, suprime la experiencia de privacidad, las
notificaciones y controles de telemetría, la animación **Hi / Preparing
Windows**, y el acceso a ubicación. Además fija en **Nunca** el apagado de
pantalla, suspensión, hibernación y suspensión híbrida, conectado a corriente o
batería. El guard de enrolamiento vuelve a aplicar `powercfg /hibernate off` y
los tiempos en cero al inicio y diariamente.
Esa GPO también ejecuta el generador local del fondo de bienvenida y aplica el
fondo azul base a la pantalla de bloqueo. El fondo individual se crea al abrir la
sesión con el nombre del usuario y `location`/OU del equipo; véase
[welcome-wallpaper.md](welcome-wallpaper.md).
`HideEULAPage` no forma parte de esta GPO: es una opción de archivo Unattend para
la fase OOBE y Microsoft la reserva para pruebas de OEM/System Builder. La GPO
usa las alternativas soportadas `DisablePrivacyExperience=1` y
`EnableFirstLogonAnimation=0`, que son las que afectan a cada cuenta de dominio
nueva.
## 3. Verificación y reparación
```powershell
.\Test-SguClientEnrollment.ps1 `
-RequireDomainJoined `
-RequireRemoteAccess `
-RequireBrokerHealth `
-Enforce
Get-ScheduledTask -TaskName SGU-CredentialProvider-EnrollmentGuard
Start-ScheduledTask -TaskName SGU-CredentialProvider-EnrollmentGuard
```
Un resultado válido exige simultáneamente binario y registro COM, configuración,
certificados, .NET 10, proveedor SGU predeterminado, último usuario oculto,
enumeración local deshabilitada, cuenta local estándar `alumno` habilitada y
fuera del grupo Administradores, y proveedor de contraseña de Microsoft
preservado. El guard recrea o corrige esa cuenta de forma idempotente. El script de reparación se encuentra en
`C:\ProgramData\SGU\Enrollment` con ACL exclusiva para `SYSTEM` y
administradores.
## 4. Experiencia de LogonUI
El proveedor usa un mosaico genérico dedicado, no una credencial asociada al SID
anónimo de **Other user**. Windows muestra la imagen institucional y la etiqueta
`La Salle · Acceso SGU`; el encabezado `Acceso institucional SGU`
se publica como `CPFT_LARGE_TEXT` solamente en el mosaico seleccionado. LogonUI
elige la familia, el peso y el tamaño final y no expone opciones de tipografía a
un Credential Provider.
La configuración soportada garantiza que SGU queda seleccionado por defecto y
que no se conserva el último usuario. El orden vertical exacto de mosaicos lo
decide LogonUI y no tiene una directiva pública. Por seguridad no se filtra ni
se elimina **Other user**: Microsoft recomienda conservar al menos un proveedor
del sistema como ruta de recuperación.
Referencias de Microsoft:
- <https://learn.microsoft.com/en-us/windows/client-management/mdm/policy-csp-admx-credentialproviders#defaultcredentialprovider>
- <https://learn.microsoft.com/en-us/windows/client-management/mdm/policy-csp-windowslogon#enumeratelocalusersondomainjoinedcomputers>
- <https://learn.microsoft.com/en-us/windows/client-management/mdm/policy-csp-admx-ctrlaltdel#disablelockcomputer>
- <https://learn.microsoft.com/en-us/windows/client-management/mdm/policy-csp-privacy#disableprivacyexperience>
- <https://learn.microsoft.com/en-us/windows/client-management/mdm/policy-csp-windowslogon#enablefirstlogonanimation>
- <https://learn.microsoft.com/en-us/windows/privacy/manage-connections-from-windows-operating-system-components-to-microsoft-services#182-location>
- <https://learn.microsoft.com/en-us/windows-hardware/design/device-experiences/powercfg-command-line-options>
- <https://learn.microsoft.com/en-us/windows-hardware/customize/desktop/automate-oobe>
- <https://learn.microsoft.com/en-us/windows/win32/api/credentialprovider/ne-credentialprovider-credential_provider_field_type>
- <https://learn.microsoft.com/en-us/windows/win32/api/credentialprovider/nf-credentialprovider-icredentialprovidercredential2-getusersid>