Default all users to local Windows profiles

This commit is contained in:
2026-09-18 12:06:15 -06:00
parent 01e0ee5ac4
commit 106be26e7c
11 changed files with 442 additions and 167 deletions
+107 -136
View File
@@ -1,74 +1,70 @@
# User roaming por rol en Azure
# User roaming por rol en Azure (opcional)
El despliegue Azure puede crear almacenamiento privado y políticas distintas para
cada tipo de cuenta SGU:
> **Estado predeterminado:** desactivado. Todas las cuentas `AL`, `AD`, `DO` y
> cualquier otra cuenta de dominio usan un perfil local normal bajo `C:\Users`.
> Escritorio y Documentos permanecen en el disco del equipo; no se mapean shares
> de perfiles ni se monta un contenedor FSLogix.
La implementación se conserva para un posible piloto futuro, pero no forma parte
del enrolamiento normal. Activarla requiere dos decisiones explícitas: desplegar
la infraestructura con `-DeployUserRoaming $true
-AcknowledgeUserRoamingRisks` y después ejecutar el configurador con
`-AcknowledgeUserRoamingRisks`.
## Diseño opcional
Cuando se habilita expresamente, el comportamiento es:
| Rol | Datos conservados | Implementación |
| --- | --- | --- |
| `AL` | `Desktop` y `Documents` | Redirección de carpetas a Azure Files; el resto del perfil local no es autoritativo y no se copia al iniciar o cerrar sesión. |
| `AD` / `DO` | Perfil completo | FSLogix: montaje directo del VHDX con endpoint privado o Cloud Cache local sincronizada con Azure Files cuando el endpoint es público. |
| `AL` | `Desktop` y `Documents` | Redirección de carpetas a Azure Files; el resto del perfil sigue local. |
| `AD` / `DO` | Perfil completo | FSLogix VHDX: montaje directo con endpoint privado o Cloud Cache con endpoint público. |
Linux conserva su solución nativa de directorios personales; no intenta montar
un perfil de Windows.
Linux conserva su directorio personal nativo y no monta un perfil de Windows.
## Arquitectura y seguridad
`infra/azure/main.bicep` puede crear una cuenta `StorageV2` dedicada con shares
`profiles` y `redirected`, soft delete de 14 días, private endpoint y zona
`privatelink.file.<sufijo-de-Azure>`. Su valor predeterminado
`deployUserRoaming=false` evita crear estos recursos. La cuenta de staging usada
para paquetes no se reutiliza automáticamente como almacenamiento de perfiles.
`infra/azure/main.bicep` crea, por omisión, una cuenta `StorageV2` dedicada con
dos recursos SMB (`profiles` y `redirected`), soft delete de 14 días, un private
endpoint y la zona `privatelink.file.<sufijo-de-Azure>` ligada a la VNet. El
endpoint público queda deshabilitado. La VNet entrega el DNS del controlador de
dominio a los clientes P2S para que el nombre de Azure Files resuelva a la IP
privada. La cuenta de staging usada para transferir paquetes no se reutiliza ni
se convierte en almacenamiento de perfiles.
Los clientes de un endpoint privado requieren P2S u otra ruta privada a la VNet.
Un endpoint público exige resolución DNS, salida TCP 445 y reglas de red de
Storage limitadas a redes institucionales. El modo `Auto` selecciona `Direct`
para endpoint privado y `CloudCache` para uno público. `CCDLocations` y
`VHDLocations` son mutuamente excluyentes.
Los clientes deben usar el P2S de Azure o disponer de otra ruta privada a la
VNet. El modo de enrolamiento público directo no puede usar estos recursos y el
script de despliegue exige `-DeployUserRoaming $false` cuando no se despliega el
gateway P2S.
Azure Files se integra con AD DS mediante Kerberos AES-256. Las ACL de la raíz
usan `CREATOR OWNER` para aislar los directorios de usuarios. La clave de la
cuenta se usa sólo en memoria durante la creación de ACL y no se guarda en GPO.
Para una cuenta SMB ya existente cuyo endpoint público se limite mediante el
firewall de Storage a las redes institucionales, el configurador admite
`-EndpointAccess Public`. En ese modo no exige una dirección RFC1918, pero sigue
comprobando resolución DNS y TCP 445. La creación de los shares y las reglas de
red de la cuenta existente se realiza antes de ejecutar el configurador. El host
que aplica la integración AD/ACL debe conservar acceso temporal a SMB durante
esa ejecución; después se establece `defaultAction=Deny` y se deja únicamente la
red institucional autorizada. En el despliegue LCI actual esa regla final es
`200.13.89.0/24`.
## Riesgos que deben aceptarse
El modo `-StaffProfileStorageMode Auto` es el predeterminado. Selecciona
`Direct` con un endpoint privado y `CloudCache` con uno público. Cloud Cache
mantiene el VHDX de trabajo en `C:\ProgramData\FSLogix\Cache` y sincroniza sus
cambios con Azure Files, evitando que cada operación del perfil dependa de la
latencia WAN de SMB. `CCDLocations` y `VHDLocations` son mutuamente excluyentes:
el configurador elimina de forma efectiva el valor obsoleto al cambiar de modo,
incluso en clientes que ya habían aplicado la GPO anterior. Puede forzarse un
modo con `-StaffProfileStorageMode Direct` o `CloudCache`, pero `Direct` sobre
un endpoint público sólo debe usarse para diagnóstico.
El piloto de septiembre de 2026 confirmó que esta función puede aumentar de
forma considerable el tiempo de inicio y cierre de sesión. Antes de activarla se
deben aceptar y probar, como mínimo, estos escenarios:
Cloud Cache necesita espacio local suficiente para el perfil (30 GB de máximo
por omisión), conserva la caché tras cerrar sesión y exige al menos un proveedor
remoto sano al registrar o desmontar el perfil. Si el proveedor no completa la
sincronización, el cierre espera como máximo 60 segundos y después conserva la
caché local para reintentar; no la descarta. La GPO también impide el inicio
con perfil temporal o local cuando FSLogix falla, para que una incidencia no
produzca dos perfiles divergentes silenciosamente.
- latencia o indisponibilidad de Azure Files que mantiene `Welcome` o `Sign out`
durante varios minutos;
- VHDX remoto en estado abierto, pendiente de eliminación o de creación, con
fallos como `0x80070050`;
- caché o proxy local obsoleto de Cloud Cache y fallos de registro como
`0xE000000B`;
- recuperación que puede exigir detener por fuerza los servicios FSLogix y
reiniciar el equipo;
- datos todavía no sincronizados, caché local insuficiente o divergencia si se
fuerza una recuperación;
- dependencia de DNS, Kerberos, TCP 445, la red y el servicio de Storage tanto
para registrar como para desmontar el perfil.
Azure Files se integra con el AD DS SGU, no con cuentas o claves guardadas en
cada cliente. El script configura AES-256 para Kerberos, una ACL de mínimo
privilegio con `CREATOR OWNER`, administradores y los grupos del rol, y permiso
SMB predeterminado para identidades autenticadas. La ACL NTFS mantiene aislado
el contenido de cada usuario. La clave de la cuenta se usa en memoria sólo para
crear las ACL iniciales y no se escribe en el dominio, en GPO ni en disco.
No se debe desplegar a todos los usuarios sin un piloto de inicio, cierre,
desconexión, cuota, restauración y pérdida temporal del proveedor. Cloud Cache
reduce I/O WAN síncrono, pero no elimina la dependencia al cerrar sesión.
Los grupos de rol sólo pueden enumerar la raíz y crear su propio directorio; no
reciben `Modify` en la raíz compartida. El directorio creado hereda `CREATOR
OWNER`, de modo que un usuario no puede modificar ni eliminar el contenedor de
otro usuario.
## 1. Desplegar la infraestructura opcional
## 1. Desplegar la infraestructura
El soporte está activado por omisión para despliegues P2S:
El despliegue normal no incluye user roaming. Para crear deliberadamente sus
recursos:
```powershell
$azure = .\scripts\Deploy-SguAzureInfrastructure.ps1 `
@@ -76,128 +72,103 @@ $azure = .\scripts\Deploy-SguAzureInfrastructure.ps1 `
-ResourceGroupName 'rg-sgu-lab' `
-Location 'centralus' `
-AdministratorUsername 'azureadmin' `
-P2sRootCertificatePath $p2s.RootCertificatePath
$azure.UserRoamingStorageAccountName
$azure.FsLogixProfilesSharePath
$azure.RedirectedFoldersSharePath
$azure.UserRoamingSetupArguments
-P2sRootCertificatePath $p2s.RootCertificatePath `
-DeployUserRoaming $true `
-AcknowledgeUserRoamingRisks
```
Puede definirse un nombre globalmente único con
`-UserRoamingStorageAccountName`. Para omitir completamente el almacenamiento:
```powershell
-DeployUserRoaming $false
```
Puede definirse un nombre con `-UserRoamingStorageAccountName`. Si no se pasan
los dos parámetros de aceptación, la infraestructura de perfiles no se crea.
## 2. Unir Azure Files al dominio y publicar las GPO
Primero termine `Initialize-SguDomainController.ps1`. Después, en Windows
PowerShell 5.1 elevado dentro del DC:
1. Instale Azure PowerShell actual (`Az.Accounts` y `Az.Storage` 8.1 o posterior).
2. Descargue y extraiga el módulo oficial
[AzFilesHybrid](https://github.com/Azure-Samples/azure-files-samples/releases).
3. Ejecute el configurador incluido en el paquete de servidor:
PowerShell 5.1 elevado dentro del DC, instale Azure PowerShell y el módulo oficial
[AzFilesHybrid](https://github.com/Azure-Samples/azure-files-samples/releases),
y ejecute:
```powershell
$storageAccountName = '<valor UserRoamingStorageAccountName del despliegue>'
$parameters = @{
SubscriptionId = '00000000-0000-0000-0000-000000000000'
ResourceGroupName = 'rg-sgu-lab'
StorageAccountName = $storageAccountName
StorageAccountName = '<cuenta de perfiles>'
FsLogixProfilesShareName = 'profiles'
RedirectedFoldersShareName = 'redirected'
AzFilesHybridModulePath = 'C:\Admin\AzFilesHybrid'
UseDeviceAuthentication = $true
AcknowledgeUserRoamingRisks = $true
}
.\payload\scripts\Enable-SguAzureUserRoaming.ps1 @parameters
```
Para reutilizar una cuenta con endpoint público:
Para una cuenta autorizada con endpoint público:
```powershell
$parameters.EndpointAccess = 'Public'
$parameters.StaffProfileStorageMode = 'Auto' # resuelve a CloudCache
$parameters.StaffProfileStorageMode = 'Auto'
.\payload\scripts\Enable-SguAzureUserRoaming.ps1 @parameters
```
La operación es idempotente. Crea `OU=AzureFilesConfig`, une la cuenta de
almacenamiento al bosque y publica dos GPO:
El script crea las GPO `SGU - AL redirected folders` y `SGU - AD-DO FSLogix
profiles`, y vuelve a habilitar el enlace de instalación de FSLogix si ya existe.
No borra perfiles locales existentes salvo que se proporcione deliberadamente
`-DeleteExistingStaffLocalProfiles`.
- `SGU - AL redirected folders`, ligada a `OU=Alumnos`;
- `SGU - AD-DO FSLogix profiles`, ligada a `OU=Laboratorio` y habilitada sólo
mediante configuración `ObjectSpecific` para los SID de `SGU-Docentes` y
`SGU-Administrativos`.
## 3. Instalar FSLogix sólo para un piloto
Por seguridad, el script no borra perfiles locales existentes de AD/DO. Antes
de un piloto real, migre o respalde su contenido y elimínelos manualmente. El
switch `-DeleteExistingStaffLocalProfiles` habilita la opción de FSLogix que los
elimina al aplicar el contenedor; úselo sólo después de respaldar y validar.
La identidad de Azure Files queda con contraseña sin expiración en la OU
dedicada para evitar que una cuenta de equipo sin agente pierda Kerberos a los
30 días. Si la política exige rotación, use periódicamente el procedimiento
oficial `Update-AzStorageAccountADObjectPassword` y no cambie sólo un lado.
## 3. Instalar FSLogix en los clientes Windows
FSLogix no forma parte de Windows y su licencia debe validarse para las ediciones
y suscripciones usadas. Descargue `FSLogixAppsSetup.exe` directamente de
Microsoft y agréguelo a la imagen base, o páselo como quinto argumento al
enrolamiento Azure:
```bat
Start-SguAzureClientEnrollment.cmd 10.77.0.4 C:\SGU\vpn.zip C:\SGU\client.pfx C:\SGU\root.cer C:\SGU\FSLogixAppsSetup.exe
```
`Install-SguFsLogix.ps1` exige una firma Authenticode válida de Microsoft,
instala silenciosamente sin reiniciar y comprueba `frxsvc` y `frx.exe`. Si la
imagen ya contiene FSLogix, el instalador puede omitirse. Microsoft recomienda
mantener la versión más reciente; FSLogix no se actualiza mediante Windows
Update.
Para cubrir también equipos ya unidos al dominio —incluidos los que estaban
apagados durante el despliegue— publique el instalador como script de inicio de
equipo:
FSLogix no forma parte de Windows. Valide su licencia y descargue
`FSLogixAppsSetup.exe` directamente de Microsoft. Puede pasarse como quinto
argumento al enrolamiento Azure o publicarse con:
```powershell
.\payload\scripts\Publish-SguFsLogixClientDeployment.ps1
```
El script descarga el paquete oficial FSLogix 26.08, valida la firma
Authenticode de Microsoft y el SHA-256 esperado, y crea la GPO
`SGU - FSLogix client deployment` ligada a `OU=Laboratorio`. El ejecutable queda
en el SYSVOL de esa GPO y se instala de forma idempotente durante el arranque;
no usa tareas programadas ni requiere que el equipo estuviera encendido al
publicarla. Si `frxsvc` y `frx.exe` ya existen, el script de inicio termina sin
reinstalar.
El publicador valida firma y SHA-256 y crea `SGU - FSLogix client deployment`.
El rollback descrito abajo deshabilita su enlace para que no se instale en más
equipos.
## 4. Validar un piloto
## 4. Desactivar y volver a perfiles locales
Después de `gpupdate /force` y reiniciar un cliente:
Ejecute desde Windows PowerShell 5.1 elevado en el controlador de dominio:
```powershell
.\payload\scripts\Disable-SguAzureUserRoaming.ps1
```
Es idempotente y realiza lo siguiente:
- fija `Profiles\Enabled=0` y `ODFC\Enabled=0`;
- deshabilita `frxsvc` y `frxccds` mediante GPO;
- elimina `CCDLocations`, `VHDLocations` y valores de contenedor específicos de
los grupos `SGU-Administrativos` y `SGU-Docentes`;
- restaura Escritorio y Documentos de alumnos a
`%USERPROFILE%\Desktop` y `%USERPROFILE%\Documents`;
- deshabilita el enlace de despliegue del cliente FSLogix;
- limpia `profilePath`, `homeDirectory` y `homeDrive` de los usuarios de las OU
SGU, salvo que se use `-PreserveLegacyUserMappings`.
Después aplique `gpupdate /force` y reinicie cada Windows administrado antes de
probar un nuevo inicio de sesión. El primer ingreso vuelve a crear o reutilizar
un perfil local. El script no borra automáticamente VHDX, shares de Azure ni
cachés existentes: conservarlos permite recuperación y evita destrucción de
datos. Su eliminación debe ser una decisión separada y posterior a la validación.
## 5. Validar un piloto futuro
Después de `gpupdate /force` y reiniciar un cliente de prueba:
```powershell
Resolve-DnsName "$($azure.UserRoamingStorageAccountName).file.core.windows.net"
Test-NetConnection "$($azure.UserRoamingStorageAccountName).file.core.windows.net" -Port 445
Get-Service frxsvc
Get-ItemProperty 'HKLM:\SOFTWARE\FSLogix\Profiles\ObjectSpecific\<SID-del-grupo>'
Get-ItemProperty 'HKLM:\SOFTWARE\SGU\FSLogixDeployment'
& 'C:\Program Files\FSLogix\Apps\frx.exe' list-redirects
```
En modo privado, la resolución debe devolver la IP privada del endpoint; en
modo público debe devolver una dirección pública y TCP 445 debe estar permitido
desde la red institucional. En Cloud Cache compruebe además que existe
`C:\ProgramData\FSLogix\Cache` y que el registro efectivo contiene
`CCDLocations`, pero no `VHDLocations`. Inicie primero con un
`AL` nuevo y confirme las ubicaciones de Escritorio/Documentos; luego pruebe un
`AD` o `DO` sin perfil local previo y confirme la creación de un VHDX en
`profiles`. Revise `%ProgramData%\FSLogix\Logs\Profile` para confirmar que el
perfil se registró sin `ERROR: 258`, perfil temporal ni retorno a `C:\Users`.
No active el borrado de perfiles locales ni despliegue a todos los
usuarios hasta probar inicio, cierre, desconexión de VPN, cuota y restauración.
Revise `%ProgramData%\FSLogix\Logs\Profile`, pruebe inicio y cierre varias veces,
simule indisponibilidad y valide restauración. No active el borrado de perfiles
locales ni amplíe el alcance antes de superar esas pruebas.
Referencias de Microsoft: