
Creé un servicio de ventana que monitorea archivos en un directorio específico en nuestro sistema operativo Windows. Cuando se detecta un archivo, el servicio realiza alguna E/S de archivos, los lee, crea subdirectorios, etc. Este servicio también utiliza la conectividad de la base de datos para conectarse a otro servidor. Mi plan es ejecutar el servicio como la cuenta predeterminada de "Servicio local". Como necesito permitir privilegios de escritura/lectura, lo que aparentemente la cuenta "Servicio local" no hace de forma predeterminada, voy a establecer explícitamente privilegios de "Control total" para la cuenta "Servicio local" en la carpeta que estoy lectura/escritura hacia y desde.
Creo que lo anterior es bueno. Mi pregunta es, para la carpeta en la que estoy leyendo y escribiendo, ¿necesito configurar una función de "Servicio de red" con acceso de control total? Me pregunto, dado que mi servicio utiliza conectividad de base de datos con otro servidor, necesitaré configurar la cuenta "Servicio de red".
Puede que no entienda bien lo que hace la cuenta "Servicio de red".
Respuesta1
ElNT AUTHORITY\NetworkService
cuentasolo es necesario cuando se comunica con otras computadoras en un dominio que necesitan las credenciales de su máquina para el control de acceso. No es necesario para un simple acceso a Internet/red. Sólo es necesario para propósitos específicos en un dominio de Active Directory.
También todo el punto de laNT AUTHORITY\LocalService
cuentaes que tiene privilegios mínimos en el sistema. Darle más privilegios disminuye la seguridad de muchos servicios en su sistema diseñados para ejecutarse en el nivel de privilegio bajo para el que fue diseñado. Si su servicio requiere privilegios superiores a esos, debe crear una nueva cuenta con los privilegios necesarios y configurar esa cuenta en elAccederpestaña de las propiedades del servicio. (Esto también se puede hacer mediante programación).
También puedes ejecutarlo usando elNT AUTORITY\LocalSystem
cuenta, que tiene acceso ilimitado a su sistema, pero supongo que deseaba utilizar la LocalService
cuenta por la mayor seguridad que proporciona.
Respuesta2
Las otras respuestas confirman lo que dice sobre el uso del Servicio Local. En resumen, el Servicio local es la cuenta recomendada para usar con su servicio, a menos que necesite las funciones SSPI adicionales de Active Directory del Servicio de red.
Sin embargo, para restringir el acceso de lectura/escritura a una carpeta específica, puede hacerlo mejor que simplemente dar acceso a la cuenta genérica del Servicio Local. El problema, como otros han señalado, es que esto también daría acceso de lectura/escritura a todos los demás servicios que se ejecutan como Servicio Local y si todos los servicios hicieran esto, gradualmente el Servicio Local recibiría acceso a recursos cada vez más importantes.
La solución es, en cambio, aplicar ACL a su carpeta utilizando su SID de servicio específico. Sólo su propio proceso de servicio tiene su SID de servicio asociado, por lo que esto bloquea aún más su recurso. Puede ver el SID del servicio usando sc showsid <service name>
. El SID del servicio se genera a partir del nombre del servicio, por lo que será el mismo en todas las máquinas.
Para habilitar el uso del SID del servicio por parte de su servicio, utilícelo ChangeServiceConfig2
con elSERVICE_SID_INFO
estructura a configurar SERVICE_SID_TYPE_UNRESTRICTED
. También puede configurar SERVICE_SID_TYPE_RESTRICTED
para obtener un SID aún más restringido que solo permita acceso de escritura a los recursos permitidos explícitamente con su SID de servicio.
Este enlace tiene descripciones de alto nivel de los SID de servicio y los SID de servicio restringidos: https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2008-R2-and-2008/hh125927(v=ws.10)
Respuesta3
La respuesta anterior no parecía abordar las preguntas directamente, así que pensé en agregar algo más.
- Mi plan es ejecutar el servicio como la cuenta predeterminada de "Servicio local". Voy a establecer explícitamente privilegios de "Control total" para la cuenta de "Servicio local" en la carpeta desde y hacia la que estoy leyendo/escribiendo. Creo que lo anterior es un buen plan.
Personalmente, no veo un gran problema con este plan. Con los BUILTIN, la elección es entre:
- Se ejecuta como LOCALSYSTEM, por lo que si este servicio se ve comprometido, el atacante es propietarioTodo, y inmediatamente.
- Se ejecuta como LOCALSERVICE, por lo que si este servicio, o cualquiera de los muchos otros servicios que se ejecutan bajo esta cuenta, se ve comprometido, el atacante tiene acceso a un directorio adicional.*
Podría decirse que es preferible agregar algunas ACL adicionales para poder usar la segunda opción. Sí, la opción más segura para un servicio con pocos privilegios pero muy sensible a la seguridad sería ejecutarlo con una cuenta de servicio personalizada y de bajos privilegios. Pero a menos que desee crear una nueva cuenta/administrar contraseñas para cada servicio que implemente, usar LocalService para tareas menores no confidenciales no es algo tan terrible. Sólo necesita tomar una decisión responsable basada en estas consideraciones, como qué hay en ese directorio o esa base de datos, el impacto si se violan, etc.
Aunque nuevamente, según el principio de privilegio mínimo, solo debe establecerlo Full Control
si Modify
realmente no es suficiente.
2. Mi pregunta es, para la carpeta en la que estoy leyendo y escribiendo, ¿necesito configurar una función de "Servicio de red" con acceso de control total? Me pregunto, dado que mi servicio utiliza conectividad de base de datos con otro servidor, necesitaré configurar la cuenta "Servicio de red".
Si su base de datos requiere inicio de sesión integrado de Windows/SSPI, entonces sí, necesitará usar NetworkService (o una cuenta de servicio de dominio) en todas partes, es decir, RunA y permisos de directorio. Suponiendo que también le haya otorgado acceso a esta base de datos a su nombre de computadora $ o cuenta de dominio. Dudo que esté haciendo eso, por lo que si utiliza autenticación de nombre de usuario/contraseña normal, debería poder hacer todo con LocalService. Debe otorgar solo derechos a una cuenta en ese directorio, cualquiera que use en sus RunA, no ambos.
3. Es posible que no entienda bien lo que hace la cuenta "Servicio de red".
Servicio local/Servicio de redSon cuentas casi idénticas en la computadora local. La diferencia principalmente es lo que pueden hacer en la red. NS puede acceder a algunos recursos de la red porque aparece en la red como una cuenta real (de computadora). Pero LS aparecerá como ANÓNIMO, por lo que se le negará casi todo lo que haya en la red.
Por cierto, deberías utilizar una tarea programada para esto, no un servicio.
*A partir de Vista, debido aaislamiento del servicio, un proceso LocalService comprometido no puede atacar fácilmente a otro. Cada proceso/instancia de servicio LocalService/NetworkService obtiene su propio SID de sesión de inicio de sesión (propietario único), a diferencia de Windows 2003. Pero no estoy seguro de que esto sea perfecto y mitigue por completo la vulnerabilidad DACL en archivos y recursos. SID restringidos y tokens de escritura restringidase mencionan en este contexto.