miércoles, 22 de julio de 2015

Receta C# No. 5-22: Cómo Manipular la Lista de Control de Acceso (ACL) de un Archivo o Directorio

Índice

0. Introducción
1. Problema
2. Solución
3. Discusión de la Solución
3.1 ¿Qué es una Lista de Control de Acceso (ACL)?
3.2 Método GetAccessControl
3.3 Clase FileSecurity
3.4 Clase DirectorySecurity
4. Práctica: Código C#
5. Conclusiones
6. Glosario
7. Literatura & Enlaces

0. Introducción

Nueva receta C# en la que aprenderemos a modificar la lista de control de acceso (o Access Control List) de un archivo o directorio. Describiremos varios de los elementos de programa disponibles para llevar a cabo esta tarea, como son: GetAccessSecurity, SetAccessSecurity, FileSecurity, y DirectorySecurity. Además, definiremos el concepto una Access Control List (ACL) en el ámbito de un sistema de archivos. ¡Empecemos!

1. Problema

Se nos ha pedido modificar la lista de control de acceso (ACL) de un archivo o directorio en uno de los equipos de acceso restringido.

2. Solución

Las clases System.IO.File y System.IO.Directory permiten obtener y establecer los permisos de una lista de control de acceso por medio de los métodos GetAccessControl y SetAccessControl, respectivamente.

3. Discusión de la Solución

3.1 ¿Qué es una Lista de Control de Acceso (ACL)?

Una Lista de Control de Acceso en lo que se refiere a un sistema de archivos, consiste en una lista de permisos de un objeto (e.g., archivo, directorio). Los permisos especifican los usuarios y procesos que tienen autorización para acceder a un determinado objeto. Además de los permisos, se especifican cuáles operaciones están permitidas sobre ese objeto.

Una ejemplo podría ser:

Objeto1:ACL{
John: Lectura; Escritura
Edward: Lectura
}

Esta pseudo-estructura nos está diciendo que el usuario John tiene acceso de Lectura más Escritura sobre el objeto Objeto1; mientras tanto, el usuario Edward tiene únicamente el permiso de Lectura.

3.2 Método GetAccessControl

El método GetAccessControl de las clases File [2] y Directory [3] retorna la lista de control de acceso (ACL) de un archivo o directorio, respectivamente. Ambas ediciones de este método ofrecen versiones sobrecargadas.
Método File.GetAccessControl
Figura 1. Método sobrecargado File.GetAccessControl [2].
Método sobrecargado Directory.GetAccessControl
Figura 2. Método sobrecargado Directory.GetAccessControl [3].

3.3 Clase FileSecurity

La clase FileSecurity [4] (namespace System.Security.AccessControl) representa el control de acceso a un archivo. Este control de acceso es establecido por un conjunto de reglas. Al mismo tiempo, cada regla es representada por un objeto de la clase FileSystemAccessRule [5]. (Nota: Una regla es análoga a una entrada de un control de acceso (ACE [6]), es decir el registro o entrada en la estructura de datos que representa la lista de control de acceso.)

3.4 Clase DirectorySecurity

La clase DirectorySecurity [7] (namespace System.Security.AccessControl) representa el control de acceso a un directorio.

4. Práctica: Código C#

Escribamos una aplicación consola en C# para demostrar la manipulación de la ACL de un archivo. Específicamente llevaremos a cabo las siguientes operaciones:
  • Creación de un archivo temporal, 
  • Denegación de acceso al archivo a todos los usuarios, y 
  • Intento de acceso al archivo.
Con la invocación de Path.GetRandomFileName (línea 23) creamos un nombre de archivo aleatorio (Receta C# No. 5-21: Cómo Obtener un Nombre de Archivo Aleatorio). Se crea un archivo con el nombre recién generado en la línea 25.


En la invocación del método EstablecerRegla (línea 34) ocurren las siguientes operaciones en su cuerpo de declaración:
  • Línea 65: Se obtiene un objeto FileSecurity a partir del archivo referenciado con rutaArchivo.
  • Línea 68: Agregar el permiso al archivo rutaArchivo para la cuenta "Todos".
  • Línea 72: Establece la nueva regla para el archivo pasado como argumento con el método File.SetAccessControl.
En el bloque try/catch (líneas 42-54) se intenta crear un archivo con el mismo nombre asignado a la variable nombreArchivo. Esto ocasionará que se generé una excepción.

Compilación: 

  1. csc /target:exe AccesoArchivo.cs

Ejecución assembly

  1. .\AccesoArchivo.exe

> Prueba de ejecución: 
Ejecución assembly AccesoArchivo.exe
Figura 3. Ejecución assembly AccesoArchivo.exe.
En la Figura 3 se muestra resaltado el mensaje de excepción. Este mensaje se debe al intento de alterar el archivo 32ej20wp.jgl.

5. Conclusiones

Ha quedado demostrado que es posible asignar permisos de acceso a un archivo por medio de la manipulación de la lista de control de acceso (ACL). Este tipo de controles son necesarios cuando queremos restringir el acceso a lectura, escritura a un archivo o directorio; por ejemplo, archivos o directorios de trabajo de un usuario o una aplicación.


En la próxima receta C# haremos algo interesante: compresión de datos.

6. Glosario

  • .NET
  • ACE
  • ACL
  • Archivo
  • Control de acceso
  • Cuenta
  • Lista de control de acceso
  • Restricción
  • Usuario

7. Literatura & Enlaces

[1]: Visual C# 2010 Recipes by Allen Jones and Adam Freeman. Copyright 2010 Allen Jones and Adam Freeman, 978-1-4302-2525-6.
[2]: File.GetAccessControl Method (System.IO) - https://msdn.microsoft.com/en-us/library/System.IO.File.GetAccessControl(v=vs.110).aspx
[3]: Directory.GetAccessControl Method (System.IO) - https://msdn.microsoft.com/en-us/library/System.IO.Directory.GetAccessControl(v=vs.110).aspx
[4]: FileSecurity Class (System.Security.AccessControl) - https://msdn.microsoft.com/en-us/library/system.security.accesscontrol.filesecurity(v=vs.110).aspx
[5]: FileSystemAccessRule Class (System.Security.AccessControl) - https://msdn.microsoft.com/en-us/library/system.security.accesscontrol.filesystemaccessrule(v=vs.110).aspx
[6]: Access Control Entries (Windows) - https://msdn.microsoft.com/en-us/library/windows/desktop/aa374868(v=vs.85).aspx
[7]: DirectorySecurity Class (System.Security.AccessControl) - https://msdn.microsoft.com/en-us/library/system.security.accesscontrol.directorysecurity(v=vs.110).aspx
[8]: Receta C# No. 5-21: Cómo Obtener un Nombre de Archivo Aleatorio - http://ortizol.blogspot.com/2015/07/receta-csharp-no-5-21-como-obtener-un-nombre-de-archivo-aleatorio.html


V

2 comentarios:

  1. el programa lee y edita los permisos de un archivo, cierto?
    Entonces, para eso el programa debe de tener permisos especiales no?
    pordrias explicar un poco, el tema de los permisos del programa
    para manipular recursos.

    excelente receta!
    saludos de lima!

    ResponderEliminar
  2. Sí, el programa debe seguir las políticas de seguridad del sistema operacional. La receta aplica para políticas respecto a los archivos de programa o de usuario.

    Saludos desde Bogotá.

    ResponderEliminar

Envíe sus comentarios, dudas, sugerencias, críticas. Gracias.