Selección de la cuenta de un servicio de Windows — Cuándo usar LocalSystem, cuentas virtuales y gMSA
· Actualizado el: · Go Komura · Windows, Servicios de Windows, Cuentas de servicio, gMSA, LocalSystem, Cuentas virtuales, Seguridad, Active Directory, Privilegio mínimo
«El servicio interno que veníamos ejecutando con LocalSystem “por ahora” recibió en la auditoría de seguridad la observación de “privilegios excesivos”. ¿A qué debería cambiarlo?» «Como el servicio no podía acceder a la carpeta compartida, lo ejecutamos con un usuario de dominio. Como el servicio se detiene cuando vence la contraseña, la configuramos sin vencimiento, y quedó escrita en texto plano en el procedimiento» — estas dos consultas sobre servicios de Windows son clásicas entre nuestros clientes.
Lo que tienen en común ambos casos es que la cuenta de ejecución del servicio quedó fija como una “configuración que funcionó”, no como una “decisión de diseño”. Un servicio de Windows siempre se ejecuta en el contexto de seguridad de alguna cuenta, y esa cuenta determina por completo qué puede hacer localmente, quién la ve desde el otro lado de la red y quién gestiona la contraseña. Si se deja este punto en su valor predeterminado, la vulnerabilidad de un solo servicio se convierte directamente en la toma de control de toda la máquina, y las contraseñas en texto plano terminan dispersas por procedimientos y scripts.
flowchart TB
accTitle: Las tres cosas que determina la cuenta de ejecución
accDescr: Un servicio siempre se ejecuta en el contexto de seguridad de alguna cuenta, y esa cuenta determina qué puede hacer localmente, quién la ve desde el otro lado de la red y quién gestiona la contraseña
acct["Cuenta de ejecución del servicio"] --> local["Qué puede hacer localmente"]
acct --> net["Quién la ve desde el otro lado de la red"]
acct --> pwd["Quién gestiona la contraseña"]
Figura 1: La elección de la cuenta de ejecución es una decisión de diseño que fija a la vez el privilegio local, la identidad en red y la gestión de la contraseña.
En la práctica hay seis opciones — LocalSystem, LocalService, NetworkService, la cuenta virtual (NT SERVICE\
La forma de construir el servicio en sí (cuándo usarlo frente al Programador de tareas, la implementación con .NET Worker Service) se trata en «Cómo crear y operar servicios de Windows». Este artículo se centra en la “cuenta de ejecución”, que es donde ocurren la mayoría de los incidentes.
1. Conclusión principal
- Si tiene dudas, para un servicio que se completa dentro de una sola máquina, la primera opción es la cuenta virtual; para uno que accede a recursos del dominio con una identidad propia del servicio, la primera opción es gMSA. Microsoft también recomienda usar siempre que sea posible una cuenta administrada (MSA/cuenta virtual).12
- No elija LocalSystem solo “porque funciona”. Su token incluye SYSTEM y BUILTIN\Administrators y tiene privilegios potentes como SeDebugPrivilege, así que si lo comprometen, pierde prácticamente toda la máquina. Que el valor predeterminado de
sc.exe createsea LocalSystem es el caldo de cultivo de este incidente.34 - La diferencia entre LocalService y NetworkService es la identidad en red. El privilegio local es mínimo en ambos casos, pero de cara al exterior LocalService se ve como anónimo y NetworkService se ve como la cuenta de equipo.5
- **La cuenta virtual (NT SERVICE\
) es la solución moderna por defecto: separa la identidad de cada servicio sin necesidad de gestionar contraseñas.** Se puede indicar directamente "NT SERVICE\\nombre_del_servicio" en la ACL, y también es la cuenta de servicio predeterminada de SQL Server.[^understand-service-accounts][^sql-service-accounts] - Cuando LocalSystem, NetworkService o la cuenta virtual salen a la red, se convierten en la cuenta de equipo (DOMAIN\nombre_del_equipo$). Otorgar el PC$ a la carpeta compartida o a la ACL de SQL Server permite evitar el usuario de dominio en muchos casos.36
- Usar un usuario de dominio en un servicio genera pasivos tanto en la operación de contraseñas como frente al Kerberoasting. El SCM inicia sesión con la contraseña guardada, así que el vencimiento provoca un fallo de inicio del servicio, y evitarlo con “sin vencimiento + nota en texto plano” es un regalo para los atacantes.78
- gMSA hace que Active Directory genere y rote automáticamente la contraseña. Los requisitos son el dominio y la clave raíz de KDS; en el servicio se configura “DOMAIN\nombre_de_cuenta$” con el campo de contraseña vacío. Hay que verificar de antemano si la aplicación es compatible.910
- Cambiar de cuenta cambia las suposiciones del perfil, %TEMP% y DPAPI. Los datos protegidos con DPAPI de la cuenta anterior no se pueden descifrar con la cuenta nueva.
- El inventario actual se puede confirmar con la cuenta de ejecución de la lista de servicios y con el evento ID 4624 (tipo de inicio de sesión 5).11
Resumido en una frase, la conclusión de este artículo es: use como norma configuraciones que “no den al servicio una contraseña de tipo humano” (cuentas integradas, cuentas virtuales, gMSA), y deje el usuario de dominio como último recurso.
2. Panorama general de las opciones — Las 6 cuentas de ejecución en una sola tabla
Repasemos primero un punto de base. Al iniciarse el servicio, el Administrador de control de servicios (SCM) inicia sesión con la cuenta configurada y, si tiene éxito, crea un token de acceso y lo asigna al proceso del servicio. A partir de ahí, todo acceso a archivos, canalizaciones y demás recursos se decide comparando este token con la ACL.7 Es decir, elegir la cuenta de ejecución es diseñar el contenido del token que se entrega al proceso del servicio. A continuación se enumeran las seis opciones.
flowchart TB
accTitle: Lo que hace el SCM al iniciar un servicio
accDescr: El SCM inicia sesión con la cuenta configurada y, si tiene éxito, crea un token de acceso y lo asigna al proceso del servicio; a partir de ahí, todo acceso a recursos se decide comparando el token con la ACL
scm["SCM"] --> logon["Inicia sesión con la cuenta configurada"]
logon --> token["Crea un token de acceso"]
token --> proc["Lo asigna al proceso del servicio"]
proc --> access["Acceso a archivos o canalizaciones"]
access --> check{"¿La ACL lo permite?"}
check -->|Sí| ok["Acceso concedido"]
check -->|No| deny["Acceso denegado"]
Figura 2: Todo acceso a recursos del servicio se decide comparando el token que crea el SCM al iniciar con la ACL.
| Cuenta | Privilegio local | Identidad en red | Gestión de contraseña | Uso principal |
|---|---|---|---|---|
| LocalSystem | Prácticamente sin límite (SYSTEM+Administrators) | Cuenta de equipo (PC$) | No requerida (sin contraseña) | Solo servicios excepcionales integrados con el SO |
| LocalService | Mínimo (equivalente a Users) | Anónimo | No requerida | Procesamiento local que no necesita identidad en red |
| NetworkService | Mínimo (equivalente a Users) | Cuenta de equipo (PC$) | No requerida | Bajo privilegio + identidad por máquina suficiente |
| Cuenta virtual NT SERVICE\ |
Mínimo + otorgado individualmente por ACL | Cuenta de equipo (PC$) | No requerida (gestión automática) | Solución por defecto para servicios de negocio en un solo servidor |
| Usuario de dominio | Solo lo otorgado | El propio usuario | Manual (vencimiento, filtración y rotación quedan a cargo de personas) | Último recurso para apps no compatibles con gMSA |
| gMSA | Solo lo otorgado | El propio gMSA | AD la genera y rota automáticamente | Cuando se necesita una identidad propia del servicio en un entorno de dominio |
LocalSystem, LocalService, NetworkService y la cuenta virtual no tienen siquiera el concepto de contraseña. Iniciar sesión con una contraseña guardada en el SCM (es decir, algo que puede vencer o filtrarse) solo ocurre con usuarios de dominio y usuarios locales.73
A continuación profundizamos esta tabla fila por fila.
3. Cuál es el problema de LocalSystem
3.1. Más fuerte que “ejecutar como administrador”
LocalSystem (cuyo nombre de presentación es Sistema local, NT AUTHORITY\SYSTEM) es la cuenta predefinida que usa el SCM, y tiene privilegios amplios en el equipo local. El token incluye los SID de NT AUTHORITY\SYSTEM y BUILTIN\Administrators, y puede acceder a casi todos los objetos del sistema. Además, tiene habilitados por defecto SeDebugPrivilege, que permite depurar otros procesos, y SeTcbPrivilege, que le permite actuar como parte del sistema operativo.3
Esta fortaleza equivale al tamaño del daño cuando lo comprometen. Si un servicio que se ejecuta con LocalSystem tiene una sola vulnerabilidad de ejecución remota de código, el atacante llega de una sola vez a leer y alterar los archivos de todos los usuarios (en NTFS, SYSTEM tiene control total por defecto5), leer la memoria de otros procesos gracias a SeDebugPrivilege, y robar credenciales para moverse lateralmente (por ejemplo, con un ataque Pass-the-Hash como punto de partida). La cadena de robo de credenciales y movimiento lateral se trata en «NTLM y Kerberos explicados con diagramas» y en «Guía práctica de Windows LAPS».
flowchart TB
accTitle: Daño cuando se compromete un servicio con LocalSystem
accDescr: Si un servicio que se ejecuta con LocalSystem tiene una sola vulnerabilidad de ejecución remota de código, el atacante llega a leer y alterar los archivos de todos los usuarios, leer la memoria de otros procesos, robar credenciales y moverse lateralmente
vuln["Una vulnerabilidad de ejecución de código"] --> sys["El atacante obtiene privilegios SYSTEM"]
sys --> files["Lectura y alteración de archivos"]
sys --> mem["Lectura de memoria de otros procesos"]
sys --> cred["Robo de credenciales"]
cred --> lateral["Movimiento lateral a otras máquinas"]
Figura 3: Con una sola vulnerabilidad en un servicio con LocalSystem, el atacante llega de una vez a tomar toda la máquina y a un punto de partida para el movimiento lateral.
3.2. Por qué se lo sigue eligiendo
La razón es simple: es el valor predeterminado y nunca produce un acceso denegado. Cuando se omite obj= en sc.exe create, el valor predeterminado es LocalSystem4, y todavía abundan ejemplos de código antiguos y plantillas de instalador que dan por sentado LocalSystem. Como durante el desarrollo no aparecen errores de permisos, se genera en serie el patrón de “funcionó, así que se deja así”. La propia documentación de Microsoft indica explícitamente que la mayoría de los servicios no necesita un nivel de privilegio tan alto, y que conviene considerar LocalService o NetworkService cuando no sea necesario.3
flowchart TB
accTitle: La estructura que perpetúa el uso de LocalSystem
accDescr: El valor predeterminado de sc.exe create es LocalSystem, y muchos ejemplos y plantillas antiguos también lo dan por hecho, así que durante el desarrollo no aparecen errores de permisos y se generan en serie configuraciones que se dejan tal como funcionaron
def["Valor predeterminado de sc.exe create"] --> lsys["Se crea con LocalSystem"]
old["Ejemplos y plantillas antiguos"] --> lsys
lsys --> noerr["No aparece acceso denegado durante el desarrollo"]
noerr --> asis["Se deja tal como funcionó"]
asis --> mass["Se generan en serie servicios con privilegios excesivos"]
Figura 4: El valor predeterminado y una experiencia de desarrollo sin “acceso denegado” generan en serie servicios que quedan fijos en LocalSystem.
3.3. Diferencia con TrustedInstaller — LocalSystem tampoco es ilimitado
Cabe aclarar que llamar a LocalSystem “la cuenta más fuerte de Windows” no es exacto. Desde Windows Vista, la Protección de recursos de Windows (WRP) permite modificar los archivos, carpetas y claves de registro críticos del sistema operativo solo a TrustedInstaller (el servicio Instalador de módulos de Windows); ni siquiera SYSTEM ni un administrador pueden escribir ahí, y reciben acceso denegado.12 El mensaje del Explorador «Necesita permiso de TrustedInstaller para realizar esta acción» refleja este mecanismo. Dicho de otro modo, LocalSystem tiene acceso a prácticamente todo lo que queda fuera del área protegida por WRP, y normalmente no hay motivo para otorgárselo a un servicio de negocio.
flowchart TB
accTitle: Relación entre el área protegida por WRP y TrustedInstaller
accDescr: Solo TrustedInstaller puede modificar los archivos de sistema y claves de registro críticos que protege WRP; incluso SYSTEM o un administrador reciben acceso denegado
ti["TrustedInstaller"] -->|Puede modificar| wrp["Archivos de sistema protegidos por WRP"]
sysadm["SYSTEM y administradores"] -->|Acceso denegado| wrp
sysadm -->|Casi todo permitido| other["Fuera del área protegida por WRP"]
Figura 5: LocalSystem tampoco es ilimitado; la modificación del área protegida por WRP solo se permite a TrustedInstaller.
3.4. Casos en los que LocalSystem es razonable
Es razonable, como excepción, cuando el servicio interactúa estrechamente con controladores de dispositivo, manipula la base de seguridad del sistema operativo o administra otras sesiones o servicios: en resumen, cuando el privilegio requerido ya supera de por sí lo equivalente a un administrador. Software como los agentes de copia de seguridad o los EDR entra en esta categoría. Aun en esos casos, vale la pena confirmar si realmente existe una ruta de código que use ese privilegio, y evaluar si el procesamiento que lo necesita se puede aislar (para el criterio de cuándo hace falta, vea «Cuándo se necesita el privilegio de administrador en Windows»).
4. LocalService y NetworkService — Cuentas integradas de privilegio mínimo
LocalService (NT AUTHORITY\LOCAL SERVICE, SID: S-1-5-19) y NetworkService (NT AUTHORITY\NETWORK SERVICE, SID: S-1-5-20) son cuentas integradas preparadas para servicios de bajo privilegio. Ambas tienen solo privilegios mínimos en el ámbito local, aproximadamente equivalentes a los de un miembro del grupo Users.51
La diferencia entre ambas es un solo punto: quién las ve desde el otro lado de la red.5
- LocalService: se conecta de forma remota con credenciales anónimas. No puede acceder a recursos que exijan autenticación.
- NetworkService: presenta de forma remota las credenciales del equipo (en un entorno de dominio, DOMAIN\nombre_del_equipo$).
El criterio de uso es: si “no sale a la red, o le da igual la identidad al salir”, use LocalService; si “quiere acceder a un recurso del dominio con la identidad de la máquina”, use NetworkService.
flowchart TB
accTitle: Diferencia entre LocalService y NetworkService
accDescr: Ambos tienen privilegios locales mínimos, pero frente a un recurso remoto LocalService se conecta con credenciales anónimas y NetworkService presenta las credenciales del equipo
ls["LocalService"] --> anon["Se conecta con credenciales anónimas"]
anon -.-> ng["No sirve para recursos que exigen autenticación"]
ns["NetworkService"] --> comp["Presenta las credenciales del equipo"]
comp -.-> pc["En un dominio se ve como PC$"]
Figura 6: Aunque el privilegio local sea el mismo mínimo en ambas, se diferencian en si la identidad vista desde la red es anónima o la cuenta de equipo.
Sin embargo, vistas desde una perspectiva moderna, estas dos cuentas tienen una debilidad: muchos servicios comparten la misma cuenta. Si hay cinco servicios ejecutándose con LocalService, mientras la ACL opere por cuenta, esos cinco pueden acceder entre sí a sus recursos. SQL Server tampoco admite la cuenta Local Service precisamente porque, al ser una cuenta compartida, no se puede separar de otros servicios.1
flowchart TB
accTitle: Una cuenta compartida no permite separación
accDescr: Cuando varios servicios comparten el mismo LocalService, mientras la ACL opere por cuenta, pueden acceder entre sí a sus recursos
sva["Servicio A"] --> acct["Mismo LocalService"]
svb["Servicio B"] --> acct
svc["Servicio C"] --> acct
acct --> mutual["Pueden acceder a los recursos mutuos"]
mutual -.-> reason["Porque la ACL opera por cuenta"]
Figura 7: Los servicios que comparten una misma cuenta no se pueden separar entre sí mediante la ACL.
Resolver este “quiero mantener el bajo privilegio, pero separado por servicio” es el papel de la cuenta virtual, que se ve a continuación.
5. Cuenta virtual (NT SERVICE\) — La solución moderna por defecto
5.1. Una identidad propia por servicio, sin contraseña
La cuenta virtual es una “cuenta local administrada” disponible desde Windows Server 2008 R2 / Windows 7. Tiene tres características.6
- La cuenta se administra automáticamente: no requiere crearla ni establecerle contraseña
- El nombre es
NT SERVICE\<nombre_del_servicio>, así que cada servicio obtiene una identidad propia - En un entorno de dominio, puede acceder a la red con las credenciales de la cuenta de equipo (DOMAIN\nombre_del_equipo$)
En otras palabras, conserva la ventaja de LocalService/NetworkService de “no requerir gestión de contraseñas” y, al mismo tiempo, resuelve la desventaja de “no poder separarse por compartir cuenta”. Que la instalación de SQL Server use por defecto una cuenta virtual como NT SERVICE\MSSQLSERVER obedece a esto.1
flowchart TB
accTitle: Lo que la cuenta virtual concilia
accDescr: La cuenta virtual conserva la ventaja de LocalService y NetworkService de no requerir gestión de contraseñas, resuelve la desventaja de no poder separarse por compartir cuenta, y da a cada servicio una identidad propia
merit["Ventaja(no requiere gestión de contraseñas)"] -->|Se conserva| va["Cuenta virtual"]
demerit["Desventaja(no se puede separar al compartirse)"] -->|Se resuelve| va
va --> ident["Identidad propia por servicio"]
va --> auto["No requiere creación ni contraseña"]
Figura 8: La cuenta virtual conserva las ventajas de las cuentas integradas y solo resuelve la desventaja de no poder separarse al compartirse.
5.2. Se puede escribir “NT SERVICE\nombre_del_servicio” directamente en la ACL
La comodidad práctica es que se puede agregar a la ACL nombrando explícitamente solo a ese servicio. Se puede lograr “solo este servicio puede escribir en esta carpeta de datos”, sin crear un grupo ni gestionar contraseñas.
# Cambia la cuenta de inicio de sesión del servicio a una cuenta virtual
# El valor de obj= es "NT SERVICE\nombre_del_servicio". No se especifica contraseña
sc.exe config MyAppService obj= "NT SERVICE\MyAppService"
# Verifica la configuración (comprueba SERVICE_START_NAME)
sc.exe qc MyAppService
# Otorga permiso de modificación de la carpeta de datos solo a este servicio
icacls "C:\ProgramData\MyApp" /grant "NT SERVICE\MyAppService:(OI)(CI)M"
Desde la GUI, en services.msc, vaya a las propiedades del servicio → pestaña “Iniciar sesión” → en “Cuenta” escriba NT SERVICE\nombre_del_servicio, y deje el campo de contraseña en blanco (es una particularidad del SCM que no se especifique contraseña para cuentas virtuales o MSA). El cambio surte efecto al reiniciar el servicio.
5.3. Limitación — fuera de la máquina no se distingue “qué servicio es”
La identidad de la cuenta virtual es local a la máquina y el dominio no la reconoce. Como se ve más adelante, en la red se reduce a la cuenta de equipo, así que el lado remoto no puede distinguir “de qué servicio se trata”, ni tampoco se puede compartir la misma identidad entre varios servidores.10
flowchart TB
accTitle: La identidad de la cuenta virtual se reduce fuera de la máquina
accDescr: Dentro de la máquina cada servicio tiene su propia cuenta virtual, pero en la red se reduce a la cuenta de equipo, y del lado remoto no se puede distinguir de qué servicio se trata
vaa["Cuenta virtual A"] --> pc["Cuenta de equipo PC$"]
vab["Cuenta virtual B"] --> pc
pc --> remote["Identidad vista desde el lado remoto"]
remote -.-> nodist["No se distingue de qué servicio se trata"]
Figura 9: Dentro de la máquina cada servicio tiene identidad propia, pero de cara a la red todos se ven como el mismo PC$.
Cuando esta limitación — necesitar una identidad propia del servicio de cara a la red, o necesitar la misma identidad en varios servidores — se vuelve un problema, entra en juego gMSA (capítulo 8).
6. La identidad al salir a la red — la práctica de la cuenta de equipo (PC$)
6.1. “El servicio no puede acceder a la carpeta compartida” es un malentendido
En una máquina unida al dominio, cuando un servicio que se ejecuta con LocalSystem, NetworkService o una cuenta virtual accede a un recurso remoto, se autentica como la cuenta de equipo (DOMAIN\nombre_del_equipo$).36 Muchas de las consultas del tipo “no podía acceder a la carpeta compartida, así que lo pasé a un usuario de dominio” mencionadas al inicio en realidad se resuelven con esto: la ACL del destino simplemente no permitía el PC$.
flowchart TB
accTitle: Acceso remoto como cuenta de equipo
accDescr: En una máquina unida al dominio, los servicios que usan LocalSystem, NetworkService o una cuenta virtual se autentican de forma remota como cuenta de equipo, y acceden si la ACL del destino permite PC$
svc["Servicio(LocalSystem, cuenta virtual, etc.)"] --> auth["Se autentica como PC$"]
auth --> acl{"¿La ACL del destino permite PC$?"}
acl -->|Sí| ok["Acceso concedido a la carpeta o la BD"]
acl -->|No| ng["Acceso denegado"]
Figura 10: En un entorno de dominio, basta con otorgar el PC$ en la ACL del destino para lograr acceso remoto sin usuario de dominio.
Otorgar el permiso en el lado del servidor de archivos es la misma operación de ACL de siempre: se indica el nombre de cuenta como nombre_del_equipo$ (en el cuadro de selección de objetos de la GUI, incluya “Equipos” en el tipo de objeto).
# Lado del servidor de archivos: otorga al servicio de APPSV01 permiso de modificación en la carpeta compartida
# Debe otorgarse tanto en los permisos de recurso compartido como en los permisos NTFS
Grant-SmbShareAccess -Name "AppData" -AccountName "CORP\APPSV01$" -AccessRight Change -Force
icacls "D:\Shares\AppData" /grant "CORP\APPSV01$:(OI)(CI)M"
De igual manera, en SQL Server, si crea la cuenta de equipo como inicio de sesión, la cadena de conexión pasa sin contraseña simplemente con Integrated Security=true.
-- Lado del servidor de base de datos: permite la autenticación integrada de Windows desde el servicio de APPSV01
CREATE LOGIN [CORP\APPSV01$] FROM WINDOWS;
6.2. Conozca los límites del método PC$
Este método tiene dos límites.
- La granularidad es por máquina. Los servicios que usan LocalSystem, NetworkService y todas las cuentas virtuales en la misma máquina se ven desde el exterior como el mismo PC$. No se puede otorgar “solo a este servicio” en el destino, ni se puede auditar qué servicio usó esa cuenta.2
- No funciona en un entorno de grupo de trabajo. La cuenta de equipo es un objeto de Active Directory, así que no existe en una máquina que no está unida al dominio. Hace falta un diseño que maneje explícitamente las credenciales de una cuenta en el destino.
Al querer superar el límite 1, la respuesta de 2026 no es pasar al usuario de dominio del siguiente capítulo, sino saltar directamente ese problema e ir a gMSA.
flowchart TB
accTitle: Los dos límites del método PC$
accDescr: La autenticación con PC$ tiene granularidad por máquina, sin permiso ni auditoría por servicio, y no funciona en un grupo de trabajo porque la cuenta de equipo no existe
pcs["Método PC$"] --> lim1["Límite 1(granularidad por máquina)"]
pcs --> lim2["Límite 2(no funciona en grupo de trabajo)"]
lim1 -.-> noaudit["Sin permiso ni auditoría por servicio"]
lim2 -.-> nocred["Hacia un diseño de credenciales explícitas"]
lim1 --> gmsa["Al querer superarlo, pasar a gMSA"]
Figura 11: Al querer superar los dos límites de granularidad por máquina y dependencia del dominio, la respuesta es saltar el usuario de dominio e ir directo a gMSA.
7. El problema de usar un usuario de dominio para un servicio
7.1. El problema estructural de la contraseña
Cuando se asigna un usuario de dominio (o un usuario local) a un servicio, el SCM guarda esa contraseña y la usa para iniciar sesión cada vez que arranca. Como el SCM no gestiona el vencimiento, cuando la contraseña vence, el inicio de sesión falla y el servicio deja de poder iniciarse.7
A partir de ahí comienza una espiral negativa muy común en el terreno.
- Ocurre un incidente: el servicio se detiene por vencimiento de la contraseña
- Como medida preventiva, se configura la contraseña “sin vencimiento”
- Sin un procedimiento de cambio bien establecido, la misma contraseña en texto plano se va escribiendo en los procedimientos, scripts y tareas del Programador de tareas de varios servidores
- Aunque haya bajas de personal, la contraseña no cambia (porque no se sabe qué se detendría si se cambia)
flowchart TB
accTitle: La espiral negativa de operar con usuarios de dominio
accDescr: El servicio se detiene al vencer la contraseña, se configura sin vencimiento como medida preventiva, la contraseña en texto plano se difunde por procedimientos y scripts, y aunque se vayan empleados ya no se puede cambiar
expire["1. Servicio detenido por vencimiento"] --> forever["2. Se configura sin vencimiento"]
forever --> spread["3. La contraseña en texto plano se difunde"]
spread -.-> where["Procedimientos, scripts y tareas"]
spread --> stuck["4. No se puede cambiar aunque haya bajas"]
Figura 12: A partir del incidente por vencimiento, la contraseña sin vencimiento y su difusión en texto plano terminan fijándose como norma.
Microsoft también señala que las configuraciones que usan una cuenta de dominio en un servicio requieren un esfuerzo operativo considerable en la gestión manual de la contraseña y del SPN, y que el mantenimiento puede provocar interrupciones del servicio.1
7.2. Kerberoasting — las cuentas de servicio son un objetivo
Hay otro ataque propio de las cuentas de servicio basadas en usuarios de dominio: el Kerberoasting. Un servicio que recibe autenticación Kerberos registra un SPN (nombre principal de servicio) en su cuenta de ejecución. Como cualquier usuario autenticado del dominio puede solicitar un vale de servicio para la cuenta que tiene el SPN registrado, el atacante obtiene ese vale e intenta descifrar la contraseña por fuerza bruta sin conexión. Una contraseña de entre 10 y 16 caracteres decidida por una persona no resiste este ataque.
flowchart TB
accTitle: El flujo del Kerberoasting
accDescr: Cualquier usuario autenticado del dominio puede solicitar un vale de servicio para una cuenta de servicio con SPN registrado, así que el atacante obtiene el vale e intenta un ataque de fuerza bruta sin conexión
atk["Usuario autenticado del dominio"] --> req["Solicita el vale dirigido al SPN"]
req --> tkt["Obtiene el vale de servicio"]
tkt --> brute["Fuerza bruta sin conexión"]
brute --> weak["Una contraseña de 10 a 16 caracteres se descifra"]
Figura 13: Cualquier usuario autenticado puede solicitar el vale, y una contraseña de la longitud que decide una persona no resiste la fuerza bruta sin conexión.
La medida realmente eficaz es hacer que la contraseña sea de una fortaleza que una persona no pueda adivinar ni descifrar. Microsoft también menciona forzar contraseñas largas y usar gMSA, cuya contraseña es un valor aleatorio largo generado por máquina.8 Cabe señalar que el mismo documento también menciona el blindaje de Kerberos (FAST), pero lo que protege FAST es la información de preautenticación y la resistencia a la suplantación del KDC; no impide que un usuario autenticado solicite un vale de servicio para el SPN, así que no sustituye a la fortaleza de la contraseña de la cuenta de servicio. La relación entre SPN y Kerberos, y las condiciones en las que la autenticación “cae” a NTLM, se explican en «NTLM y Kerberos explicados con diagramas».
7.3. Si aun así debe usar un usuario de dominio
Si por motivos como que la aplicación no admite gMSA no le queda otra opción que usar un usuario de dominio, aplique al menos las siguientes mitigaciones.
- Genere la contraseña de forma aleatoria con 25 caracteres o más, y no la escriba fuera de un gestor de contraseñas (ni en procedimientos, scripts o un Excel compartido)
- Use una cuenta dedicada exclusivamente al servicio y separada por servicio (no la comparta con la cuenta de una persona2)
- Deniegue el inicio de sesión interactivo y el Escritorio remoto, permitiendo solo “Iniciar sesión como servicio”
- Minimice los grupos a los que pertenece (agregarla a Domain Admins queda fuera de toda consideración)
- Establezca un procedimiento de rotación periódica y lleve un registro de dónde se propaga cada cambio
Migrar a gMSA es más seguro y más cómodo que hacer todo esto, como se ve en el siguiente capítulo.
8. gMSA — delegar la gestión de contraseñas en Active Directory
8.1. Mecanismo y efecto
gMSA (cuenta de servicio administrada de grupo) es una cuenta de dominio que delega la gestión de la contraseña al controlador de dominio. La contraseña la calcula el controlador de dominio a partir de la clave raíz del KDS (Servicio de distribución de claves), y solo los hosts autorizados pueden obtenerla.13
flowchart TB
accTitle: Mecanismo de gestión de contraseñas de gMSA
accDescr: El controlador de dominio calcula la contraseña a partir de la clave raíz de KDS, solo los hosts autorizados la obtienen para ejecutar el servicio, y de forma predeterminada rota automáticamente cada 30 días
kds["Clave raíz de KDS"] --> dc["El DC calcula la contraseña"]
dc --> host["Los hosts autorizados la obtienen"]
host --> svc["Se usa para ejecutar el servicio"]
dc -.-> rot["Rotación automática cada 30 días por defecto"]
Figura 14: El controlador de dominio se encarga de generar, distribuir y renovar la contraseña, de modo que las personas pueden operar sin conocerla.
El efecto es claro.9
- Contraseña aleatoria de 240 bytes: la fuerza bruta y los ataques de diccionario dejan de ser viables, y la resistencia al Kerberoasting mejora enormemente
- Rotación automática cada 30 días por defecto: no hace falta que una persona planifique el cambio ni que se detenga el servicio
- Se puede compartir la misma identidad entre varios servidores: incluso en una granja de servidores detrás de un balanceo de carga, se puede autenticar mutuamente con el mismo principal
- Simplifica la gestión de SPN: el registro y la gestión del SPN también se pueden delegar y simplificar
Las personas pueden operar sin conocer la contraseña — se entiende mejor si lo piensa como el mismo mecanismo que Windows LAPS aplica a la contraseña del administrador local, pero llevado a la cuenta de servicio.
8.2. Requisitos
gMSA tiene condiciones previas.10
- Debe existir un entorno de dominio de Active Directory (no funciona en un grupo de trabajo)
- El nivel funcional del dominio y del bosque debe ser Windows Server 2012 o superior
- La clave raíz de KDS debe estar ya creada
- El nombre del gMSA debe ser único en todo el bosque, no solo en el dominio
- El intervalo de cambio de contraseña solo se puede configurar en el momento de la creación
Crear la clave raíz de KDS es un trabajo único, pero tras crearla, no se puede crear ningún gMSA durante un máximo de 10 horas, mientras se espera la réplica a todos los controladores de dominio. Es un mecanismo de seguridad para evitar que la obtención de la contraseña falle antes de que termine la réplica.14
flowchart TB
accTitle: De la creación de la clave raíz de KDS a la creación del gMSA
accDescr: Tras crear la clave raíz de KDS hay que esperar hasta 10 horas a que se replique en todos los controladores de dominio, y solo después de completarse la réplica se puede crear el gMSA
add["Crear la clave raíz de KDS"] --> wait["Espera de hasta 10 horas de réplica"]
wait -.-> why["Salvaguarda contra fallos de obtención"]
wait --> done["Réplica completa en todos los DC"]
done --> ok["Ya se puede crear el gMSA"]
Figura 15: Tras crear la clave raíz, las hasta 10 horas de espera evitan un fallo de obtención mientras la réplica aún no ha terminado.
# Ejecutar como administrador de dominio, en un controlador de dominio (o en un
# equipo de administración con el módulo de PowerShell de AD instalado)
# Comprueba si existe la clave raíz de KDS y, si no, la crea (solo una vez por bosque)
Get-KdsRootKey
Add-KdsRootKey -EffectiveImmediately # Estará realmente disponible hasta 10 horas después
8.3. Procedimiento, de la creación a la configuración
El procedimiento tiene cuatro etapas: “① crear el grupo autorizado a obtenerla → ② crear el gMSA → ③ instalarlo en cada servidor → ④ configurarlo en el servicio”.10
flowchart TB
accTitle: Las cuatro etapas para implantar gMSA
accDescr: Se implanta en cuatro etapas: crear el grupo que autoriza la obtención de la contraseña, crear el gMSA, instalarlo en cada servidor y configurarlo como cuenta de ejecución del servicio
st1["① Crear el grupo autorizado a obtenerla"] --> st2["② Crear el gMSA"]
st1 -.-> add["Agregar el PC$ del servidor"]
st2 --> st3["③ Instalar en cada servidor"]
st3 -.-> test["Verificar la obtención con Test"]
st3 --> st4["④ Configurar en el servicio"]
Figura 16: Desde la creación del grupo hasta la configuración del servicio, la implantación de gMSA avanza en cuatro etapas.
# ① Crea el grupo de seguridad que autoriza la obtención de la contraseña
# y agrega las cuentas de equipo de los servidores que ejecutarán el servicio
New-ADGroup -Name "GG-SvcBatchHosts" -GroupScope Global
Add-ADGroupMember -Identity "GG-SvcBatchHosts" -Members "APPSV01$", "APPSV02$"
# La pertenencia al grupo se evalúa al iniciar sesión el equipo, así que
# conviene reiniciar los servidores afectados después de agregarlos
# ② Crea el gMSA
New-ADServiceAccount -Name "svc-batch" `
-DNSHostName "svc-batch.corp.example.com" `
-PrincipalsAllowedToRetrieveManagedPassword "GG-SvcBatchHosts"
# ③ En cada servidor que ejecutará el servicio, instala y verifica el gMSA
Install-ADServiceAccount -Identity "svc-batch"
Test-ADServiceAccount -Identity "svc-batch" # Si devuelve True, la obtención funciona
# ④ Configúralo como cuenta de ejecución del servicio. Agrega $ al final del nombre y no especifiques contraseña
sc.exe config MyBatchService obj= "CORP\svc-batch$"
Restart-Service MyBatchService
Si lo configura desde services.msc, indique también el nombre de cuenta con $ al final, por ejemplo CORP\svc-batch$, y deje el campo de contraseña en blanco. Las cuentas de tipo MSA no se pueden usar para inicio de sesión interactivo.1 Después, basta con otorgar CORP\svc-batch$ en la ACL de la carpeta compartida o de SQL Server, en lugar del PC$, para completar el acceso de red con la identidad propia del servicio, sin contraseña.
8.4. Hay aplicaciones que no son compatibles
Como advertencia, no todo el software funciona con gMSA. Los servicios de Windows, los grupos de aplicaciones de IIS y las tareas del Programador de tareas —todo lo que configura la identidad de inicio de sesión mediante el mecanismo estándar— son ampliamente compatibles, pero hay restricciones, como que la conmutación por error (failover clustering) en sí no admite gMSA, y las aplicaciones que exigen contraseña internamente no se pueden usar.10 Microsoft también deja explícito que hay que confirmar el funcionamiento con gMSA en un entorno de prueba antes de llevarlo a producción.9
flowchart TB
accTitle: Cómo determinar si una aplicación admite gMSA
accDescr: Las aplicaciones que configuran la identidad de inicio de sesión con el mecanismo estándar suelen admitir gMSA, pero no sirve para la conmutación por error ni para apps que exigen contraseña internamente, y conviene verificarlo en un entorno de prueba antes de producción
app["Aplicación que quiere usar"] --> how{"¿Cómo configura el inicio de sesión?"}
how -->|Mecanismo estándar| okapp["Admite gMSA"]
okapp -.-> ex1["Servicios, IIS, tareas, etc."]
how -->|Exige contraseña| ngapp["No admite gMSA"]
ngapp -.-> ex2["Clúster de conmutación por error, etc."]
okapp --> test["Verificar en prueba antes de producción"]
Figura 17: Las aplicaciones que configuran el inicio de sesión con el mecanismo estándar suelen ser compatibles, pero también hay casos no compatibles, por lo que la verificación previa a producción es indispensable.
También existen dos parientes: sMSA (cuenta de servicio administrada independiente, para un solo servidor) y dMSA (cuenta de servicio administrada delegada, introducida en Windows Server 2025, que se vincula a la identificación del dispositivo para resistir el robo de credenciales). Al armar algo nuevo, considere gMSA como base y evalúe estas otras según los requisitos.6
9. Diseño asociado — derecho de inicio de sesión, perfil, DPAPI y auditoría
Hay otros cuatro puntos ligados a la cuenta que cambian y que conviene tener presentes.
9.1. El derecho “Iniciar sesión como servicio” (SeServiceLogonRight)
Para iniciarse como servicio, la cuenta necesita el derecho de usuario “Iniciar sesión como servicio”. LocalSystem, LocalService y NetworkService lo tienen de forma integrada, pero cualquier otra cuenta (usuario de dominio, gMSA, etc.) necesita que se le asigne explícitamente.15
Si lo configura desde la pestaña “Iniciar sesión” de la GUI de services.msc, el complemento otorga este derecho automáticamente. En cambio, CreateService/ChangeServiceConfig (la API que invoca sc.exe config) no verifica si la cuenta indicada tiene ese derecho. Esta es la causa típica de que un servicio configurado por script se detenga al iniciar con “Error al iniciar sesión”. No confíe en el efecto secundario de una herramienta: incluya explícitamente en el procedimiento de despliegue agregar la cuenta a “Iniciar sesión como servicio” en la directiva de seguridad local (secpol.msc), o configurarlo mediante GPO/Intune (tenga en cuenta también que, en un entorno donde este derecho se configura por directiva de grupo, el otorgamiento local se sobrescribe al aplicarse la directiva). A la inversa, es habitual configurar también “Denegar el inicio de sesión local” en las cuentas dedicadas a servicios.
flowchart TB
accTitle: Diferencia según la vía de configuración del derecho "Iniciar sesión como servicio"
accDescr: La GUI de services.msc otorga el derecho automáticamente, pero la API que invoca sc.exe config no lo verifica, así que una cuenta sin el derecho hace que el servicio se detenga por fallo de inicio de sesión
gui["Configurado con services.msc"] --> auto["Otorga el derecho automáticamente"]
auto --> okgui["El servicio puede iniciarse"]
cli["Configurado con sc.exe config"] --> noval["No verifica el derecho"]
noval --> has{"¿Tiene el derecho?"}
has -->|Sí| okcli["El servicio puede iniciarse"]
has -->|No| stop["Se detiene por fallo de inicio de sesión"]
stop -.-> fix["Otorgarlo explícitamente con secpol.msc o GPO"]
Figura 18: La GUI otorga el derecho automáticamente, pero la configuración por script no lo verifica, por lo que hay que incluir el otorgamiento explícito en el procedimiento.
9.2. El perfil, %TEMP% y HKEY_CURRENT_USER cambian
El SCM carga el perfil de usuario de la cuenta al iniciar el servicio.7 Es decir, el contenido real de %TEMP%, %APPDATA% y HKEY_CURRENT_USER es distinto para cada cuenta de ejecución, y al cambiar de cuenta, la configuración o la caché que se guardaba en el perfil de la cuenta anterior parece haber “desaparecido”.
La mitigación de diseño es sencilla: colocar los datos del servicio en una ruta explícita, como C:\ProgramData\<nombre_de_la_app>, en lugar de bajo el perfil, y otorgar la ACL de esa ruta a la cuenta de ejecución. Así, cambiar de cuenta deja de requerir migrar datos.
flowchart TB
accTitle: Cómo mitigar la dependencia del perfil en la ubicación de los datos
accDescr: El perfil real es distinto para cada cuenta de ejecución, así que al cambiar de cuenta los datos del perfil anterior parecen haber desaparecido, pero si los datos se colocan en una ruta explícita y se otorga la ACL a la cuenta, la migración deja de ser necesaria
sw["Cambio de cuenta de ejecución"] --> newprof["Se carga otro perfil"]
newprof --> lost["Los datos anteriores parecen desaparecer"]
lost -.->|Mitigación| fix["Colocar los datos bajo ProgramData"]
fix --> acl["Otorgar la ACL a la cuenta de ejecución"]
acl --> nomig["Ya no hace falta migrar al cambiar de cuenta"]
Figura 19: Si evita el perfil y coloca los datos en una ruta explícita con su ACL otorgada, el cambio de cuenta deja de implicar una migración de datos.
9.3. Los datos protegidos con DPAPI comparten destino con la cuenta
Un punto que se pasa por alto con más frecuencia es DPAPI. Los datos cifrados con DPAPI de ámbito de usuario (CryptProtectData o ProtectedData de .NET) en principio solo se pueden descifrar con la misma cuenta que los protegió. En el instante en que se cambia de cuenta, deja de poder leerse la cadena de conexión o la clave de API guardadas — es DPAPI haciendo bien su trabajo, pero se convierte en un incidente si no está en el procedimiento de migración.
flowchart TB
accTitle: Relación entre los datos protegidos con DPAPI y el cambio de cuenta
accDescr: Los datos protegidos con DPAPI de ámbito de usuario solo se pueden descifrar con la misma cuenta que los protegió, así que al cambiar la cuenta de ejecución hay que volver a introducir los secretos
protect["Protección con DPAPI en la cuenta anterior"] --> data["Cadena de conexión protegida, etc."]
data --> who{"¿Con qué cuenta se descifra?"}
who -->|Misma cuenta anterior| okdec["Se puede descifrar"]
who -->|Cuenta nueva| ngdec["No se puede descifrar"]
ngdec --> re["Volver a introducir el secreto"]
Figura 20: Los datos protegidos con DPAPI comparten destino con la cuenta que los protegió, y tras un cambio de cuenta hay que volver a introducirlos.
La solución es incluir en el plan de migración el paso de “volver a introducir los secretos después de cambiar de cuenta” (para el diseño de dónde guardarlos, vea «Almacenamiento de información confidencial en aplicaciones de Windows»). Cabe señalar que, si adopta una configuración que se resuelve con autenticación integrada de Windows mediante gMSA o PC$, puede eliminar por completo la necesidad de guardar el secreto. Antes de decidir “dónde guardarlo”, el orden correcto es evaluar “si hace falta guardarlo”.
Además, cuando un servicio necesita realizar un procesamiento “con los privilegios del usuario que lo invocó”, la solución no es fortalecer la cuenta, sino usar la suplantación (impersonation). Para esto, consulte «Cómo manejar correctamente los tokens de suplantación en Windows».
9.4. Auditoría — observe el tipo de inicio de sesión 5 del evento 4624
El inicio de un servicio se registra en el registro de eventos de seguridad como el evento ID 4624 (se inició sesión correctamente en una cuenta) con tipo de inicio de sesión 5 (Service: el SCM inició el servicio). El campo “Cuenta virtual” del evento indica si el inicio de sesión fue de una MSA o cuenta virtual, por lo que también sirve para supervisar el uso de cuentas administradas.11
flowchart TB
accTitle: El flujo de auditoría del inicio de un servicio
accDescr: El inicio de un servicio por el SCM se registra como el evento 4624 con tipo de inicio de sesión 5, y el campo de cuenta virtual permite identificar si el inicio de sesión fue con una cuenta administrada
start["El SCM inicia el servicio"] --> ev["Se registra el evento ID 4624"]
ev --> type5["Tipo de inicio de sesión 5(Service)"]
type5 --> vafield["Campo de cuenta virtual"]
vafield --> watch["Supervisión de cuentas administradas"]
Figura 21: El inicio de un servicio se registra como el 4624 con tipo de inicio de sesión 5, y hasta permite rastrear el uso de cuentas administradas.
Para el inventario actual, lo más rápido es agregar las cuentas de ejecución de la lista de servicios.
# Agrupa qué servicios se ejecutan con qué cuenta
Get-CimInstance Win32_Service |
Group-Object StartName |
Sort-Object Count -Descending |
Select-Object Count, Name
# Identifica los servicios no estándar que se ejecutan con LocalSystem (distínguelos por la ruta: propios o de terceros)
Get-CimInstance Win32_Service |
Where-Object { $_.StartName -eq 'LocalSystem' -and $_.PathName -notlike '*\Windows\*' } |
Select-Object Name, DisplayName, PathName
Si en esta salida aparecen “servicios de negocio con LocalSystem” o “servicios con usuario de dominio”, es el momento de aplicar el flujo de decisión del siguiente capítulo.
10. Flujo de decisión — decida con cuatro preguntas
Resumamos todo lo anterior como un procedimiento de selección. Responda en orden a estas cuatro preguntas.
flowchart TB
accTitle: Flujo de decisión de la cuenta de ejecución
accDescr: Se decide la cuenta de ejecución respondiendo en orden a cuatro preguntas: si hay acceso a la red, si hay unión al dominio, si basta con la identidad por máquina y si la aplicación admite gMSA
q1{"¿Se conecta a otra máquina con autenticación Windows?"} -->|No| va["Cuenta virtual"]
va -.-> sys["Si requiere privilegios, LocalSystem"]
q1 -->|Sí| q2{"¿Unida al dominio?"}
q2 -->|No| cred["Proteger y guardar las credenciales"]
q2 -->|Sí| q3{"¿Basta la identidad por máquina?"}
q3 -->|Sí| pcacl["Cuenta virtual + permiso a PC$"]
q3 -->|No| q4{"¿La app admite gMSA?"}
q4 -->|Sí| gmsa["gMSA"]
q4 -->|No| du["Usuario dedicado + mitigaciones"]
Figura 22: Respondiendo en orden a las cuatro preguntas, se determina cuál de las seis opciones usar.
Pregunta 1: ¿El servicio accede con autenticación Windows a otra máquina de la red (carpeta compartida, base de datos, API, etc.)?
Si no accede, la solución por defecto es la cuenta virtual. Solo si se necesita un privilegio local especial, evalúe LocalSystem tras confirmar esa necesidad.
Pregunta 2: (Si accede) ¿la máquina está unida al dominio?
En un grupo de trabajo no se puede usar ni PC$ ni gMSA. Diseñe un manejo explícito de las credenciales de la cuenta del destino (protegiendo su almacenamiento con, por ejemplo, DPAPI), o evalúe unirse al dominio.
Pregunta 3: (En caso de dominio) ¿basta con la identidad por máquina (PC$)?
Si basta, se completa con la cuenta virtual (o NetworkService) + otorgar PC$ en la ACL del destino. Si necesita una identidad propia del servicio, o la misma identidad en varios servidores, pase a la pregunta 4.
Pregunta 4: ¿la aplicación admite gMSA?
Si es compatible (el SCM, los grupos de aplicaciones de IIS, el Programador de tareas y, en general, todo lo que configura el inicio de sesión con el mecanismo estándar lo es), use gMSA. No olvide verificar el funcionamiento en un entorno de prueba. Si definitivamente no es compatible, aplique todas las mitigaciones de la sección 7.3 y use un usuario de dominio dedicado.
En forma de tabla queda así:
| Situación | Recomendación | Notas |
|---|---|---|
| Se completa localmente, privilegio normal | Cuenta virtual | Otorgue la ACL a NT SERVICE\<nombre> |
| Se completa localmente, requiere privilegio superior a administrador | LocalSystem | Verifique primero la necesidad de ese privilegio |
| Procesamiento local que no necesita identidad en red | LocalService | Aceptable para mantener el estado actual de un servicio existente |
| Accede a un recurso del dominio con la identidad de la máquina | Cuenta virtual (o NetworkService) | Otorgue PC$ en la ACL del destino |
| Accede a un recurso del dominio con la identidad propia del servicio | gMSA | Clave raíz de KDS + verificación de compatibilidad |
| Misma identidad en varios servidores (balanceo de carga, etc.) | gMSA | No es posible con la cuenta virtual |
| App no compatible con gMSA + necesita identidad propia | Usuario de dominio dedicado | Las mitigaciones de la sección 7.3 son obligatorias |
| Grupo de trabajo + necesita acceso remoto | Guardar credenciales explícitas de forma protegida | Evalúe también revisar el diseño |
11. Resumen
- La cuenta de ejecución de un servicio es una decisión de diseño que fija a la vez el privilegio local, la identidad en red y la gestión de la contraseña. No la deje en su valor predeterminado (LocalSystem).
- LocalSystem tiene el token de SYSTEM+Administrators y privilegios potentes, así que el daño al comprometerlo se maximiza. La mayoría de los servicios de negocio no necesita ese privilegio.
- LocalService y NetworkService son ambos de bajo privilegio; la diferencia es la identidad en red (anónima o cuenta de equipo). Sin embargo, comparten la cuenta entre varios servicios, así que no permiten separación.
- La cuenta virtual (NT SERVICE\
) es la solución moderna por defecto: permite separación por servicio sin necesidad de gestionar contraseñas. Se puede indicar directamente en la ACL, y la configuración se limita a cambiar el nombre de la cuenta de inicio de sesión. - LocalSystem, NetworkService y la cuenta virtual salen a la red como DOMAIN\PC$ en un entorno de dominio. Otorgar PC$ en la ACL de la carpeta compartida o de SQL Server permite prescindir del usuario de dominio en muchos casos.
- Usar un usuario de dominio en un servicio arrastra problemas estructurales: interrupciones por vencimiento, difusión de contraseñas en texto plano y Kerberoasting. Si lo usa, son obligatorios una cuenta dedicada, una contraseña larga y aleatoria, y restricciones de inicio de sesión.
- gMSA es un mecanismo en el que AD genera y rota automáticamente la contraseña; sus requisitos son el dominio, nivel funcional 2012 o superior, y la clave raíz de KDS. En el servicio se configura “DOMAIN\nombre$” con el campo de contraseña vacío.
- Al cambiar de cuenta, incluya en el procedimiento de migración el derecho “Iniciar sesión como servicio”, el traslado del perfil y de %TEMP%, y la reintroducción de los datos protegidos con DPAPI. La auditoría se puede confirmar con el evento ID 4624 de tipo de inicio de sesión 5.
La próxima vez que instale un servicio, deténgase un momento en la pantalla de configuración de inicio de sesión y pregúntese: ¿como quién debería ejecutarse este servicio, y hasta dónde debería poder acceder? La respuesta debería estar en alguna fila de la tabla de decisión de este artículo.
Artículos relacionados
- Cómo crear y operar servicios de Windows — del Programador de tareas a convertir un BackgroundService en servicio
- Cuándo se necesita el privilegio de administrador en Windows - UAC, áreas protegidas y cómo distinguirlo en el diseño
- Cómo manejar correctamente los tokens de suplantación en Windows — préstamo de privilegios por hilo y cómo revertirlo de forma segura
- NTLM y Kerberos explicados con diagramas — por qué la autenticación “cae” a NTLM
- Guía práctica de Windows LAPS — cómo dejar de usar la misma contraseña de administrador local en todos los PC
- Almacenamiento de información confidencial en aplicaciones de Windows - cómo evitar configuraciones en texto plano con DPAPI
Áreas de consultoría relacionadas
KomuraSoft LLC atiende el diseño de la cuenta de ejecución y la reducción de privilegios de servicios de Windows y aplicaciones residentes, la migración a cuentas virtuales y gMSA de servicios existentes construidos sobre la base de LocalSystem, y la investigación de fallos de acceso denegado, DPAPI o de perfil derivados de un cambio de cuenta. Puede empezar desde la etapa de “me lo señalaron en una auditoría, pero no sé por dónde empezar”.
- Desarrollo de aplicaciones de Windows
- Investigación de fallos y análisis de causas
- Consultoría técnica y revisión de diseño
- Contacto
Referencias
-
Microsoft Learn, Configure Windows service accounts and permissions. Sobre que la cuenta de servicio predeterminada de SQL Server es una cuenta virtual (como NT SERVICE\MSSQLSERVER), que al indicar una cuenta virtual o MSA se deja el campo de contraseña vacío, que las MSA tienen el nombre terminado en $ y no se pueden usar para inicio de sesión interactivo, que Local Service es una cuenta compartida que no se puede separar y por eso SQL Server no la admite, que usar una cuenta de dominio implica esfuerzo de gestión manual de contraseña y SPN, con mantenimiento que puede provocar interrupciones del servicio, y que siempre conviene ejecutar el servicio con la cuenta de privilegio mínimo. ↩ ↩2 ↩3 ↩4 ↩5 ↩6
-
Microsoft Learn, Securing on-premises service accounts. Sobre el orden de prioridad para servicios locales (primero gMSA, si no se puede sMSA, luego la cuenta de equipo y por último la cuenta de usuario), que al usar una cuenta de equipo no se puede determinar qué servicio la usa ni auditar los cambios, y sobre el papel de la cuenta de servicio (identificación, autenticación e inicio del servicio). ↩ ↩2 ↩3
-
Microsoft Learn, LocalSystem Account. Sobre que LocalSystem tiene privilegios amplios en el equipo local, que su token incluye los SID de NT AUTHORITY\SYSTEM y BUILTIN\Administrators, que no tiene contraseña, que presenta las credenciales del equipo ante un servidor remoto, la lista de privilegios que incluye SE_DEBUG_NAME y SE_TCB_NAME, y que la mayoría de los servicios no necesita este nivel de privilegio y debería considerar LocalService/NetworkService. ↩ ↩2 ↩3 ↩4 ↩5 ↩6
-
Microsoft Learn, sc.exe config. Sobre que la cuenta de ejecución del servicio se indica con el parámetro obj=, que su valor predeterminado es LocalSystem, y sobre el parámetro password= al usar una cuenta de usuario distinta de LocalSystem. ↩ ↩2
-
Microsoft Learn, Local accounts. Sobre que SYSTEM (S-1-5-18) tiene control total por defecto en un volumen NTFS, que NETWORK SERVICE (S-1-5-20) presenta las credenciales del equipo ante un servidor remoto, y que LOCAL SERVICE (S-1-5-19) tiene privilegios mínimos en local y presenta credenciales anónimas ante la red. ↩ ↩2 ↩3 ↩4
-
Microsoft Learn, Service accounts. Sobre que la cuenta virtual es una cuenta local administrada automáticamente que no requiere gestión de contraseña, que su nombre tiene el formato NT SERVICE<SERVICENAME>, que en un entorno de dominio accede a la red con las credenciales de la cuenta de equipo (
\ ↩ ↩2 ↩3 ↩4$), y sobre los criterios de uso entre sMSA, gMSA, dMSA y la cuenta virtual. -
Microsoft Learn, Service User Accounts. Sobre que los servicios se ejecutan en el contexto de seguridad de una cuenta de usuario, que el SCM inicia sesión con la cuenta al arrancar y asocia el token de acceso al proceso del servicio, que el SCM carga el perfil de usuario, y que el SCM no gestiona el vencimiento de la contraseña, por lo que al vencer falla el inicio de sesión y el servicio no arranca. ↩ ↩2 ↩3 ↩4 ↩5
-
Microsoft Learn, Protect SMB traffic from interception. Sobre gMSA como medida de protección de la cuenta de servicio (que la contraseña aleatoria larga generada por máquina hace inviable descifrarla por fuerza bruta o diccionario), la exigencia de contraseñas largas, y la mención al blindaje de Kerberos (FAST), entre otras recomendaciones. ↩ ↩2
-
Microsoft Learn, Secure group managed service accounts. Sobre que la contraseña de gMSA es un valor aleatorio de 240 bytes difícil de atacar por fuerza bruta o diccionario, que el sistema operativo Windows la cambia cada 30 días sin que un administrador tenga que planificar el cambio ni detener el servicio, la simplificación del despliegue en granjas de servidores y de la gestión de SPN, que si un servicio no admite gMSA se debe usar sMSA, y si eso tampoco es posible, una cuenta de usuario estándar con una gestión de contraseñas sólida, y que conviene confirmar el funcionamiento con gMSA en un entorno de prueba antes de producción. ↩ ↩2 ↩3
-
Microsoft Learn, Manage group Managed Service Accounts. Sobre los requisitos previos de gMSA (nivel funcional de dominio/bosque 2012 o superior, creación de la clave raíz de KDS), que el nombre del gMSA debe ser único en todo el bosque, que el intervalo de cambio de contraseña solo se puede configurar en la creación, que -PrincipalsAllowedToRetrieveManagedPassword de New-ADServiceAccount indica el grupo autorizado a obtener la contraseña, el procedimiento de Install-ADServiceAccount/Test-ADServiceAccount, que la identidad de la cuenta virtual es local a la máquina y el dominio no la reconoce, que la conmutación por error no admite gMSA, y que el SCM, los grupos de aplicaciones de IIS y el Programador de tareas admiten configurar el inicio de sesión con gMSA. ↩ ↩2 ↩3 ↩4 ↩5
-
Microsoft Learn, 4624(S): An account was successfully logged on. Sobre que el evento 4624 se registra en el equipo de acceso al crearse una sesión de inicio de sesión, que el tipo de inicio de sesión 5 significa Service (el SCM inició un servicio), y que el campo “Virtual Account” permite identificar el inicio de sesión de una MSA o cuenta virtual, útil para supervisar cuentas de servicio administradas. ↩ ↩2
-
Microsoft Learn, About Windows Resource Protection. Sobre que la Protección de recursos de Windows (WRP) evita el reemplazo de archivos, carpetas y claves de registro críticos del sistema, que el acceso total a los recursos protegidos por WRP está limitado a TrustedInstaller, que las modificaciones solo se pueden hacer a través de un mecanismo de reemplazo admitido mediante el servicio Instalador de módulos de Windows, y que las aplicaciones que intentan modificar un recurso protegido reciben acceso denegado. ↩
-
Microsoft Learn, Group Managed Service Accounts overview. Sobre que gMSA es una cuenta de dominio que delega la gestión de la contraseña a Windows, que el controlador de dominio calcula la contraseña a partir del secreto compartido del Servicio de distribución de claves (kdssvc.dll) y los hosts miembro la consultan al controlador de dominio para obtener la contraseña actual y la anterior, y que permite la autenticación mutua con el mismo principal en una granja de servidores. ↩
-
Microsoft Learn, Create a Key Distribution Service (KDS) root key. Sobre que el controlador de dominio necesita la clave raíz para empezar a generar contraseñas de gMSA, el procedimiento de creación con Add-KdsRootKey -EffectiveImmediately, que tras la creación no se puede crear ningún gMSA durante un máximo de 10 horas mientras se espera a que converja la réplica de AD, y que la obtención de la contraseña puede fallar si la réplica está incompleta. ↩
-
Microsoft Learn, Policy CSP - UserRights: LogOnAsService. Sobre que el derecho “Iniciar sesión como servicio” permite a una entidad de seguridad iniciar sesión como servicio, que Local System, Local Service y Network Service lo tienen de forma integrada, que las demás cuentas que ejecutan un servicio necesitan que se les asigne este derecho, y la ruta de configuración por directiva de grupo. ↩
Artículos relacionados
Artículos recientes con las mismas etiquetas para profundizar en temas cercanos.
Guía práctica de Windows LAPS — abandone la contraseña de administrador local común a todos los PC
La contraseña de administrador local común permite que un PC comprometido exponga a todos a Pass-the-Hash. Cubrimos la rotación automátic...
Firma SMB y enlace de canal LDAP — cerrar en la práctica «la otra mitad» de las medidas contra NTLM
Mientras se elimina NTLM, la firma SMB y la firma/enlace de canal LDAP evitan que un ataque de relay tenga éxito. Repasamos valores prede...
NTLM y Kerberos explicados con diagramas — por qué la autenticación «cae» a NTLM
Comparamos NTLM y Kerberos con diagramas: desafío/respuesta, tickets, cuándo Negotiate cae a NTLM, y por qué funcionan la retransmisión y...
¿Se detendrán las aplicaciones empresariales por la baja de NTLM? — Cómo recopilar el registro de auditoría y el orden para eliminar las dependencias
Guía práctica para localizar dónde dependen de NTLM su entorno Windows y sus aplicaciones: políticas de auditoría, eventos 8001-8004, pat...
El apagado de Windows visto desde la aplicación ── cómo sobrevivir correctamente a la notificación de cierre, el reinicio y el corte de energía
Un reinicio nocturno de Windows Update corrompió datos de medición: ese accidente se evita con buen diseño. Explicamos, con fuentes ofici...
Temas relacionados
Estas páginas sitúan el tema en un contexto más amplio de servicios y decisiones.
Temas técnicos de Windows
Portal sobre desarrollo de Windows, investigación de fallos y aprovechamiento de activos existentes.
Servicios relacionados con este tema
El artículo está directamente relacionado con los siguientes servicios.
Desarrollo de aplicaciones para Windows
Aplicaciones empresariales, integración de dispositivos y herramientas de comunicación, de los requisitos al desarrollo.
Preguntas frecuentes
Preguntas habituales en las consultas sobre el tema del artículo.
- ¿Debo cambiar de inmediato un servicio que por ahora funciona con LocalSystem?
- No siempre es correcto cambiarlo de inmediato y de forma uniforme. Primero compruebe si ese servicio realmente necesita privilegios locales equivalentes a LocalSystem (privilegios fuertes que superan a los de un administrador). Si solo necesita leer y escribir archivos y comunicarse por red, la primera opción es migrarlo a una cuenta virtual (NT SERVICE\nombre_del_servicio). Durante la migración, confirme el otorgamiento de permisos a las carpetas o claves de registro necesarias, cómo se manejan los datos que dependen del perfil o de DPAPI, y si cuenta con el derecho "Iniciar sesión como servicio". Verifique el inicio y las funciones principales en un entorno de prueba antes de aplicar el cambio en producción.
- ¿Debo elegir la cuenta virtual o NetworkService?
- Si va a elegir una cuenta nueva, se recomienda la cuenta virtual. Ambas se ven en la red como la cuenta de equipo (DOMAIN\nombre_del_equipo$) y también se parecen en tener privilegios locales reducidos. Sin embargo, NetworkService es compartida por varios servicios, por lo que en la ACL no se puede lograr "autorizar solo a este servicio". La cuenta virtual tiene una identidad propia por servicio y se puede indicar directamente NT SERVICE\nombre_del_servicio en la ACL. Productos recientes de Microsoft, como SQL Server, también usan la cuenta virtual como valor predeterminado.
- ¿Se puede usar gMSA en un entorno de grupo de trabajo (sin dominio)?
- No se puede usar. gMSA es un mecanismo en el que el controlador de dominio de Active Directory genera y gestiona la contraseña, y presupone la existencia de un dominio y de la clave raíz de KDS. En un entorno de grupo de trabajo, lo básico es completar el procesamiento local con una cuenta virtual o con LocalService/NetworkService. Si se necesita acceder a otra máquina, hay que recurrir a otro diseño, como usar explícitamente las credenciales de una cuenta preparada en el destino. El acceso de red como cuenta de equipo (PC$) también solo funciona en un entorno de dominio.
- Al cambiar la cuenta de ejecución del servicio, ya no puedo leer la configuración ni las credenciales que tenía guardadas. ¿Por qué?
- Porque cada cuenta de ejecución tiene asociado su propio perfil de usuario, %TEMP%, HKEY_CURRENT_USER y claves DPAPI. En particular, los datos protegidos con DPAPI de ámbito de usuario (CryptProtectData, etc.) en principio solo se pueden descifrar con la misma cuenta que los protegió. Además, los archivos guardados bajo el perfil (AppData, etc.) quedan en otra ruta desde la cuenta nueva. Antes de cambiar de cuenta, planifique el procedimiento para volver a generar los datos protegidos con DPAPI (por ejemplo, reintroducir claves de API) y la migración de los archivos del perfil.
- Si solo quiero que el servicio acceda a una carpeta compartida, ¿necesito un usuario de dominio?
- En la mayoría de los casos no es necesario. En un entorno de dominio, los servicios que se ejecutan con LocalSystem, NetworkService o una cuenta virtual se autentican de forma remota como cuenta de equipo (DOMAIN\nombre_del_equipo$). Basta con agregar ese PC$ a los permisos de recurso compartido y a los permisos NTFS de la carpeta compartida para leer y escribir. Si necesita controlar el acceso con la identidad propia del servicio, o si varios servidores necesitan la misma identidad, considere gMSA en lugar de un usuario de dominio.
Perfil del autor
Página de presentación del autor del artículo.
Go Komura
Representante de KomuraSoft LLC
Especializado en desarrollo de software para Windows, consultoría técnica e investigación de fallos, sobre todo en proyectos con sistemas existentes y errores difíciles de reproducir.