it-swarm-es.com

En Windows, cómo restringir el acceso a una carpeta, subcarpeta y archivos solo a algunas aplicaciones (no a los usuarios)

Tenemos una aplicación que no es por usuario y puede ser utilizada por varios usuarios simultáneamente. Los datos también son compartidos por todos los usuarios.
La ruta a las carpetas de datos que usamos es ProgramData\OurAppName\Data (posterior a Vista), y le damos control total a todos los usuarios, para que nuestra aplicación ejecutada por ellos pueda realizar cambios en los archivos de la carpeta Data.

Ahora el problema con esto es que ahora cualquier otra aplicación (malware/virus) también puede modificar archivos, es decir, se puede realizar un ataque en los archivos de datos de nuestra aplicación. Nuestras aplicaciones son una aplicación de escritorio Win32.

¿Existe alguna forma en la que podamos restringir el acceso a la carpeta de datos solo a nuestras aplicaciones?

3
Abhishek Jain

Las aplicaciones en los sistemas operativos Windows se ejecutan en el contexto del usuario que las ejecuta y, por lo tanto, heredan el ACL de ese usuario.

Cuando se mira de forma abstracta, su programa no hace más que Word (winword.exe) o Excel (Excel.exe) con archivos .doc o .xls. No debería necesitar restringir el acceso a los datos solo a la aplicación, sin embargo, se produce una reducción de riesgos:

  • limitar los usuarios que tienen acceso a los datos (ACL, también conocidos como permisos de archivo, idealmente a través de un grupo)
  • limitar las operaciones que puede realizar un usuario (p. ej., instalación de aplicaciones para prevenir malware)
  • lista blanca de aplicaciones
  • protección anti-malware
  • auditoría de la integridad de los datos
1
idarryl

En Unix, le sugiero que ejecute esa aplicación como un usuario o grupo en particular y limite los permisos en esa carpeta al usuario y al grupo.

Puede hacer lo mismo en Windows, pero no tan fácilmente. Si conoce a todos los usuarios que ejecutarán la aplicación, ¿puede agregarlos a un grupo en particular y luego darle al grupo control total sobre ese archivo?

0
TimC

Android essentials lo hace al instalar aplicaciones. A cada aplicación se le asigna un grupo y solo ese grupo puede acceder a los datos de la aplicación. En un sistema basado en Unix, esto es bastante sencillo de implementar. Windows se vuelve un poco más difícil.


Listas de control de acceso

Lo que puede hacer es crear una Lista de control de acceso discrecional (DACL) personalizada para su aplicación. Estos se pueden convertir en Descriptores de seguridad que se pueden usar con funciones como CreateDirectory . La DACL contendrá toda la información sobre quién puede acceder a la carpeta. En este caso, probablemente desee crear un grupo de Windows para la aplicación.

Cuando crea su directorio, puede restringir el acceso a la DACL que crea. Cuando su aplicación se ejecuta/necesita acceder al directorio, adquiere la DACL y la usa en llamadas posteriores al sistema. Estos no son los objetos de Windows más fáciles del mundo para trabajar, pero hacen lo que quieres.

Más de lo que probablemente desee saber sobre los descriptores de seguridad y el control de acceso de Windows.

Más sobre la creación de DACL


Creación de usuarios

Puede crear un Perfil de usuario en Vista +. Más que un poco complicado porque Windows no fue diseñado para esto. Hacerse pasar por un usuario que ha iniciado sesión requiere algún tipo de token de acceso para el usuario que está intentando utilizar. Hay múltiples funciones que devolverían tal token:

BOOL WINAPI ImpersonateLoggedOnUser(
  _In_  HANDLE hToken
);

hToken [en]

Identificador de un token de acceso principal o de suplantación que representa a un usuario que inició sesión. Esto puede ser un identificador de token devuelto por una llamada a LogonUser , CreateRestrictedToken , DuplicateToken , DuplicateTokenEx , Funciones OpenProcessToken o OpenThreadToken . Si hToken es un identificador de un token principal, el token debe tener TOKEN_QUERY y TOKEN_DUPLICATE acceso. Si hToken es un identificador de un token de suplantación, el token debe tener TOKEN_QUERY y TOKEN_IMPERSONATE acceso.

LogonUser requiere una contraseña. Probablemente no desee codificar uno en su aplicación. DuplicateToken solo genera tokens de suplantación, que no se pueden usar con CreateProcessAsUser (que es nuestro objetivo final). Ahora nos quedamos con un montón de funciones que requieren un token existente para duplicar y comenzar. Eso significa que te queda el token del usuario actual, que no es lo que quieres.

La creación de tokens está prácticamente fuera de discusión. Esa operación a menudo solo la realiza LSASS, y no me sorprendería si todo este comportamiento fuera marcado por Anti-virus. En Windows, este enfoque probablemente sea una mala idea y no vale la pena la cantidad de aros en llamas que tendría que atravesar para que funcione.

0
RoraΖ